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. 🙂