Superglobals / öffentliche IP des Routers

Hallo zusammen,

wie komm ich denn an die Superglobals in php ran? Z.b. IP des Servers, Docukent root, etc…

Habe folgendes ohne Erfolg getestet:

$ip = getenv(‚REMOTE_ADDR‘);
echo $ip;

oder

$ip = $_SERVER[‚REMOTE_ADDR‘];
echo $ip;

Ich wollte damit die Internet-Adresse des Routers ermitteln - ist das überhaupt der korrekte Ansatz?

Hallo,

keine Ahnung, ob die Frage nach 6 Tagen noch gilt?

Aber fragst Du google, gibt es Antwort …

  1. Ergebnis:
    Google

seit 2007 funktioniert (zumindest aktuell bei mir mit 172.16.x.x als interne IP)

$line = file_get_contents('http://www.wieistmeineip.de');
$AA = explode('<h1 class="ip">', $line);
if (isset($AA[1])) {
    $line = $AA[1];
    $AA = explode('</h1>', $line);
    $IPnr = $AA[0];
}

echo $IPnr;

Klar, das funktioniert nur solange, bis wieistmeinip.de ihre erste Überschrift ändert, aber wenn es seit 2007 funktioniert …

Gruß,

ernie

okay, noch mal eine Antwort von mir …

Wenn Du auf wieistmeineip.de verzichten willst, kannst Du in einem PHP Script auf einem Webspace deiner Wahl folgendes Script hochladen:

if (isSet($_SERVER))
   {
    if (isSet($_SERVER["HTTP_X_FORWARDED_FOR"]))
       {
        $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
       }
    elseif
       (isSet($_SERVER["HTTP_CLIENT_IP"]))
       {
        $realip = $_SERVER["HTTP_CLIENT_IP"];
       }
    else
       {
        $realip = $_SERVER["REMOTE_ADDR"];
       }
   }
else
   {
     if ( getenv( 'HTTP_X_FORWARDED_FOR' ) )
        {
          $realip = getenv( 'HTTP_X_FORWARDED_FOR' );
        }
     elseif
        ( getenv( 'HTTP_CLIENT_IP' ) )
        {
          $realip = getenv( 'HTTP_CLIENT_IP' );
        }
     else
        {
          $realip = getenv( 'REMOTE_ADDR' );
        }
   }

echo $realip;

Wenn Du dass dann aufrufst, ist der Inhalt ausschließlich deine eigene aktuelle IP-Adresse als String …

Viel Spaß

Hallo Ernie,

erstmal vielen Dank für die beiden Antworten. Ich hatte ja gehofft dass man das ohne wieistmeineip.de (daran hatte ich nämlich auch schon gedacht) oder extern gehostete scripte hinbekommt. Googeln hat mich dann auf die php-superglobal (‚REMOTE_ADDR‘) gebracht, das wäre eigentlich die einfachste Lösung. Aber der Aufruf der Superglobals bringt bei mir Fehler und ich bin kein php-Experte… :frowning:

Nun ja, vielleicht mach ich es dann über wieistmeineip.de, das scheint mir die einfachste Lösung zu sein. Ganz herzlichen Dank für das Script dafür!!! :rolleyes:

Naja, wie Du in meinem zweiten Script erkennen kannst, liest dieses genau diese aus … (zumindest, wenn alle vorherigen Mechanismen versagen)

‚REMOTE_ADDR‘ funktioniert aber logischerweise auf keinem lokalen Webserver. Diese Variable wird in php nur initialisiert, wenn es auch wirklich eine REMOTE ADRESSE gibt. Ruft Du dein IPS aber von einem Client im lokalen Netz auf, bekommt das I-Net, dein Router und deine öffentliche IP davon NULL komma NICHTS mit …

Also kann auch diese SUPERGLOBAL Variable nicht vorhanden sein ==> deshalb bekommst Du den Fehler.

Wenn ich das zweite Script auf meinem IPS lokal ausführe, bekomme ich verständlicherweise:

Notice:  Undefined index: REMOTE_ADDR in [allgemeineScript\helloWorld.ips.php] on line 15

In diesem Moment existiert keine REMOTE_ADDR bzw. diese ist 127.0.0.1. Aber definitiv nicht die externe IP deines Routers.

Ohne, dass es dich weiter bringt … Wenn Du deinen IPS von außen erreichbar machst über ein Port-Forwarding und dann das zweite Script von außerhalb aufrust, sollte meines Erachtens die externe IP Adresse des Clients herauskommen, mit dem Du gerade den IPS ansprichst.

Aber all das hat wenig mit PHP, sondern mehr mit Netzwerk Topologie zu tun. Ohne nach außen zu gehen, wird die öffentliche IP ja nicht genutzt.

Die einzige Chance, die IP herauszubekommen, ohne wirklich nach außen gegangen zu sein liegt darin, Sie vom Router zu erfahren. Für Fritz!Boxen zum Beispiel gibt es soweit ich weiß eine Status-Seite, die man eventuell sogar ohne Einloggen am Router aufrufen kann.

Da einen WWW-Reader von IPS drauf losgelassen und Du weißt die IP ohne ein Packet nach außen zu senden. Aber der Aufwand, dass für deinen eigenen Router zu stricken ist doch irgendwie ziemlich hoch …

Aber warum willst Du die IP unbedingt herausbekommen, ohne sie von außen zu erfahren. Es gibt doch nur zwei Möglichkeiten:
1. Du bist online ==> Du kannst die IP bei wieistmeineip.de oder mit dem 2. Script auf deiner eigenen Homepage erfahren
2. Du bist NICHT online ==> Der Aufruf nach außen wird fehlschlagen und Du kannst daraus schließen, dass Du nicht online bist …

Ich hoffe, es einigermaßen verständlich erklärt zu haben :confused:

Hallo Ernie,

erstmal danke für’s ausführliche Erklären, dann macht die Fehlermeldung auch Sinn… Warum ich die IP brauch? Nunja, wenn IPS online wäre, ich aber nicht zu Hause bin, dann nützt mir wieistmeineip.de ja nix. Ich glaube aber, am einfachsten richte ich mir da wohl einen dyndns Dienst ein, das scheint letztendlich das Komfortabelste zu sein. Die Fritzbox kann die dynamische IP scheinbar sogar beim dyndns-Dienst aktualisieren, damit sollte das Konstrukt ja auch recht ausfallsicher sein.

Nochmals herzlichen Dank für die Unterstützung! :slight_smile:

Das macht auf jeden Fall den meisten Sinn. Ich benutze DynDns oder NoIP.com seit Jahren äußerst zuverlässig privat und bei Kunden. U.a. auch für VPN Zugriff. Das ist kinderleicht im Router einzurichten und läuft äußerst stabil und zuverlässig.

Gruß,

ernie

Hallo Smokey, Ernie,

meine Lösung funktioniert wie folgt:

1.ISP startet jede Stunde ein Script das die Router WAN IP Adresse ermittelt.
diese IP Adresse wird in einer Variable abgelegt.

  1. IPS Startet per FTP einen upload zu meiner Domäne im Internet
    es wird eine HTML Datei hochgeladen die eine Weiterleitung auf die WAN IP Adresse des Router macht.

Diese ist dann wie folgt erreichbar http : //www.meineDomäne.de/zuhause

Klappt seit ca 3-4 Monaten und eine iPhone sehr stabil. Man kann es verfeinern wenn man noch einwenig herum/ drumrum programmiert.
Wie zum Beispiel das nur bei Änderung der WAN-IP der Upload startet.
Das wichtigste ist wenn man es benötigt… sollte der Zugang nicht Funktionieren muss man eine Stunde warten… wegen Punkt 1…

Ach ja das Script kann ich erst in ein paar Tagen posten, wenn es gebraucht wird, bin nicht daheim.

Gruß Detlef

Hallo Detlef,

das Skript würde mich schon mal interessieren, inbes. mit welchem Befehl du die WAN IP rausbekommst!

Dann komm gut nach Hause!

Hallo Smokey,

die Datei auf meiner Domäne sieht wie folgt aus (sie heist „offline.php“)

<?
$ipadresse ="$REMOTE_ADDR";
echo "$ipadresse";
?>

Wenn diese Web-Seite aufgerufen wird zeigt sie die WAN Adresse den „Aufrufenden“ an. Dies macht jede Stunde IPS und ermittelt damit die WAN Adresse meines Internet Providers.
Mit dem „$MeineIP“ aus dem Anfang des 2. Scriptes kann nun daraus eine Variable generiert werden, die WAN Adresse. Nun startet IPS das Script zwei jede Stunde, baut eine FTP Verbindung zu meiner Domäne auf. Inhalt ist ein File welches eine Umleitung auf die WAN Adresse macht. (siehe auch im Script)

Hier das 2. Script das IPS jede Stunde startet:

<?

//Für den FTP Server eine Upload funktion um die weiterleitung per https:// durchzuführen
// Diese Variablen bitte ändern
$ftp_server = "www.MeineDömäne.de";
$benutzername = "Name-ist";
$passwort = "Passwort-ist";
// >> jetzt nicht mehr ändern

// Bei dem Aufruf dieser URL wir die IP übergeben an $MeineIP
$inhalt = file_get_contents("http://www.MeineDomäne.de/home/offline.php");
$MeineIP = substr($inhalt,3,16);

// Das HTML File wir erzeugt um die Weiterleitung zu aktivieren
$IndexFile = "<html><head><title>Homeautomation
Weiterleitung</title><meta content='5; URL=http://$MeineIP:443'
 http-equiv='refresh'><meta name='viewport'
 content='width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;'><meta
 name='apple-touch-fullscreen' content='yes'><meta
 name='apple-mobile-web-app-capable' content='yes'><meta
 name='apple-mobile-web-app-status-bar-style' content='black'><link
 rel='apple-touch-icon-precomposed'
 href='ifront-apple-touch-icon-ipad.png'><link
 rel='apple-touch-startup-image' href='ifront-startup-ipad.png'><link
 rel='icon' type='image/x-icon' href='favicon.ico'>
</head><body
 style='background-image: url(ifront-startup.png); color: rgb(255, 255, 255); background-color: rgb(0, 0, 0);'
 link='#cccccc'><center><table
 style='text-align: left; width: 317px; height: 120px;'
 border='0' cellpadding='0' cellspacing='0'><caption
 style='caption-side: bottom;'></caption><tbody><tr
 style='font-family: Arial;' align='center'>
 <div style='font-family: Arial;' align='center'><a
 href='http://www.MeineDomäne.de/'>Weiterleitung in 5 Sekunden ....</a>
<br></div></td></tr><tr align='center'><td
 style='font-family: Arial;'>Die Server
IP Adresse ist: $MeineIP<br></td><br></tr>
</tbody></table><br></center></body></html>";





//Das wird in die Datei $lokale_datei geschrieben und für FTP upload vorbereitet
$lokale_datei = "$IndexFile";

// Die Verbindung herstellen
$connection_id = ftp_connect($ftp_server);

// Mit Benutzername und Kennwort anmelden
$login_result = ftp_login($connection_id, $benutzername, $passwort);

// überprüfen ob alles gutgegangen ist
if ((!$connection_id) || (!$login_result)) {
  echo "<H1>Ftp-Verbindung nicht hergestellt!<H1>";
  echo "<P>Verbindung mit ftp_server als Benutzer $benutzername nicht möglich!</P>";
  die;
} else {
  echo "<P>Verbunden mit ftp_server als Benutzer $benutzername</P>";
}

// Name der Datei auf dem Host Webserver
	$verbindung = fopen("d://index.php", "w");
	fwrite($verbindung, $lokale_datei);
	fclose($verbindung);
	usleep(500);
	$zieldatei = 'index.php';
	$DateiInhalt = "d:/index.php";
	
// Hochladen der Datei
$upload = ftp_put($connection_id, $zieldatei, $DateiInhalt, FTP_BINARY);

// Upload-Status überprüfen
if (!$upload) {
  echo "<P>Ftp upload war fehlerhaft!</P>";
} else {
  echo "<P>Datei $lokale_datei auf $ftp_server als $zieldatei geschrieben</P>";
}

// Schließen der Verbindung
ftp_quit($connection_id);

?>

Ach ja, ich habe eine 2. Webserver Instanz angelegt die dann Passwortgeschütz ist und auf den Port 443 gelegt ist „HTTPS“.

Hoffe das ich nichts vergessen habe, na Du musst dann noch die die Daten ändern, Benutzername, Passwort und den Domänennamen evtl. den Port auch noch.

Gruß Detlef

am einfachsten geht es hiermit, sofern eine dyndns oder vergleichbare Adresse vorhanden ist. :wink:

echo shell_exec("tracert adresse");
$string = shell_exec("tracert adresse");
$string = explode(" ", $string);
$IP = substr($string[3], 1, strlen($string[3])-2);
echo $IP;

:confused:

Hallo Rainer,
das ist für mich zu hoch … stehe auf dem Schlauch… :confused:
Wenn ich mit einem DynDNS Account mich selbst, nee, steh auf dem Schlauch

Gruß Detlef

Was ist da zu hoch. Mach ein Script und trag es ein und führ es aus.

Hallo Rainer,

einfach genial!!! Funktioniert super und ich bin begeistert über diese einfache Lösung!

Vielen Dank!!! :loveips:

Hallo Rainer,

bin von der falsche Seite aus herangegangen,
ja, jetzt habe ich die Funktion auch begriffen

Danke Gruß Detlef

wem der Dyn Dienst ab und zu mal einen Strich durch die Rechnung macht und eine Fritzbox sein eigen nennt, kann dieses Script verwenden.

Damit ist man dann unabhängig von irgendwelchen Diensten.

Getestet mit FB 7270 letzte Firmware.

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxxx';

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
curl_close($ch);
$session_status_simplexml = simplexml_load_string($login);


if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
   $login = array('getpage' => $fritzseite, 'login:command/response' => $response);
   $sendlogin = http_post_fields($fritzgui, $login);
   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

$home = file("http://fritz.box/home/home.lua?sid=".$SID);
preg_match('((?:\d{1,3}\.){3}\d{1,3})i', strip_tags($home[401]), $ip);
SetValue(12345, $ip[0]);
?>

Hallo Rainer,
super, danke, funktioniert.

Hast du noch eine Idee bezüglich Trigger?

Ich würde gern jede mir zugewiesen WAN IP dokumentieren. Somit wäre eine zeitliche Abfrage nicht ganz so zuverlässig.

Über den 1012er Port wird ja leider nichts ausgegeben :(.

Hallo Ralf,

das wird so nicht gehen ohne Abfrage, da die Box ja nichts sendet.

Was mir jetzt auf die schnelle einfallen würde, wäre einen Ping auf die aktuelle IP zusetzen, alle 5 min. oder so, wenn nicht erreichbar, dann die Box neu abfragen.

Könnte dann in etwa so aussehen.

<?
$wanIP = GetValue(16596 /*[Fritzbox\IP-Adressen\Fritzbox]*/);

$result = shell_exec("ping ".$wanIP);
preg_match('(Empfangen = [0-4])i', $result, $ping);
if($ping[0] == "Empfangen = 0")
{
    IPS_RunScript(12345); //Fritzbox IP holen
}
?>

Danke, meine Idee sah genauso aus :).

Leider besteht ein ziemliches Risiko, dass die IP bereits neu vergeben wurde. Ich habe zum Testen mehrmals getrennt, nach einiger Wartezeit war die IP wieder erreichbar, aber ich hatte eine andere.

Ich werde wohl das Fritz.Box-Script einfach zyklisch laufen lassen und die Änderung der WAN-IP-Variablen dokumentieren. Dann würden mir nur IPs verloren gehen, die ich eher kurz hatte.

Hallo Ralf,

Leider besteht ein ziemliches Risiko, dass die IP bereits neu vergeben wurde.

das ist richtig, lässt sich wohl auch nicht vermeiden.

Ich weiss ja nicht was Du mit den IP-Adressen machst, man könnt aber zur Not den Log der Box auslesen, da stehen ja die Adressen nach einem Reconnect oder Zwangstrennung drinnen.