Seit längerer Zeit habe ich mich nicht mehr mit Anbietern wie DynDNS beschäftigt. Der Anbieter NoIP tat zwar seinen Dienst, aber mir laufen dort meine Domains (sofern selten genutzt) regelmäßig aus. Mit etwas Rumgefrickel wollte ich das manuelle Bestätigen der Domains automatisieren, aber das war nicht von Erfolg gekrönt.
Da ich nun DynDNS beruflich benötigte bin ich noch einmal auf die Suche nach einem besseren Anbieter gegangen und bin fündig geworden (https://www.schnatterente.net/technik/kostenlose-dyndns-alternative-ohne-zwangs-update). Neben dem MyFritz-Dienst von AVM, den ich in Zukunft wohl für FritzBoxen nutzen werde, habe ich den Anbieter SPDYN entdeckt. Dieser stammt vom Hersteller „Securepoint“ und ist für jedermann kostenlos nutzbar. Eine manuelle Reaktivierung der Domains ist dort auch nicht nötig.
Soweit so gut. Nun hat man aber bei einigen Routern leider das Problem, dass man dort in der Wahl seines DynDNS-Anbieters sehr stark eingeschränkt ist:
Über die lausigen Firmware-Versionen vieler Router findet man auch einige Threads von enttäuschten Nutzern:
https://forum.vodafone.de/t5/Festnetz-LTE-Ger%C3%A4te/DDNS-nur-dyndns-org-amp-tzo-com/td-p/404462/page/2
https://forum.vodafone.de/t5/Andere-Hersteller/Easybox-803-DynDNS/m-p/306364#M3230
Auf der Suche nach einem Weg ohne den Router kam mir die Idee einfach die Computer dahinter zu verwenden, da diese sowieso 24/7 laufen. Auf der Suche nach einem vernünftigen Tool um die IP-Adresse bei SPDYN zu aktualisieren fand ich folgende Seite:
https://freedns.afraid.org/scripts/freedns.clients.php
Leider waren die Tools eher dürftig, aber die Seite hat mich auf die Idee gebracht einfach selber ein entsprechendes Skript zu schreiben. Als erstes benötigt man einen zuverlässigen Dienst, über den man die öffentliche IP ermittelt. Um von dieser den Seiteninhalt auszulesen kann man das Linux-Tool wget verwenden, welches auch für Windows gibt.
Da die bekannten Seiten wie wieistmeineip.de ihr Design schon einmal abändern sind diese zum Auswerten etwas blöd. Am besten ist es, wenn man selber einen Webserver hat, auf dem man ein einfaches PHP-Skript ablegt, welches nur die IP-Adresse ausgibt. So spart man sich ein unnötig kompliziertes Filtern der ausgegebenen Seite:
1 2 |
<?php echo $_SERVER['REMOTE_ADDR']; |
Quelle: https://wiki.debianforum.de/Aktuelle_IP-Adresse_herausfinden
Test-URL: https://blog.devilatwork.de/scripts/get-public-ip-address.php
Nach dem dieser Grundstein gelegt war, habe ich mir ein Batch-Skript geschrieben, das als erstes die öffentliche IP ermittelt und in einer Textdatei speichert. Diesen Umweg bin ich gegangen, da das direkte Speichern der wget-Ausgabe in einer Variable nicht funktionierte. Deshalb lese ich im nächsten Schritt die IP aus der Textdatei in eine Variable ein. Um den DNS-Anbieter nicht zu verärgern wird die letzte genutzte IP in der lastip.tmp immer vorgehalten und mit der ermittelten IP abgeglichen. Ansonsten läuft man Gefahr irgendwann wegen zu häufiger unnötiger Aktualisierungen gesperrt zu werden:
Hat sich die IP nicht geändert wird nichts gemacht außer die temporäre Textdatei zu löschen. Hat sich die IP geändert wird mit Hilfe des wget-Befehls und der am Skriptanfang gesetzten Parameter die entsprechende URL des DNS-Anbieters aufgerufen. Im Falle SPDYN gibt es hierzu eine gute Dokumentation: https://wiki.securepoint.de/index.php/SPDNS_FAQ#Wie_lautet_die_Update-URL_.3F
Das Skript sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@echo off echo %date% - %time% - Ermittlung der aktuellen oeffentlichen IP gestartet >>C:\publicip.log :: Alte Temp-Datei loeschen del actualip.tmp :: Aktuelle oeffentliche IP-Adresse ermitteln und Variablen setzen wget -qO - https://devilatwork.de/scripts/get-public-ip-address.php >>actualip.tmp set /p actualip=<actualip.tmp set /p lastip=<lastip.tmp set hostname=*.spdns.* set password=to-ke-n :: Abgleichen ob sich die IP-Adresse geaendert hat, wenn nicht keine Aktualisierung durchfuehren if %actualip%==%lastip% goto ENDE1 :: neue IP-Adresse als letzte IP speichern del lastip.tmp echo %actualip% >> lastip.tmp :: Aktualisierung der IP-Adresse bei spdyn durchfuehren :: Syntax für die Update-URL: update.spdyn.de/nic/update?hostname=<HOSTNAME>&myip=192.168.0.1&user=<BENUTZERNAME>&pass=<KENNWORT> wget -qO - "update.spdyn.de/nic/update?hostname=%hostname%&myip=%actualip%&user=%hostname%&pass=%password%" echo %date% - %time% - Neue IP gesetzt >>C:\publicip.log goto ENDE2 :ENDE1 echo %date% - %time% - Die IP wurde nicht erneuert >>C:\publicip.log :ENDE2 |
Da ich ziemlich krank war als ich dieses Skript geschrieben habe, bedarf es mit Sicherheit noch etwas Feintuning, wie z.B. einem regelmäßigen Leeren des auf die Schnelle eingebauten Log-Files 😀
EDIT: Da es ab und an zu dem Problem kam, dass die Datei actualip.tmp am Ende des Skripts nicht gelöscht wurde, habe ich den Löschvorgang weiter an den Anfang des Skriptes verlegt, bevor in diese Datei geschrieben wird. Vermutlich gab es eine Zugriffsverletzung, weil kurz zuvor in die Datei geschrieben wurde.
PublicIP.bat