Dynamisches DNS


Von Roman (romanf auf trash.net)


Was verstehen wir unter Dynamischem DNS?

Wenn du eine Website, Mailserver oder anderen Dienst auf einem System betreiben willst, welches ab und zu die IP-Adresse ändert (z.B. weil das System ein Heim-Serverchen ist und an einem ADSL- oder Kabel-Anschluss hängt), dann muss jeweils die neue IP-Adresse zeitnah ins DNS eingepflegt werden, damit man den Dienst vom Internet her erreicht (siehe auch den guten Artikel in der Wikipedia).

Für ein Dynamisches DNS (DDNS) kann man kommerzielle Angebote nutzen oder man kann das mit etwas Scripts und Mithilfe von unseren Admins auch auf trash.net einrichten.

Voraussetzung ist natürlich, dass deine Domain auf trash.net gehostet wird, sprich dass beim Registrar ns1.trash.net und ns2.trash.net als authorative Nameserver eingetragen sind.

Anleitung zur Einrichtung von DDNS für deine Domain auf trash.net

1. Zone-File erstellen

Jede Domain braucht im DNS ein sog. Zone-File. Das ist ein Text-File in welchem zum Domain-Namen die IP-Adresse/n steht, unter welcher die Domain zu finden ist.
Erstelle ein Text-File z.B. "meinedomain.ch_zone.db" in einem neuen leeren Verzeichnis (z.B. "dns") mit dem folgenden Inhalt:


meinedomain.ch.             259200  IN      NS      ns1.trash.net.
meinedomain.ch.             259200  IN      NS      ns2.trash.net.
meinedomain.ch.             86400   IN      MX      10 meinedomain.ch.
meinedomain.ch.             300     IN      A       xxx.xxx.xxx.xxx
meinedomain.ch.             300     IN      AAAA    yyyy:yyyy:yyyy:yyyy:yyyy:yyyy

Wobei die xxx die aktuelle IPv4 und die yyyy die aktuelle IPv6 Adresse. Falls du noch kein IPv6 hast, dann einfach die Zeile weglassen.
Achtung: Die Punkte nach ".ch" sind relevant!

Dieses Zone-File wird dann durch einen Automatismus den Techstaff einrichtet, um den sog. SOA und DNSSEC ergänzt. Erst dann entsteht ein vollständiges Zone-File, welches im DNS veröffentlicht wird.

2. Update Script erstellen

Das Zone-File muss bei jedem Wechsel der IP-Adresse von deinem Server nachgeführt werden. Dafür erstellen wir ein kleines Script, welches über den Webserver aufgerufen wird (fast schon ein kleiner Web-Service!):

Erzeuge in deinem public_html Verzeichnis ein neues Verzeichnis "cgi-bin". Darin ein neues File z.B. "update-dns.cgi" erstellen (Endung .cgi ist zwingend!). Inhalt:

#!/bin/sh
echo "Content-type: text/plain"
echo ""

#REMOTE_ADDR=1.2.3.4
ZONEFILE=/home/DEINLOGIN/dns/meinedomain.ch_zone.db

#-- Update required at all? --
FOUND=`grep "meinedomain\.ch\..*${REMOTE_ADDR}$" $ZONEFILE`
if [ -n "$FOUND" ] ; then
        exit
fi

case "$REMOTE_ADDR" in

#-- IPv4 --
*.*)
echo "new ipv4 detected:" $REMOTE_ADDR ed -s $ZONEFILE <<EOF /^meinedomain.ch..*IN A /s/^.*$/meinedomain.ch. 300 IN A $REMOTE_ADDR w q EOF ;; #-- IPv6 -- *:*)
echo "new ipv6 detected:" $REMOTE_ADDR ed -s $ZONEFILE <<EOF /^meinedomain.ch..*AAAA/s/^.*$/meinedomain.ch. 300 IN AAAA $REMOTE_ADDR w q EOF ;; esac
#-- Output -- mailx -s "New IP Adress $REMOTE_ADDR" DEINLOGIN@trash.net

Damit der Webserver das Script ausführen kann, muss es ausführbar markiert werden:

chmod +x update-dns.cgi

Das Script hat eine auskommentierte Zeile #REMOTE_ADDR=... Zum lokalen Testen des Script kann man diese aktivieren und das Skript dann manuell auf trash.net starten.

Hinweis: In den Zeilen wo deine Domain steht, ist zwischen den einzelnen Elementen immer genau ein TAB! Der ed ist beim Matching ziemlich heikel und kann auch nur einen Teil des Standard Regex-Satzes.

3. Script schützen (1/2)

Damit nur Du das Script verwenden kannst, bauen wir einen Passwort-Schutz ein:
Erstelle ebenfalls im Verzeichnis cgi-bin ein Text-File ".htaccess" (der Punkt am Anfang ist relevant!) mit folgendem Inhalt:

AuthType Basic
AuthName "Private Area"
AuthUserFile /home/DEINLOGIN/html_auth/htpasswd
Require user dnsupdate

Selbstverständlich kannst du den Ort des htpasswd und den Namen des Users nach belieben anpassen.

4. Script schützen (2/2)

Das oben referenzierte htpasswd muss nun noch erzeugt werden:

  1. Verzeichnis html_auth erzeugen
  2. In das Verzeichnis html_auth wechseln
  3. "htpasswd -c htpasswd dnsupdate" aufrufen (der User dnsupdate muss natürlich mit dem im Schritt 3 übereinstimmen)
  4. Ein starkes, zufälliges Passwort vergeben. Ich empfehle einen Password-Generator (z.B. von KeePass) zu verwenden. Das Passwort wird im nächsten Schritt gebraucht.

5. Script von deinem Server aus aufrufen

Das unter 2. erzeugte und mit 3. und 4. korrekt geschützte Script muss nun aufgerufen werden, wenn die IP-Adresse deines Servers ändert. Je nach Betriebssystem und Deinem Know-How gibt es da verschiedene Möglichkeiten:

  • Cron-Job (aka Task planen unter Windows) erstellen, der in passenden Intervallen das Skript von 2. aufruft.
    Diese Lösung ist nicht sehr elegant und auch nicht effizient, aber super-einfach zu implementieren. Darum unten auch detailiert beschrieben.
  • Hook im DHCP Client: Viele DHCP-Clients bieten die Möglichkeit, bei einem Wechsel der Adresse ein Skript aufzurufen (s. z.B. dhclient-up-hooks hier: http://linux.die.net/man/8/dhclient-script).
    Diese Lösung ist sicher die "sauberste", da wirklich nur etwas gemacht wird, wenn sich die Adresse ändert.

  • Unter Windows müsste man wohl ein Programm schreiben (oder ein existierendes verwenden), welches NotifyIpInterfaceChange() implementiert.

5.1 Script per Cron-Job aufrufen

Erstelle einen (wenn du nur IPv4 hast) oder zwei Cron-Jobs auf deinem Server, welche jeweils das Skript aufrufen:

# Dynamic update of IP address
33 * * * * /usr/bin/curl -k --ipv4 -s -o /dev/null --user dnsupdate:PASSWORT https://users.trash.net/~DEINLOGIN/cgi-bin/update-dns.cgi
34 * * * * /usr/bin/curl -k --ipv6 -s -o /dev/null --user dnsupdate:PASSWORT https://users.trash.net/~DEINLOGIN/cgi-bin/update-dns.cgi

Diese Lösung ist weder elegant noch effizient, aber simpel. Der Nachteil ist, dass im schlimmsten Fall erst nach einer Stunde die neue Adresse ins Zone-File eingetragen wird, deine Domain solange unerreichbar ist. Bei Servern welche die IP-Adresse nur sehr selten ändern (wie z.B. bei meinem UPC-Abo), werden hier auch sehr viele unnötige Aufrufe des Scripts gemacht.

5.2 Script via DHCP-Client Hook aufrufen

Hat hier jemand eine Anleitung, wie das genau gemacht wird? Bitte melden!

-Roman