Bisher habe ich den Dienst no-ip.org genutzt, um meine owncloud-Installation zuhause zu erreichen. Das passt irgendwie gar nicht zu meiner Philosophie, möglichst alles selber zu hosten. Also höchste Zeit sich auch von diesem Anbieter zu lösen. Ich beschreibe hier meinen Weg für die Installation eines eigenen DNS-Servers mit DynDNS-Funktion.
DNS-Server installieren und einrichten
Zuerst müssen die Pakete für den DNS-Dienst bind installiert werden:
1 | sudo aptitude install bind9 bind9-doc |
sudo aptitude install bind9 bind9-doc
Damit kann der neu installierte DNS-Server schon mal als DNS-Cache genutzt werden, sofern der forwarder konfiguriert wird. Dazu in der Datei /etc/bind/named.conf.options folgende Zeile einfügen:
1 2 3 4 5 6 7 | forwarders { 208.67.222.222; 208.67.220.220; }; allow-transfer { 193.151.6.202; 193.151.4.202; }; |
forwarders {
208.67.222.222; 208.67.220.220;
};
allow-transfer {
193.151.6.202; 193.151.4.202;
};Mit der letzten Einstellung (allow-transfer) werden die Zonen-Transfers nur zu den genannten DNS-Servern erlaubt.
Nach einem Neustart von bind kann und sollte er für die lokale DNS-Auflösung verwendet werden. Dazu muss er dem System noch bekannt gemacht werden. Das geschieht in der Datei /etc/resolv.conf .
1 2 3 4 | domain thesysadmin.net nameserver 109.73.51.33 search thesysadmin.net search m5r.at |
domain thesysadmin.net nameserver 109.73.51.33 search thesysadmin.net search m5r.at
Mithilfe der search-Einträge können lokale Hostnamen etwas schneller aufgelöst werden.
Eigene Zonen und Reverse-Zonen einrichten
Die eigene Zone, also die für welche der DNS-Server zuständig sein soll, wird in der Datei /etc/bind/named.conf.local hinzugefügt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | zone "thesysadmin.net" in { type master; file "thesysadmin.net.zone"; }; zone "m5r.at" in { type master; file "m5r.at.zone"; }; zone "33.51.73.109.in-addr.arpa" in { type master; file "109.73.51.33.zone"; }; |
zone "thesysadmin.net" in {
type master;
file "thesysadmin.net.zone";
};
zone "m5r.at" in {
type master;
file "m5r.at.zone";
};
zone "33.51.73.109.in-addr.arpa" in {
type master;
file "109.73.51.33.zone";
};Die Zonen-Dateien werden im Verzeichnis /var/cache/bind/ abgelegt. Eine genaue Beschreibung wie diese Zonen-Files aufgebaut sein müssen findet man auf der Seite von linuxhaven.de
Hier ein Beispiel meiner Domain:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $TTL 1D @ IN SOA ns1.thesysadmin.net. root.thesysadmin.net. ( 2014022501 ;Seriennummer 6H ;Auffrischen nach 6 Stunden 1H ;Erneut versuchen nach 1 Stunde 1W ;Laeuft nach 1 Woche ab 1D) ;Minimal gueltig fuer 1 Tag IN NS ns1.thesysadmin.net. IN MX 10 mail.thesysadmin.net. * IN A 109.73.51.33 www IN A 109.73.51.33 ns1 IN A 109.73.51.33 mail IN A 109.73.51.33 |
$TTL 1D @ IN SOA ns1.thesysadmin.net. root.thesysadmin.net. ( 2014022501 ;Seriennummer 6H ;Auffrischen nach 6 Stunden 1H ;Erneut versuchen nach 1 Stunde 1W ;Laeuft nach 1 Woche ab 1D) ;Minimal gueltig fuer 1 Tag IN NS ns1.thesysadmin.net. IN MX 10 mail.thesysadmin.net. * IN A 109.73.51.33 www IN A 109.73.51.33 ns1 IN A 109.73.51.33 mail IN A 109.73.51.33
Nachdem der Server ausführlich getestet wurde und in den Logfiles /var/log/syslog oder /var/log/messages keine Fehler protokolliert werden, habe ich den DNS-Server bei meinem Provider (bzw. den Domains) als Primary DNS-Server eingetragen.
DynDNS-Server einrichten
Für die automatischen DynDNS-Updates muss sich der Client zuerst mittels eines Keys authentifizieren. Dieser muss zuerst generiert werden muss. Dazu benötigt man das Tool dnssec-keygen, welches bind bereits mitliefert
1 | sudo dnssec-keygen -a HMAC-MD5 -b 512 -n HOST cloud.thesysadmin.net |
sudo dnssec-keygen -a HMAC-MD5 -b 512 -n HOST cloud.thesysadmin.net
Man beachte dabei, dass hier zwei identische (symmetrische) Schlüssel erstellt werden. Da beide Server von mir gewartet werden, reicht mir das aus. Ein asymmetrisches Verfahren wäre natürlich sicherer. Als nächstes wird der Hash-Wert des Schlüssels in eine eigene Datei eingetragen und dem DNS-Server bekannt gemacht. In die Datei /etc/bind/named.keys wird der Hash-Wert eingetragen:
1 2 3 4 | key cloud.thesysadmin.net { algorithm HMAC-MD5; secret "AXXXXXXXXXX2ERLv6vNPIJkkXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEwXXXXXXrmGg=="; }; |
key cloud.thesysadmin.net {
algorithm HMAC-MD5;
secret "AXXXXXXXXXX2ERLv6vNPIJkkXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEwXXXXXXrmGg==";
};In der Datei /etc/bind/named.conf wird nun die soeben erstellte Datei mittels include-Anweisung eingebunden. Danach werden die Zugriffsrechte der Schlüssel-Datei angepasst.
1 2 3 | include "/etc/bind/named.keys"; chown root.bind /etc/bind/named.keys chmod 640 /etc/bind/named.keys |
include "/etc/bind/named.keys"; chown root.bind /etc/bind/named.keys chmod 640 /etc/bind/named.keys
Als nächstes in der Datei /etc/bind/named.conf.local die Zone angepassen, damit automatische Updates erlaubt sind. Mit diesen Einstellungen darf nur der genannte Eintrag (cloud.thesysadmin.net) geändert werden.
1 2 3 4 5 6 7 | zone "thesysadmin.net" in { type master; file "thesysadmin.net.zone"; update-policy { grant cloud.thesysadmin.net name cloud.thesysadmin.net A; }; }; |
zone "thesysadmin.net" in {
type master;
file "thesysadmin.net.zone";
update-policy {
grant cloud.thesysadmin.net name cloud.thesysadmin.net A;
};
};Nach einem Neustart von bind ist der Server fertig eingerichtet.
DynDNS-Client einrichten
Für die Updates wird das Tool nsupdate verwendet, welches im Paket „dnsutils“ enthalten ist.
Mit einem kleinen Script, welches Cron dann alle 10 Minuten aufruft, kann der DNS-Eintrag aktualisiert werden:
1 | #!/bin/sh |
#!/bin/sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | server=ns1.thesysadmin.net zone=thesysadmin.net host=cloud secret="AXXXXXXXXXX2ERLv6vNPIJkkXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEwXXXXXXrmGg==" ip=$(wget -q -O - http://ddns.thesysadmin.net/myip.php) cat <<EOF | nsupdate server $server zone $zone. key $host.$zone $secret update delete $host.$zone. update add $host.$zone. 600 A $ip send EOF |
server=ns1.thesysadmin.net zone=thesysadmin.net host=cloud secret="AXXXXXXXXXX2ERLv6vNPIJkkXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEwXXXXXXrmGg==" ip=$(wget -q -O - http://ddns.thesysadmin.net/myip.php) cat <<EOF | nsupdate server $server zone $zone. key $host.$zone $secret update delete $host.$zone. update add $host.$zone. 600 A $ip send EOF
Fehlt nur noch das myip.php -Script auf der Server-Seite, welches die aktuell genutzte IP zurückgibt:
1 2 3 4 | <?php $ip = getenv("REMOTE_ADDR") ; echo $ip; ?> |
<?php
$ip = getenv("REMOTE_ADDR") ;
echo $ip;
?>Wenn alles geklappt hat, sollte am DNS-Server im Log-File folgende Zeilen auftauchen:
1 2 | Feb 25 14:40:01 XX named[13315]: client X.X.X.X#14792: updating zone 'thesysadmin.net/IN': delete all rrsets from name 'cloud.thesysadmin.net' Feb 25 14:40:01 XX named[13315]: client X.X.X.X#14792: updating zone 'thesysadmin.net/IN': adding an RR at 'cloud.thesysadmin.net' A |
Feb 25 14:40:01 XX named[13315]: client X.X.X.X#14792: updating zone 'thesysadmin.net/IN': delete all rrsets from name 'cloud.thesysadmin.net' Feb 25 14:40:01 XX named[13315]: client X.X.X.X#14792: updating zone 'thesysadmin.net/IN': adding an RR at 'cloud.thesysadmin.net' A
Eigentlich Interessant, da ich selbst auch schon sowas machen wollte. Aber dazu habe ich drei Fragen:
1) Funktioniert das bei dir schon?
2) Wo wird die Serial hochgezählt, bzw. meines Wissens nach sollte man die Serial nach einer Änderung hochzählen
3) Wie schützt du dich vor (böswilliger) Manipulation, in dem ich einfach mit meiner IP das Script aufrufe. So wie ich das sehe kann das ja jeder aufrufen und dann wird die IP gesetzt.
Schönes Wochenende,
velo
Hi,
1) ja 🙂
2) die serial wird bei einer Änderung automatisch um 1 erhöht (wenn sich die IP wirklich ändert).
Ich würde bei der ID jetzt im nachhinein eine einfache Nummer nehmen (wie 00000001), anstelle des Datums in nummerischer Form.
3) Das Script myip.php kann jeder aufrufen, stimmt. Dieses gibt aber nur die IP-Adresse des Aufrufers zurück. Sonst passiert da nichts. Für das Update des DNS-Eintrags muss der Client den Schlüssel kennen, welcher mit dnssec-keygen erzeugt wurde. Das Script für die Änderung wird nur lokal auf dem Home-Server mittels cron aufgerufen.
Gruss
Pingback: DynDNS mit eigener Domain | Niklas Buschmann
Pingback: Proxy umgehen
Pingback: Schlagzeile: Microsoft legt No-IP.com mit Gerichtsbeschluss still | The SysAdmin
Pingback: eigener SSH-Based Dyndns-Dienst | fungus.at
Danke für die „Inspiration“. Hab mir nach deinem Muster einen DynDNS-Server zusammengeschraubt, der allerdings ssh (und key-based) für den Update verwendet.
cu
Rene
Huhu , also ich find die Anleitung ja soweit ganz gut verständlich, und Sorry wenn ich jetzt voll den Noob raushängen lasse aber ich bin noch net so lang auf Linux.
an welchen Stellen muss ich die IP´s in deiner Anleitung durch meine eignen ersetzen und welche, sprich Interne und externe etc?
Wäre toll wenn du mir dazu ne Antwort geben könntest.
LG
Hi Alex,
in der Datei „/etc/bind/named.conf.options“ sind die ersten zwei IP-Adressen die der DNS-Server, an welche die Anfrage weitergeleitet werden, wenn „dein“ DNS-Server die Antwort nicht kennt (forwarders).
die nächsten zwei Einträge in der Datei (allow-transfer) die DNS-Server, welche quasi eine „Kopie“ von deinen DNS-Einträgen haben abholen dürfen.
auf deinem DNS-Server gibt es die Datei „/etc/resolv.conf“. In dieser soll die öffentliche IP deines Servers rein.
im Zonen-File „/etc/bind/named.conf.local“ kommt auch die IP-Adresse deines Servers rein (einmal in umgekehrter Reihenfolge)
und natürlich im Zonen-File selber… da kommen ebenfalls nur öffentliche IP-Adressen rein.
Du verwendest hier dnssec-keygen. Oo
Das ist dafür überhaupt nicht gedacht. Mal die manpage gelesen?
Richtig wäre ddns-confgen.
z.B: q -a hmac-sha512 -k ddns-update-key
Das erzeugt dir dann auch gleich das ganze key segment für die config.
Hi
Entschuldigung, aber ich verstehe das nicht.
Zitat“zuerst müssen die pakete für den Dyndns Dienst bind installiert werden“
Und dann steht da nur so eine Zeile mit Buchstaben und so
1.:wie und wo muss ich dass eingeben (also die Zeile install und so)?
2.:muss ich dafür Linux haben?
3.:wie installiere ich den Server?
Leider bringt mich diese eine Zeile nicht weiter ist dass vielleicht ein Hyperlink?
Sorry dass ich mich total auf dumm stelle aber ich verstehe es nicht
PS sorry für die Rechtschreibung
Hi,
1) auf der Command-Line
2) ja, du brauchst dafür Linux
3) mit dem Kommando in 1 wird die Serversoftware installiert
Hi,
verstehe ich das richtig dass hier die Domains eingetragen werden?
Also kann ich z.B. sowas machen?:
———————————————-
zone „meinedomain1.de“ in {
type master;
file „meinedomain1.de.zone“;
};
zone „meinedomain2.de“ in {
type master;
file „meinedomain2.de.zone“;
};
zone „meinedomain3.de“ in {
type master;
file „meinedomain3.de.zone“;
};
————————————————-
Ist das so korrekt?
Hut ab.
Eine schöne kurze Anleitung.
Vorallem das mit dem PHP Code finde ich schön. 🙂