debian | selbstgehosteter DynDNS-Dienst

DynDNS steht für Dynamisches DNS. Normalerweise ist DNS relativ statisch – schon alleine, weil die TTL (Time-to-live) einer DNS-Zone, üblicherweise bei einem Tag liegt, d.h. die DNS-Server fragen die entsprechende DNS-Zone nur einmal am Tag nach Aktualisierungen ab. Außerdem werden die Einträge in den DNS von einem Administrator gemacht. In bestimmten Fällen ist es aber nützlich, wenn Clients sich selber im DNS registrieren können und diese Änderungen allen anderen DNS-Servern zeitnah zur Verfügung stehen. Genau das macht Dynamisches DNS – ausführlicher und bestimmt auch besser erklären kann das Wikipedia.

Das klassische Beispiel ist der DSL-Router zu Hause, der durch DynDNS aus dem Internet mit einem Namen adressierbar ist und man dadurch auf Rechner zu Hause leichter zugreifen kann.

Ich habe jahrelang einen DynDNS-Client auf meinem Router benutzt und hatte einen Account bei dyndns.org. Als ich letztens wieder einmal auf meinen Router zugreifen wollte, ging das aber leider nicht und als ich dann in meinem dyndns.org-Account nachschaute, musste ich sehen, dass mein Host-Eintrag gelöscht wurde. Problem bei solchen DynDNS-Anbietern, welche kostenfrei sind, ist nämlich der Fakt, dass man regelmäßig den Hosteintrag aktualisieren muß. Warum auch immer das nicht funktioniert hat (mein Router hat zur Zeit ne Uptime von 64 Tagen) – ich war es leid und habe mal geschaut, ob man das nicht auch selbst machen kann.

Einen Server im Internet habe ich bereits und ich habe die Möglichkeiten die Zonen-Datei bei meinem DNS-Anbieter frei zu bearbeiten. Letzteres ist fast Wichtiger – einen kleinen VPS-Server kann man sich bereits ab 12€ im Jahr mieten. Mit dem Standard-DNS-Server/-Client bind kann man sich einen DynDNS-Server leicht selber bauen. Wie genau das geht werde ich jetzt im Einzelnen erklären.

Vorbereitung

Wir benötigen für die Installation und Aktivierung von DynDNS folgendes:

  1. Einen Linux-Server (in meinem Fall Debian) mit root-Zugang
  2. Zugang zum DNS-Server, der Eure Domain hostet und die Möglichkeit am Besten die Zonen-Datei selber anzupassen.

Installation

Alles, was wir für DynDNS benötigen sind folgende Pakete

aptitude install bind9 bind9-host bind9utils dnsutils

Konfiguration

Da wir faul sind, definieren wir erst einmal ein paar Variablen, mit denen wir später arbeiten werden.

BINDDIR – Das Verzeichnis, in dem die Zonenspezifischen Dateien liegen, die sich verändern
ETCDIR – Das Verzeichnis, in dem alle BIND-Konfigurationsdateien liegen
DYNDNSDOMAIN – Die Subdomain, welche wir für DynDNS verwenden wollen
HOSTSERVER – Der Name des DNS-Servers, welche die Subdomain verwalten wird
GAST – Der Name des ersten DynDNS-Clients

Ich werde in diesem Artikel mit meiner Domain controlc.de und der eigens dafür kreierten Subdomain dyndns.controlc.de arbeiten.

In der Kommandozeile folgendes ausführen:

BINDDIR="/var/lib/bind"
ETCDIR="/etc/bind"
DYNDNSDOMAIN="dyndns.controlc.de"
HOSTSERVER="dns-server.$DYNDNSDOMAIN"
GAST="client1.$DYNDNSDOMAIN"

Anlegen einer Subdomain und Delegierung der Subdomain an den DNS-Server

Dann erstellen wir auf dem DNS-Server, der unsere Domain verwaltet einen Hosteintrag für den DNS-Server der Subdomain und natürlich die Weiterleitung für die Subdomain auf eben diesen. Leider hat jeder DNS-Anbieter da seine eigene Oberfläche und bietet z.T. auch nur den Zugriff auf bestimmte Funktionen. Solltet Ihr nicht genau wissen, wie das Folgende bei Eurem Anbieter zu konfigurieren ist, so fragt doch bitte beim jeweiligen Support nach.

dns-server.dyndns        IN A       [IP-ADRESSE]
dyndns                   IN NS      dns-server.dyndns.controlc.de.

In Zeile 1 wird ein A-Eintrag für den DNS-Namen dns-server.dyndns(.controlc.de) auf eine IP-Adresse gemacht. In Zeile 2 erfolgt der NS=Nameserver-Eintrag der Subdomain „dyndns“ auf den DNS-Server dns-server.dyndns.controlc.de, d.h. alle Anfragen an den DNS-Server nach einem DNS-Namen, der die Subdomain betrifft, wird an den DNS-Server dns-server.dyndns.controlc.de weitergeleitet/delegiert.

Wichtiger Hinweis in dem Zusammenhang: Achtet bitte auf die Interpunktion, die ist bei Zonen-Dateien, wenn man sie denn direkt bearbeiten darf, extrem wichtig!

Konfiguration der Subdomain

Jetzt wird Bind die neue Subdomain bekannt gemacht und die Konfigurationsoptionen gesetzt.

echo -e "// Dynamic zone" >> $ETCDIR/named.conf.local
echo -e "zone "$DYNDNSDOMAIN"" { >> $ETCDIR/named.conf.local
echo -e "    type master;" >> $ETCDIR/named.conf.local
echo -e "    file \"$BINDDIR/$DYNDNSDOMAIN\";" >> $ETCDIR/named.conf.local
echo -e "    allow-update { any; };" >> $ETCDIR/named.conf.local
echo -e "    allow-query { any; };" >> $ETCDIR/named.conf.local
echo -e "    allow-transfer { none; };" >> $ETCDIR/named.conf.local
echo -e "};" >> $ETCDIR/named.conf.local

Und schließlich legen wir die Zonen-Datei an

echo -e "\$ORIGIN ." > $BINDDIR/$DYNDNSDOMAIN
echo -e "\$TTL 300 ; 5 minutes" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "$DYNDNSDOMAIN IN SOA $HOSTSERVER. hostmaster@controlc.de. (" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "    1 ; serial" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "    3600 ; refresh (1 hour)" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "    600 ; retry (10 minutes)" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "    604800 ; expire (1 week)" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "    300 ; minimum (5 minutes)" >> $BINDDIR/$DYNDNSDOMAIN
echo -e "    )" >> $BINDDIR/$DYNDNSDOMAIN
echo -e " NS $HOSTSERVER." >> $BINDDIR/$DYNDNSDOMAIN
echo -e "\$ORIGIN $DYNDNSDOMAIN." >> $BINDDIR/$DYNDNSDOMAIN

Erstellen von Key-Einträgen für die DNS-Clients

Für die Authentifizierung der Clients am DNS-Server verwenden wir sogenannte Keys – also so eine Art Passwörter. Diese müssen sowohl dem Server als auch dem Client bekannt sein.

Zur Generierung eines Eintrags für unseren Klienten führen wir folgendes aus

ddns-confgen -r /dev/urandom -q -a hmac-md5 -k $GAST -s $GAST. | tee -a $ETCDIR/$DYNDNSDOMAIN.keys > $ETCDIR/key.$GAST

Damit wird eine zentrale Datei mit allen Keys und eine Datei mit dem Key für einen bestimmten Client erstellt. Der Inhalt sieht wie folgt aus:

key "client1.dyndns.controlc.de" {
   algorithm hmac-md5; 
   secret "fR49NctF3h1a/BCqcMGyw"; 
};

Unter der Option secret finden wir das Passwort, mit dem sich der Client am DNS-Server authentifiziert.

Nun verändern wir Besitz und Zugriffsrechte der Datei mit allen Keys:

chown root:bind $ETCDIR/$DYNDNSDOMAIN.keys
chmod u=rw,g=r,o= $ETCDIR/$DYNDNSDOMAIN.keys

Und schließlich müssen die Keys auch Bind bekannt gemacht werden:

echo -e "// DDNS keys" >> $ETCDIR/named.conf.local
echo -e "include \"$ETCDIR/$DYNDNSDOMAIN.keys\";" >> $ETCDIR/named.conf.local

Damit alle Konfigurationen aktiv werden, muss Bind erstmal neu gestartet werden:

service bind9 restart

Tests

Mit folgendem Skript kann man testen, ob man mit der entsprechenden Key-Datei den DNS-Server aktualisieren kann

cat < < EOF | nsupdate -k $ETCDIR/key.$GAST
server $HOSTSERVER
zone $DYNDNSDOMAIN.
update delete $GAST.
update add $GAST. 60 A 10.10.10.10
update add $GAST. 60 TXT "Updated on $(date)"
send
EOF

Und ob es geklappt hat, findet man mit

host $GAST $HOSTSERVER

heraus.

Das war doch nicht so schwierig, oder?

Und wie man den dynamischen DNS-Eintrag vom Client aus aktualisiert, erkläre ich in einem nächsten Beitrag.

Quellen

Um diese Anleitung zu schreiben, habe ich viel recherchiert und habe in den folgenden Seiten Inspiration bekommen. Vielen Dank den Autoren!

15 Gedanken zu „debian | selbstgehosteter DynDNS-Dienst

  1. Marty

    Danke für die tolle Anleitung!
    Kannst du Anbieter nennen, bei denen ich einen „kleinen VPS-Server“ ab 12 Euro im Jahr bekomme, um dort meinen eigenen DynDNS-Dienst laufen zu lassen?

    Antworten
    1. controlc.de Beitragsautor

      Hallo Marty,

      es gibt viele Anbieter auf dem Markt und man muß abwägen, wieviel man sparen kann im Gegensatz zu dem Ärger, den man hat, wenn der Anbieter nicht zuverlässig ist. Ok, 12€ im Jahr sind jetzt nicht wirklich viel, aber Kleinvieh …
      Ich habe, auch aus diversen anderen Gründen, einen VPS in den USA gesucht und bin bei buyvm.net hängen geblieben, die haben nach diversen Aussagen im Netz einen recht guten Ruf. Aber Du kannst auch bei LowEndBox vorbeischauen, oder bei regelmäßig nachschauen. Schön fand ich auch die Darstellung von LowEndStock. Es liegt nun an Dir :). Solltest Du auch einen VPS bei BuyVM ordern, so wäre es nett, wenn Du das über diesen Link machen würdest, dann habe ich auch etwas davon :).

      Antworten
  2. Marty

    Vielen Dank für die hilfreiche Antwort!
    Bei LowEndBox und LowEndStock habe ich schon einige attraktive Angebote gefunden!
    Ich würde dich ja gerne über BuyVM belohnen, ziehe aber (nicht nur aus aktuellem Anlass) einen Server in deutschen Landen vor,,,

    Antworten
  3. Zak

    Die Anleitung hat leider einige Fehler und ist daher in dieser Form unbrauchbar. Da die Konfigurationsdateien nicht mit benötigtem Inhalt abgebildet sind, sondern hierzu undurchsichtige echo-Kommandos bereitstehen, die die notwendigen Zeilen hinzufügen (sollen) macht das Debugging zusätzlich schwierig.
    Ein Copy/Paste was denke ich die Intuition war funktioniert nicht, da das Escaping verkehrt zu sein scheint. Eine ORIGIN-Variable wird verwendet, die nirgends gesetzt wird. Merkwürdiges Tutorial. Gute Idee, aber lieber zweimal drüber schauen und sicherstellen, dass es funktioniert, bevor man sowas online nimmt.

    Antworten
  4. controlc.de Beitragsautor

    Hallo Zak,

    ich danke Dir für Deinen Kommentar und werde mir das nächste Mal nach dem Publizieren noch einmal den Artikel durchlesen. Denn leider hat das Syntax Highlight Tool, welches ich benutze, ein Problem mit den Hochkommata, die es escapen möchte. Wie Du schon richtig festgestellt hast, habe ich versucht aufgrund einer zukünftigen Kopieren/Einfügen-Aktion die Inhalte der Konfigurationsdateien direkt von der Kommandzeile aus mit echo-Befehlen zu befüllen. Leider hat mir das Tool (s.o.) einen Strich durch die Rechnung gemacht.
    Ich würde aber nicht behaupten, dass diese undurchsichtig sind (einfach sich am Zeilenanfang das echo -e \“ und am Zeilenende das Hochkomma wegdenken).

    Einem Fehler bist Du aber unterlegen: Die Variable ORIGIN in der Zonen-Datei muß genau so gesetzt sein, da diese nichts mit meinen Befehlen zu tun hat sondern von Bind gesetzt wird.

    Solltest Du jetzt noch Fragen habe, so schreib doch diese bitte konkret oder aber korrigiere mich, damit ich wiederrum den Artikel aktualisieren kann.

    Antworten
  5. Robert

    Hallo,

    biete einen DynDNS Dienst an, schaut einfach vorbei und erspart euch die Konfiguration des DNS Servers ( ist kein lustiger spaß ) dabei biete ich NS / A / MX Einträge.
    Eigene Dashboard für die Domain Verwaltung. Und das alles auch noch kostenlos.

    Grüße
    Robert

    Antworten
    1. controlc.de Beitragsautor

      Hallo Robert,

      ich habe lange überlegt, ob ich Deinen Kommentar einfach so lösche oder wie ich mit so offensiver Werbung umgehen soll. Letztendlich habe ich mich dazu entschlossen aus Deinem Kommentar jeden Verweis auf Deine Webseite zu entfernen und Dir öffentlich zu antworten.
      Möglicherweise waren die Beweggründe für Deinen Kommentar ehrlicher Natur, aber bevor Du so offensiv für Deinen Dienst hausieren gehst, wäre es nett gewesen mich vorher zu fragen, ob ich das toleriere. Denn immerhin bist Du bie mir „zu Hause“.
      Schließlich kann ich zu solch einem Dienst nur sagen, dass es natürlich jedem selbst überlassen ist, wem er seine Daten anvertraut – mit einem DNS kann man auch viel Schindluder treiben, denn was ist, wenn der Betreiber alles auf seinen eigenen Server umleitet? Was ich damit sagen will: Wählt nur den Anbieter aus, dem ihr auch wirklich vertrauen könnt und fragt Euch, was dessen Beweggründe sein können. Oder macht es selbst.
      Und was Deinen Kommentar „ist kein lustiger spaß“ angeht: Ich denke, ich habe in meinem Artikel gut erklärt, wie man es machen kann und dass es gar nicht so schwierig ist. Ob das natürlich Spaß macht, kann ich natürlich nicht sagen.

      In dem Sinne …
      Michael

      Antworten
  6. JCP

    echo -e “ 3600 ; refresh (1 hour)“ >> $BINDDIR/$DYNDNSDOMAIN

    sollte wohl

    echo -e “ 3600 ; refresh (1 hour)“ >> $BINDDIR/$DYNDNSDOMAIN

    heißen?

    Antworten
    1. controlc.de Beitragsautor

      Ich musste Deinen Kommentar mehrfach lesen um dann nochmal meinen Artikel querzulesen um zu verstehen, dass ich da einen Typo drin hatte – danke für den Hinweis.

      WordPress ist da echt anstrengend, wenn man zwischen dem Visuellen und dem Text-Editor hin- und herspringt.

      Antworten
  7. Ben

    Vielen Dank für das Tut, aber wo ist der Clientteil ?

    Ich würde die eMail noch als Variable machen
    und bei dem
    cat < < EOF | nsu
    ist ein Leerzeichen zwischen den < <

    Schönen Gruß

    Antworten
    1. controlc.de Beitragsautor

      Hallo Ben,

      vielen Dank für Deinen Kommentar, auf den ich jetzt erst reagiere.
      Am Client-Teil arbeite ich noch. Ehrlich gesagt funktioniert es bei mit wunderbar, aber die Lust fehlt das nochmal in Prosa zu fassen um es hier zu veröffentlichen. Ich werde mich aber jetzt angestachelt dazu fühlen :).

      Und was das Test-Skript angeht: Ja, zwischen den zwei „<" ist ein Leerzeichen, was nicht dahin gehört. Leider macht das Syntax-Highlight-Tool genau das und ich kann es nicht verhindern. Ich werde aber den Autor des Plugins mal kontaktieren - vielleicht kann er es korrigieren.

      Antworten
  8. Daniel

    Vielen Dank für das Tutorial.
    Ich versuche gerade die Zonendatei nachzuvollziehen. Mein Setup ist geringfügig anders, da mein DNS-Server bereits master für meine 2nd-level Domain ist. Ich verstehe trotzdem einige konfigurationen in der Zonendatei nicht.
    Von oben nach unten:
    1. Warum setzt du $ORIGIN auf „.“? ORIGIN ist doch ein Platzhalter, der entweder mit „@“ aufgerufen werden kann, oder nicht vollqualifizierter Namen einer Domain ergäntz, oder täusche ich mich da?
    2. Ich hätte gedacht dass in der dritten Zeile $DYNDNSDOMAIN ein vollqualifizierter Name einer Domain hätte sein müssen, also $DYNDNSDOMAIN. (mit einem Punkt dahinter). OK, beim nochmaligen anschauen fällt mir auf, dass natürlich der „.“ aus $ORIGIN den nicht vollqualifizierten Namen der Domain $DYNDNSDOMAIN ergänzt, aber warum so kompliziert?
    3. Warum definierst du in Zeile 11 $ORIGIN? Danach kommen doch gar keine Zeilen mehr wo der Platzhalter anwendung findet.

    Ich freu mich auf Deine Antwort.
    Viele Grüße,
    Daniel

    Antworten
    1. controlc.de Beitragsautor

      Hallo Daniel,

      zuerst einmal möchte ich mich für die späte Nachricht entschuldigen. Dann möchte ich vorausschicken, dass ich auf keinen Fall ein Bind-Experte bin. Ich habe mir zwar einiges angelesen, aber vieles habe ich auch einfach nur aus meinen Quellen übernommen. Da es funktioniert hat und m.E. keinen Schaden anrichtet, habe ich es nicht weiter hinterfragt. Nun aber zu Deinen Fragen:

      1. Warum setzt du $ORIGIN auf “.”? ORIGIN ist doch ein Platzhalter, der entweder mit “@” aufgerufen werden kann, oder nicht vollqualifizierter Namen einer Domain ergäntz, oder täusche ich mich da?

      M.E. zielt der Punkt auf die definierte (TLD-)Domain ab. Es könnte also sein, dass in meinem Falle dieser Eintrag unnötig ist, da ja Hetzner bereits den DNS-Eintrag gesetzt hat.

      2. Ich hätte gedacht dass in der dritten Zeile $DYNDNSDOMAIN ein vollqualifizierter Name einer Domain hätte sein müssen, also $DYNDNSDOMAIN. (mit einem Punkt dahinter). OK, beim nochmaligen anschauen fällt mir auf, dass natürlich der “.” aus $ORIGIN den nicht vollqualifizierten Namen der Domain $DYNDNSDOMAIN ergänzt, aber warum so kompliziert?

      Frag mich bitte nicht, ich habe das bei Bahut so gelesen und fand es schlüssig. Da mir aber Bind nicht sonderlich nahe ist, habe ich an Optimierungen nicht gedacht.

      3. Warum definierst du in Zeile 11 $ORIGIN? Danach kommen doch gar keine Zeilen mehr wo der Platzhalter anwendung findet.

      Doch, da dies die Zonen-Datei ist, kommen nach dieser Zeiöe alle dynamischen DNS-Updates dahinter. Und die sollten doch in der richtigen Zone definiert sein, oder?

      Aber mal prinzipiell gefragt: Wie sollten Deiner Meinung nach die Dateien aussehen? Was hast Du bei Dir optimiert und funktioniert es auch :)? Ich bin für Vorschläge immer offen …

      Antworten
      1. Daniel

        Ich habe meine Zonendatei so aufgebaut wie ich meine das von bind zu kennen, aber ich bin weiß Gott alles andere als ein Experte:

        $ORIGIN $DYNDNSDOMAIN.
        $TTL 60 ; 60 seconds = 1 minute

        ; name ttl class rr name-server email-addr
        @ IN SOA $HOSTSERVER. admin.raeuberhoehle.net
        2014062701 ; serial (10 digit field)
        3600 ; refresh – 1 hour
        1800 ; update retry – 30 minutes
        1209600 ; expire time – 2 weeks
        1800 ; minimum – 30 minutes
        )
        NS $HOSTSERVER.
        A IP.ZU.DYNDNS.DOMAIN

        Dazu ist folgendes zu sagen:
        – Bei $ORIGIN habe ich wie schon in der Frage meinen vollqualifizierten Domainnamen angegeben
        – Bei bind muss die Seriennummer 10 Zahlen umfassen. Der DynDns betrieb scheint dort aber eine Ausnahme zu sein und es wird „empfohlen“ einfach, wie in deinem Tutorial, mit 1 anzufangen. Das habe ich aber erst später herausgefunden. Eine 10-stellige Zahl funktioniert aber auch. Lässt im Endeffekt natürlich nicht so viele Updates zu und ist daher natürlich nicht sonderlich schlau, da die Zahl bei jeder Änderung inkrementiert werden muss (mindestens um 1).
        – Der A-Eintrag am Ende ist natürlich nicht nötig, der wird ja vom Skript erzeugt. Aber ich wollte erst mal sehen ob das ganze ohne die updates funktioniert. Divide and Conquer style eben.

        Interessanterweise baut bind die Zonen-Datei nach den ersten Updates um, so dass sie fast genauso aussieht wie bei dir im tutorial. Also $ORIGIN wird auf . gesetzt.

        Und zum dritten Teil meiner Frage:
        Meines Wissens wird die Zone nicht über $ORIGIN definiert, sondern über das was in named.conf steht, also quasi durch alles was in der Datei steht welche in named.conf (file \“$BINDDIR/$DYNDNSDOMAIN\“;“) angegeben wird. $ORIGIN ergänzt nur noch vollständig qualifizierte Domänennamen.
        Da die Einträge die durch das Update hinzugefügt werden aber gar keine Domänennamen enthalten sondern Adresseinträge der Art „A IP.ZU.DYNDNS.DOMAIN“ sind ist die Änderung von $ORIGIN unwichtig oder dagen wir überflüssig – Schaden tut sie aber wohl nicht.
        Die von bind umgebaute Zonen-Datei enthält diesen Eintrag jedenfalls nicht.

        Bei mir war das Ganze aber noch etwas anders, da „ich“ selbst Zone Master für meine Domäne, also in deinem Beispiel controlc.de, bin. Die Einstellungen die du bei deinem Anbieter gemacht hast musste ich daher in meiner Zonen-Datei machen.
        Und ich muss sagen, zuerst war mir gar nicht klar, wie genau die DNS-Abfrage für (m)eine DynDns-Domäne genau funktioniert 🙂
        Und demnach auch nicht dass ich meinen DynDns- Domänennamen (bei dir dyndns) mit einem Nameserver assoziieren muss. Im nachhinein ziemlich logisch, aber ich dachte zu dem Zeitpunkt, dass ich ja sowieso schon einen Nameserver für meine Zone, zu der ja auch irgendwie meine Subdomain gehört, betreibe und warum sollte ich also quasi ein loop auf meinen Nameserver machen …
        Naja, ich habs dann doch kapiert. Es liegt natürlich daran, wie ein DNS-Lookup die IP des Servers mit der dynamischen IP-Adresse herausfindet.

        Mir war Dein Tutorial eine große Hilfe. Man könnte natürlich noch einen kleinen Exkurs machen (nach dem zweiten Listing), wie genau die DNS-Abfrage abläuft und wie die Einträge im Listing damit zusammenhänge, aber das kann der geneigte Leser sich ja auch wo anders besorgen. Die Konfigurationsdatei passen so auf jeden Fall und brauchen eigentlich keiner Änderung/Optimierung 😉

        In dem Sinne alles gute!

        Antworten
  9. Pingback: debian | selbstgehosteter DynDNS-Dienst – der Client-Teil › controlc.de

Schreibe einen Kommentar

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