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:
*/2 * * * * root wget http://BENUTZERNAME:PASSWORT@WEBSERVER.TLD/ip_request.php -O /dev/null
ip.php:
<?php if(is_file("tmp/ip_request") == false) { $datei = fopen("tmp/ip_request","w"); fwrite($datei, "foo"); fclose($datei); echo "Request sent."; } else { echo "Request to get IP was already sent."; } ?>
ip_request.php:
<?php if(is_file("tmp/ip_request")) { mail("DEINE-MAIL@SERVER.TLD", "My current IP", "My current IP is: ".$_SERVER['REMOTE_ADDR'], "From: DEIN NAME <DEINE-MAIL@SERVER.TLD>"); unlink("tmp/ip_request"); echo "Request answered, thanks."; } ?>
Funktioniert bei mir wunderbar – ideal, wenn man ohnehin irgendwo noch einen Host im Netzwerk am Laufen hat. 🙂
Cool!
🙂
…und nützlich! 🙂
Gruß!