Wie öffentliche IP-Adresse vom Heimnetzwerk herausfinden wenn der DynDNS-Hostname nicht funktioniert?

Genau diese Frage habe ich mir heute gestellt. Offensichtlich gibt es bei DynDNS technische Probleme oder Limitierungen bei den begehrten Free-Accounts, die es einem beispielsweise ermöglichen, auf einfache Art und Weise auf das Netzwerk zuhause zuzugreifen ohne täglich IPs zu notieren.

Ich verwende einen solchen DynDNS-Hostname, um mich täglich ab und an daheim einzuwählen um auf meine Nagios-Instanz zuzugreifen. Die letzten Wochen und Monate habe ich regelmäßig das Problem, dass mein DynDNS-Hostname nicht auf die aktuelle IP-Adresse gelinkt wird. Das ist natürlich unschön, da mein VPN-Login mit dem DynDNS-Hostname vorgenommen wird. In einem solchen Fall kann ich mich also nicht einloggen, da mich der Hostname ins Timeout-Nirvana führt.

Hierfür habe ich jetzt eine schicke Lösung - benötigt wird lediglich ein Webserver im Internet und ein aktiver Host im Heimnetzwerk, auf dem man 2 kleine PHP-Skripte und ein temporäres Lockfile anlegt. Heutzutage kein Problem, einen öffentlichen Webspace haben die meisten ohnehin. Das Prinzip ist folgendes:

  • Tritt der DynDNS Hostname-Fehler auf, wird Skript 1 (ip.php) aufgerufen, welches ein temporäres Lockfile anlegt (dem entsprechenden Zielordner müssen vorher Schreibrechte eingeräumt worden sein)
  • Der aktive Host im Heimnetzwerk prüft periodisch mittels Skript 2 (ip_request.php) ob ein Lockfile vorhanden ist
  • Ist ein Lockfile vorhanden wird mittels PHP mail() eine Mail mit der öffentlichen IP versendet und das Lockfile gesendet
  • Idealerweise schützt man das Verzeichnis auf dem Webserver mittels HTAccess

Am besten realisiert man das Ganze auf dem Host im Heimnetzwerk mit einem kleinen Cronjob:

1*/2 * * * * root        wget http://BENUTZERNAME:PASSWORT@WEBSERVER.TLD/ip_request.php -O /dev/null

ip.php:

 1<?php
 2 if(is_file("tmp/ip_request") == false)
 3 {
 4 $datei = fopen("tmp/ip_request","w");
 5 fwrite($datei, "foo");
 6 fclose($datei);
 7 echo "Request sent.";
 8 }
 9 else { echo "Request to get IP was already sent."; }
10 ?>

ip_request.php:

 1<?php
 2 if(is_file("tmp/ip_request"))
 3 {
 4 mail("DEINE-MAIL@SERVER.TLD", "My current IP",
 5 "My current IP is: ".$_SERVER['REMOTE_ADDR'],
 6 "From: DEIN NAME <DEINE-MAIL@SERVER.TLD>");
 7 unlink("tmp/ip_request");
 8 echo "Request answered, thanks.";
 9 }
10 ?>
11
12Funktioniert bei mir wunderbar - ideal, wenn man ohnehin irgendwo noch einen Host im Netzwerk am Laufen hat. 🙂