DDNS Server selber bauen

Nachdem DynDNS Ernst gemacht und seinen – bis dato kostenlosen – Dienst eingestellt hat, stellt sich für Manchen die Frage: “Woher bekomme ich nun meinen Hostnamen zur dynamischen Heim IP Adresse?”

Auch wir standen vor der Wahl: entweder ein neuer Anbeiter muss her oder wir zahlen demnächst für unseren Hostnamen. Letzendlich haben wir uns für eine andere Variante entschieden – selber machen!

Gründe gibt es viele, warum man sein (in der Regel per dynamischer IP verbundenenes) Heimnetzwerk von außen erreichen möchte; Fernwartung, Webserver, Spiele, IP Telefonie… Bei mir ist es die Owncloud, die auch weiterhin funktionieren soll. Daher haben wir uns entschieden unseren eigenen Nameserver mit dem dynamischen DNS Feature nachzurüsten.

Die folgende Beschreibung ist nicht vollständig “cut’n paste Fähig” und kann, je nach Linux Derivat leicht variieren. Sie gibt jedoch mindestens einen brauchbaren Ansatz her. Einen bereits funktionierenden BIND9 setzen wir voraus und gehen auf die Installation hier nicht näher ein.

Damit der Client später seinen Eintrag automatisch updaten kann muss er sich am Server mittels Key authentifizieren. Dieser Key wird hier erstellt:

dnssec-keygen -a HMAC-MD5 -b 512 -n HOST home.betdns.de

Dieser Key muss nun in eine eigene Konfig Datei /etc/bind/betdns.key (der Name ist frei wählbar, die Datei wird später entsprechend eingebunden)

key home.betdns.de {
 algorithm HMAC-MD5;
 secret "jtDhsXX/7lfSxxYq31HhFhkzPfCr0K+p4FhkzPfCr0Km0Xn8B171337-L4R5xMllr+GjTS7/kVSiE0000000xxx==";
 };

Das Einbinden des Keys erfolgt nun mittels include in der Datei /etc/bind/named.conf

include "/etc/bind/betdns.keys";

Danach muss die Zone in /etc/bind/named.conf.local angepasst werden um später automatische Updates durch den Client zuzulassen

// DDNS Setup
 zone "betdns.de" in {
 type master;
 file "/etc/bind/domains/betdns.de.zone";
 update-policy {
 grant home.betdns.de name home.betdns.de A;
 };
 };

Das war’s auch schon auf der Serverseite. Nach einem BIND-Neustart ist der Server einsatzbereit.

myip.php ist ein Einzeiler, der uns unsere lokale IP ausgibt.

<?php $ip = getenv("REMOTE_ADDR") ; echo $ip; ?>

Das eigentliche Update-Skript muss nun nur noch auf irgend einem(!) Host innerhalb des Homenetzwerkes ausgeführt werden. Wir haben es /opt/ddnsupdate genannt und führen es alle 10 Minuten per cron aus.

IPV4=$(curl -s "http://www.betdns.de/api/myip.php")
 KEY="jtDhsXX/7lfSxxYq31HhFhkzPfCr0K+p4FhkzPfCr0Km0Xn8B171337-L4R5xMllr+GjTS7/kVSiE0000000xxx=="
 NS=ns.betdns.de
 DOMAIN=home.betdns.de.
 ZONE=betdns.de.
 nsupdate -k $KEY -v << EOF
 server $NS
 zone $ZONE
 update delete $DOMAIN A
 update add $DOMAIN 30 A $IPV4
 show
 send
 EOF

Alles in Allem ist so mit relativ wenig Aufwand ein eigener DDNS-Dienst einzurichten. Viel Spaß beim selbermachen.