Dynamischer DNS Service selbst gemacht
Nachdem DynDNS.org nicht mehr so stabil funktioniert wie früher, dachte ich es wird Zeit das Ganze selbst zu machen! Es ist schon nervig wenn plötzlich xxxxxx.dyndns.org nicht mehr funktioniert, nur weil der Hosteintrag plötzlich verschwunden ist…
Subdomain anlegen
In das Zonefile muss man diese Zeile einfügen. Damit legt man die Subdomain dyn.example.org an.
dyn IN NS ns.example.org.
Key erstellen
Als nächste muss man den Key für die Authentifizierung zw. DNS-Server und nsupdate-client erstellen. Das geht so:
dnssec-keygen -a HMAC-MD5 -b256 -n HOST dyn.example.org
Dieser Befehl erzeugt 2 Dateien:
Kdyn.example.org.+157+42378.key Kdyn.example.org.+157+42378.private
Der Inhalt von Kdyn.example.org.+157+42378.key:
dyn.example.org. IN KEY 512 3 157 zAl1em86uJzUmgQqV+d5AsdF8D48czjkloCy37y2f3H4=
Der Inhalt von Kdyn.example.org.+157+42378.private:
Private-key-format: v1.3 Algorithm: 157 (HMAC_MD5) Key: zAl1em86uJzUmgQqV+d5AsdF8D48czjkloCy37y2f3H4= Bits: AAA= Created: 20130812194154 Publish: 20130812194154 Activate: 20130812194154
Namerserver konfigurieren
In die config-Datei vom Nameserver muss man dann folgendes eintragen:
key "dyn.example.org." { algorithm hmac-md5; secret "zAl1em86uJzUmgQqV+d5AsdF8D48czjkloCy37y2f3H4="; }; zone "dyn.example.org" { type master; file "/var/cache/bind/db.dyn.example.org"; allow-update { key "dyn.example.org."; }; };
Unter /var/cache/bind muss dann noch die Datei db.dyn.example.org anlegen. Das ist das initiale Zonefile für die subdomain.
$ORIGIN . $TTL 60 ; 1 minute dyn.example.org IN SOA ns.example.org. domain-admin.example.org. ( 2013081201 ; serial 3600 ; refresh (1 hour) 1800 ; retry (30 minutes) 604800 ; expire (1 week) 180 ; minimum (3 minutes) ) NS ns.example.org. NS ns2.example.org. $ORIGIN dyn.example.org.
Die Konfiguration des Nameservers ist hiermit abgeschlossen. Mit /etc/init.d/bind9 restart sollte man natürlich den Server noch neu starten.
Client konfigurieren
Für einen ersten Test habe ich folgende Datei angelegt (man kann die Befehle in nsupdate auch händisch eingegeben)
nsupdate.txt:
server ns.example.org zone dyn.example.org. update delete home.dyn.example.org. A update add home.dyn.example.org. 60 A 123.123.123.123 show send
Der Befehl „update del home.dyn.example.org.“ ist wichtig, da sonst einfach ein weiterer A-Record angelegt wird.
Die Datei Kdyn.example.org.+157+42378.private vom Nameserver sollte man auf den client-rechner kopieren.
Mit folgendem Befehl kann man dann ein update starten:
nsupdate -k Kdyn.example.org.+157+42378.private -v nsupdate.txt
Die Ausgabe ist folgende:
Outgoing update query: ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 0 ;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0 ;; ZONE SECTION: ;dyn.example.org. IN SOA ;; UPDATE SECTION: home.dyn.example.org. 0 ANY A home.dyn.example.org. 60 IN A 123.123.123.123
Im Logfile des Nameservers sieht man dann wie die Zone upgedatet werden sollte:
Aug 13 21:07:48 ns named[982]: client 12.12.12.12#38632: signer "dyn.example.org" approved Aug 13 21:17:29 ns named[982]: client 12.12.12.12#38632: updating zone 'dyn.example.org/IN': delete all rrsets from name 'home.dyn.example.org' Aug 13 21:07:48 ns named[982]: client 12.12.12.12#38632: updating zone 'dyn.example.org/IN': adding an RR at 'home.dyn.example.org' A
Damit wäre das dynamische Update geschafft. Jetzt muss man das ganze nur noch von pppd automatisch updaten lassen!
Automatisches update durch ipup.d und pppd
unter /etc/ppp/ip-up.d/ legt man ein script zb. mit dem Namen dyndnsupdate an. Wichtig dabei ist dass das Script keine Endung hat! Ansonsten wird es nicht ausgeführt.
dyndnsupdate:
#!/bin/sh -e SERVER=ns.example.org ZONE=dyn.example.org. HOSTNAME=home.dyn.example.org. KEYFILE=/path/to/Kdyn.example.org.+157+42378.private if [ -n "$4" ] ; then nsupdate -k $KEYFILE < < - E O F server $SERVER update delete $HOSTNAME A update add $HOSTNAME 60 A $4 send EOF fi
Bitte die Leerzeichen bei EOF entfernen. WordPress scheint mit dem EOF wohl etwas durcheinander zu kommen 😉 richtig wäre «-EOF