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