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

 

 

9 Kommentare

  1. 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

    Antworten

  2. 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

    Antworten

  3. Pingback: DynDNS mit eigener Domain | Niklas Buschmann

  4. Pingback: Proxy umgehen

  5. Pingback: Schlagzeile: Microsoft legt No-IP.com mit Gerichtsbeschluss still | The SysAdmin

  6. Pingback: eigener SSH-Based Dyndns-Dienst | fungus.at

  7. 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

    Antworten

  8. 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

    Antworten

    • 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.

      Antworten

  9. 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.

    Antworten

  10. 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

    Antworten

  11. Michael Niemeier

    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?

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses cookies. Find out more about this site’s impress.