Dynamisches DNS

Szenario: Man möchte von daheim auf einen Schulserver* zugreifen. Die Schule hat nur einen einfachen Internetzugang, dessen IP-Adressen sich dynamisch (i.d.R. täglich) ändern. Um ihn erreichen zu können sorgt man dafür, dass die neuen Adressen an einen geeigneten Dienst (früher: dyndns.com, jetzt eher andere Anbieter wie z.B. spDYN.de) gemeldet werden. Dann kann man den Schulserver unter der beispielhaften Adresse serviceabcschule.my-firewall.org erreichen, da dieser DNS-Name immer mit den aktuellen Adressen aufgelöst wird. Siehe dazu auch https://de.wikipedia.org/wiki/Dynamisches_DNS.

*der Schulserver kann natürlich auch ein Gateway-Server sein, der Anfragen an weiter hinten liegende interne Webserver weiterleitet.

Tipp

Will man das Kollegium oder gar die Eltern- und Schülerschaft auf den Server lassen, so sollte man den DNS-Namen des DynDNS-Dienstes nicht veröffentlichen, sondern einen zusätzlichen DNS-Eintrag bei der Schuldomäne vornehmen, z.B. service.abc-schule.edu. Dieser Eintrag muss vom Typ CNAME mit dem Ziel serviceabcschule.my-firewall.org sein.

Vorteil: Man kann jederzeit den DynDNS-Dienst wechseln, ohne dass man eine andere URL veröffentlichen muss. Nur der CNAME-Eintrag muss geändert werden, was Zeit hat, bis der neue Dienst zuverlässig läuft.

Aktualisierung

Router macht's

Reine IPv4-Adressen lässt man eher vom Router aktualisieren.

OPNsense macht's

In der WebGUI kann man mehrere unter Services→Dynamic DNS aus verschiedenen Dyn-DNS-Diensten auswählen oder eine Custom-URL eingeben.
Vorteil: OPNsense überwacht selbst seine IP-Adressen.

Tipp: Wenn man der automatischen Erkennung nicht traut, so kann man zusätzlich einen crontab-Eintrag unter System→Settings→Cron anlegen, der z.B. um 5 Uhr morgens (also nach der typischen Zeit, in der eine Fritzbox sich neu einwählt) eine Aktualisierung durchführt.

Linux-Server macht's

Es gibt viele Anleitungen für die Aktualisierung durch Rechner bei dynamisch vergebenen IP-Adressen. Selten findet man aber eine, die sich mit dem Problem beschäftigt, dass man sowohl IPv4-, als auch IPv6-Adressen zuweisen möchte. Bei meiner letzten Recherche im Jahr 2019 fand ich nur wenige kostenlose Dienste, die das anbieten. Ergebnis sind u.a. die beiden folgenden Skripte, die unter Linux auf dem Server in der DMZ laufen (wenn curl installiert ist). Sie werden bei mir alle 5 Minuten aufgerufen und überprüfen die aktuellen IP-Adressen und melden diese nur bei Adressänderung an den Dienst. Vielleicht reicht auch eine Überprüfung morgens um 6 Uhr.

Funktionsfähige Datei für SPdyn

Hier die besser funktionierende mit dem Anbieter spDYN.de

#!/bin/sh
## Konfiguration SPdyn
tokenv4='nmxx-yyyy-zzcj'
tokenv6='jhvv-wwww-uuah'
hostname='serviceabcschule.my-firewall.org'
## Und los:
aktipv6=`ip addr | grep "inet6 2" | awk '{print $2}' | awk -v FS='/' '{print $1}'| head -n1`
content=1234
content=$(cat /tmp/dynv6.state)
#echo ${aktipv6} vs ${content}
if [ "${aktipv6}" != "${content}" ];then
aktipv4=`/usr/bin/curl "http://checkip4.spdyn.de"`
echo `date` "setzen: IPv4: ${aktipv4} IPv6: ${aktipv6}"
/usr/bin/curl "https://${hostname}:${tokenv6}@update.spdyn.de/nic/update?hostname=${hostname}&myip=$aktipv6"
echo ${aktipv6} > /tmp/dynv6.state
#/usr/bin/curl "https://${hostname}:${tokenv4}@update.spdyn.de/nic/update?hostname=${hostname}&myip=$aktipv4"
/usr/bin/curl --ipv4 "https://${hostname}:${tokenv4}@update.spdyn.de/nic/update?hostname=${hostname}&myip=192.168.0.1"
service apache2 restart
else
echo `date` "-> Keine Aenderung in der IP-Adresse"
fi

Funktionsfähige Datei für DynV6

Der Dienst dynv6.de ist/war? eher ein Hobbyprojekt. Mit folgendem einfacheren Skript ließ es sich erfolgreich nutzen:

#!/bin/sh
## Konfiguration:
token='PMPxxxxxxxxxyyyyyyyyyyyyzzzzzzzzzL'
hostname='unsergatewayserver.dynv6.net'
## Und los:
aktstate=`ip addr | grep inet6 | md5sum | awk '{print $1}'`
content=1234
content=$(cat /tmp/dynv6.state)
#echo $aktstate vs $content
if [ "$aktstate" != "$content" ];then
date
/usr/bin/curl "https://ipv4.dynv6.com/api/update?token=${token};hostname=${hostname};ipv4=auto"
/usr/bin/curl "https://ipv6.dynv6.com/api/update?token=${token};hostname=${hostname};ipv6=auto"
echo $aktstate > /tmp/dynv6.state
#else
#	date
#	echo Keine Aenderung in der IP-Adresse
fi