DynDNS ist ein Dienst, der es ermöglicht, durch z.B. einen Router automatisch bei der Einwahl, einen DNS-Eintrag zu aktualisieren, der auf die aktuelle IP des Routers zeigt. Man ist hierbei jedoch an die verfügbaren Domains von DyDNS gebunden. Schöner ist es natürlich, einen dynamischen Eintrasg für eine selbst gehostete DNS Zone zu erstellen.
Dies ist im Prinzip relativ einfach. Es gibt unter Linux das Tool nsupdate, mit dessen Hilfe man DNS Einträge innerhalb einer DNS-Zone erstellen sowie löschen kann. Um sicher zu stellen, dass der Client dazu auch authorisiert ist, muss sich der Client durch einen Schlüssel authentifizieren, der auf dem Server für dynamische Updates für die entsprechende Zone berechtigt ist.
Da man evtl. aus Sicherheitsgründen nsupdates nicht direkt innerhalb der eigentlichen Zone zu erlauben möchte, kann man z.B. eine Sub-Domain einrichten, in der die dynamischen Einträge erstellt werden. In der eigentlich Zone braucht man dann nur einen CNAME auf den entsprechenden Sub-Domain DNS-Eintrag zeigen zu lassen. Das ganze kann dann wie folgt aussehen:
> ddns.blog.cscholz.io Server: dir-600 Address: 192.168.0.1 Nicht autorisierende Antwort: Name: ddns.blog.cscholz.io (Die Zone für dynamische Updates) Address: 178.77.103.157 > home.blog.cscholz.io Server: dir-600 Address: 192.168.0.1 Nicht autorisierende Antwort: Name: home.ddns.blog.cscholz.io (dynamischer intrag innerhalb der ddns-Zone) Address: 109.90.132.37 Aliases: home.blog.cscholz.io (Der CNAME, der auf den dynamischen Eintrag verweist)
Um das ganze mittels Bind9 zu realisieren,wird zuerst der Schlüssels angelegt, mit sich Clients später authentifizieren um Updates an der Zone vornehmen zu dürfen.
../bind/keys/ dnssec-keygen -C -a HMAC-MD5 -b256 -n HOST ddns.blog.cscholz.io
Der Parameter -C ist aus Kompatibilitätsgründen notwendig, da das nsupdate was auf den Synology NAS-Systemen installiert werden kann, noch nicht die neuen Schlüssel unterstützt. Das Ergebnis dieses Befehls sind zwei Dateien.
-rw------- 1 root bind 77 23. Jun 18:38 Kddns.blog.cscholz.io.+157+36575.key -rw------- 1 root bind 112 22. Jun 07:15 Kddns.blog.cscholz.io.+157+36575.private
Der Inhalt der Datei *.key wird nun zusammen mit dem Verweis auf eine neue Sub-Domain in die eigentliche Zone (blog.cscholz.io) aufgenommen. Anschließend muss noch die Seriennummer der Zone inkrementiert und die Zone neu geladen werden.
../../blog.cscholz.io.zone ns IN A 178.77.103.157 ddns IN NS ns ddns.blog.cscholz.io. IN KEY 512 3 157 MJV+YI32Xfxb9rHW4qIUeg3UE1ez6rs/1SKq/EP4lQI=
Im Ordner ../bind/key/ wird nun eine Konfigurationsdatei erstellt, welche die Schlüsselkonfiguration enthält. Der Wert der mittels secret angegeben ist, ist identisch mit dem Wert, der in der DNS-Zone erstellt wurde:
../bind/keys/keys.conf key "ddns.blog.cscholz.io." { algorithm HMAC-MD5; secret "MJV+YI32Xfxb9rHW4qIUeg3UE1ez6rs/1SKq/EP4lQI="; };
Nun wird die eigentliche neue Zone erstellt. Hier kann man extrem kurze TTL Zeiten wählen, um sicher zu stellen, dass der DNS Eintrag immer aktuell ist:
../../ddns.blog.cscholz.io.zone $ORIGIN . $TTL 2560 ; 42 minutes 40 seconds ddns.blog.cscholz.io IN SOA ns2.blog.cscholz.io. postmaster.blog.cscholz.io. ( 17 ; serial 60 ; refresh (1 minute) 90 ; retry (1 minute 30 seconds) 120 ; expire (2 minutes) 120 ; minimum (2 minutes) ) $TTL 10800 ; 3 hours NS ns.blog.cscholz.io. A 178.77.103.157 $ORIGIN ddns.blog.cscholz.io. $TTL 60 ; 1 minute
Jetzt noch die neue Zone in der named.conf eingetragen. Hierbei wird auch der Schlüssel "ddns.blog.cscholz.io." für Updates berechtigt.
../../named.conf zone "ddns.blog.cscholz.io" in { type master; file "../../ddns.blog.cscholz.io.zone"; allow-query { any; }; allow-update { key "ddns.blog.cscholz.io."; }; [..] include "/etc/bind/keys/keys.conf";
Nach dem reload der Zone ist Serverseitig schon alles fertig. Nun muss dem Client, z.B. einem NAS noch ein Script verpasst werden, dass einen entsprechenden DNS-Eintrag in der Zone ddns.blog.cscholz.io erstellt. Hierzu kann ich das Script von Artem Sidorenko empfehlen. Zu beachten ist, dass aus Kompatibilitätsgründen in dem Ordner auf dem Client, in dem sich die *.private Datei befindet, ebenfalls die *.key Datei vorhanden sein muss.