tas2580
Blog über Webentwicklung

Eigener Nameserver / Eigenes DynDNS

tas2580  

Ich benutze schon seit einigen Jahren für z.B. VPN-Verbindungen nach hause DynDNS. Das Problem ist nur, dass es praktisch nur noch Anbieter gibt bei denen man sich alle paar Wochen manuell anmelden muss da der Account sonst gelöscht wird. Das führt dann dazu, dass immer dann wenn ich von unterwegs auf mein Heimnetzwerk zugreifen möchte das DynDNS mal wieder nicht funktioniert. Also wurde es Zeit das mal selber in die Hand zu nehmen, mit einer richtigen Domain ist das eh schöner wie mit den Domains die man bei den DynDNS Anbietern bekommt.

Nameserver einrichten

Man braucht mindestens einen Nameserver auf dem man per Script Einträge ändern kann. Mit dem Nameserver kann man dann gleich mehrere Domains verwalten und hat deutlich mehr Freiheiten wie wenn man den Nameserver von seinem Hoster benutzt. Der Nameserver sollte auf einem Rechner laufen der über eine feste IP-Adresse verfügt und immer läuft.

Benötigt wird:
  • Eine Domain (example.com)
  • Server mit fester IP Adresse (192.0.2.1)

Für die Domain braucht man die Möglichkeit eigene Nameserver einzutragen und Glue-Records anzulegen, bei den meisten Providern sollte das möglich sein. Als Server benutzt man am besten einen extra (V)Server, zur Not kann man aber auch seinen Webserver dazu missbrauchen, wobei Nameserver und Webserver auf der selben IP/Maschine nicht gut ist. Ich habe mir für den Nameserver einfach bei myvirtualserver.com den kleinsten Server für 15€/Jahr bestellt, viel Leistung ist für einen reinen Nameserver nicht nötig.

Jetzt kann man auf dem Server die nötigen Pakete installieren. Alle hier beschriebenen Schritte müssen als root ausgeführt werden.

apt-get update
apt-get install bind9 bind9-doc dnsutils

Neben dem Nameserver Bind werden hier noch weitere Tools installiert die später zum Testen der Konfiguration genutzt werden.

Zone anlegen

Nachdem bind installiert wurde kann man damit beginnen Zonen anzulegen, dieser Schritt kann für jede Domain die man verwenden möchte wiederholt werden. Der Dateiname beginnt immer mit der Domain und endet mit .zone, für jede Domain wird eine extra Datei angelegt. Man kann auch eigene Zonen für subdomains anlegen, aber darauf gehe ich hier nicht näher ein.

nano /var/cache/bind/example.com.zone

Da die Datei noch nicht vorhanden ist wird eine leere Datei für die Domain example.com angelegt die man mit folgendem Inhalt füllt:

$ORIGIN .
$TTL 86400	; 1 day
example.com		IN SOA	ns1.example.com. mail.example.com. (
				2018030601 ; serial
				3600       ; refresh (1 hour)
				900        ; retry (15 minutes)
				1209600    ; expire (2 week)
				86400      ; minimum (1 day)
				)
			NS	ns1.example.com.
			NS	ns2.example.com.
			A	192.0.2.1
			MX	10 mx1.example.com.
			MX	20 mx2.example.com.

$ORIGIN example.com.
ns1			A	192.0.2.1
ns2			A	204.42.254.5
www			A	192.0.2.1

Über $TTL wird die Zeit in Sekunden angegeben die alle darauf folgenden Einträge gültig sein sollen. Der SOA (Start Of Authority) Eintrag besteht aus der Domain für die er gelten soll, dem Nameserver und einer E-Mail Adresse, wobei in der E-Mail das @-Zeichen durch einen Punkt ersetzt wird, hier ist also mail@example.com gemeint. Danach kommen noch einige Parameter deren Funktion als Kommentar in der Datei steht. Der serial Parameter wird aus dem Datum und der Version der Änderung zusammengesetzt. In diesem Beispiel ist es Version 1 vom 6.3.2018, das funktioniert allerdings auch wenn man hier nicht all zu genau bei der Angabe ist.

Als nächstes folgen die NS-Einträge für die Nameserver so wie ein A-Eintrag für die IPv4 der Domain und MX-Einträgen für E-Mail. Hier können auch alle weiteren gewünschten Einträge für die Domain example.com gemacht werden.

Am Ende werden dann noch die Subdomains eingetragen, in dem Beispiel werden Subdomains für zwei Nameserver und die Subdomain www angelegt. Als erster Nameserver wird unser Server (192.0.2.1) verwendet, als zweiter Nameserver wird der Server von puck.nether.net (204.42.254.5) verwendet. Der Eintrag für den zweiten Nameserver ist nicht zwingend nötig, aber es sieht später einfach schöner aus wenn man ns1 und ns2 als Nameserver für die Domain angeben kann. Hier können auch weitere Einträge wie AAAA oder TXT gemacht werden.

Wenn man die Datei bearbeitet hat kann man mit STRG + o die Datei speichern und mit STRG + x den Editor verlassen und die Einstellungen testen.

named-checkzone example.de /var/cache/bind/example.de.zone

Zone einfügen

Wenn der Test erfolgreich war kann man die Zone im Nameserver einfügen, dazu öffnet man die Datei /etc/bind/named.conf.local mit dem Editor.

nano /etc/bind/named.conf.local

Hier fügt man einfach folgendes am ende der Datei ein. Wenn man mehrere Zonen anlegen möchte kann man die Einträge für die Zonen einfach untereinander schreiben.

zone "example.com." IN {
  type master;
  file "example.com.zone";
  allow-query { any; };
  allow-transfer {
    204.42.254.5;  # puck.nether.net
    # weitere DNS
  };
  allow-update { 127.0.0.1; };
  notify yes;
}

Mit type master; wird festgelegt, dass es sich um den Master Server handelt. file "example.com.zone"; gibt die Datei in der die Zone gespeichert ist an. Mit allow-query { any; }; wird jedem beliebigen Rechner erlaubt den Namesever abzufragen, wenn man die Domain nur Netzintern auflösen möchte kann man hier den Zugriff einschränken, bei Domains die im Internet genutzt werden sollen ist das aber keine gute Idee. Unter allow-transfer werden die IP-Adressen der Nameserver aufgelistet die als Slave verwendet werden, immer wenn ich ein Eintrag ändert werden diese Server darüber benachrichtigt so, dass sie eine Kopie der Zone machen können. Hier ist schon die IP von puck.nether.net eingetragen da wir die später als Slave verwenden wollen. allow-update { 127.0.0.1; }; erlaubt dem Server selber Zonen zu ändern, das ist für DDNS wichtig, wenn man kein DDNS verwenden möchte kann man hier auch allow-update { none; }; verwenden.

Die Einstellungen können auch wieder geprüft werden, wenn der Befehl nichts ausgibt ist das ein gutes Zeichen.

named-checkconf /etc/bind/named.conf.local

Bind starten

Die Konfiguration des Nameservers ist jetzt abgeschlossen und man kann bind starten bzw. neu starten.

service bind9 restart

Jetzt kann geprüft werden ob der Nameserver die Domain auch kennt und die richtige IP-Adresse zurück gibt.

nslookup www.example.com 127.0.0.1

Wenn hier keine Fehler angezeigt werden ist der Nameserver einsatzbereit und kann verwendet werden.

Slaves einrichten

Da man für eine Domain mindestens zwei Nameserver verwenden sollte brauchen wir noch einen Slave, dazu kann man entweder noch einen Server mieten und selber einrichten, oder man benutzt einfach einen Nameserver der das anbietet.

Auf https://puck.nether.net/dns/login kann man sich ein Konto erstellen und dort Domains eintragen. Nachdem man sich ein Konto erstellt und sich angemeldet hat kann man über Add a new domain seine Domain hinzufügen. Als Domain trägt man einfach seine Domain (example.com) und bei MasterIP die IP (192.0.2.1) des Nameservers ein.

Wenn man noch weitere Nameserver hinzufügen möchte kann man das tun, Anbieter für Slave Nameserver gibt es mehrere, die nötigen Schritte sind eigentlich immer die gleichen wie bei puck.nether.net

Jetzt muss man ein bisschen warten bis der Slave sich die Daten vom Master geholt hat, wann es so weit ist kann man wider mit nslookup prüfen.

nslookup www.example.com puck.nether.net

Domain umstellen

Jetzt muss man eigentlich nur noch seine Domain umstellen da die immer noch die Nameserver des Providers benutzt. Außerdem müssen die Glue Records angepasst werden da die Domain jetzt einen Nameserver aus der eigenen Zone verwendet, der Nameserver der für ns1.example.com zuständig ist ist also unser eigener Nameserver dessen IP in der übergeordneten Zone (.com) bekannt gegeben werden muss da der Nameserver ja schleicht sich selber fragen kann solange er sich nicht kennt.

Wie man die Domain genau umstellt ist von Anbieter zu Anbieter verschieden, ich habe hier mal Anleitungen zu den bekanntesten Domain Anbietern rausgesucht, wenn dein Anbieter dort nicht dabei ist schau einfach mal im Supportbereich deines Anbieters nach. Als Nameserver verwendet man ns1.example.com und ns2.example.com. Falls man weitere Slaves angelegt hat kann man die natürlich auch eintragen.

Bis die Änderungen an der Domain übernommen wurden dauert es auch wieder bis zu 48 Stunden, prüfen kann man seine DNS Einstellungen auf dnscheck.pingdom.com/, wenn da alles OK ist hat man seine Domain erfolgreich auf den eigenen Nameserver umgestellt.

Dynamisches DNS

Da man jetzt die DNS Einträge incl. Gültigkeitsdauer für example.com (und Subdomains) selber bestimmen kann, kann man auch Einträge mit kurzer Gültigkeitsdauer für dynamische IP-Adressen anlegen. Man muss einfach nur dem Nameserver Bescheid sagen wenn sich die IP ändert, der Nameserver passt dann den DNS Eintrag an. Ich habe zur Kommunikation meiner Server untereinander ein recht umfangreiches System das ich hier nicht komplett beschreiben will. Deshalb beschreibe ich hier eine vereinfachte Lösung mit einem Webserver auf dem Nameserver, beachte das es nicht gerade sicher ist das so zu betreiben, für kurze Versuche reicht es aber aus.

Man benötigt einen PHP fähigen Webserver auf dem das PHP-Script läuft um die IP Adresse zu ändern. Das zum ändern der Einträge sieht grob folgendermaßen aus:

Das Script muss unbedingt noch extra abgesichert werden, außerdem sollte $_SERVER['REMOTE_ADDR'] auf gültige Werte geprüft werden.

<?php
$ip 
$_SERVER['REMOTE_ADDR'];
$data "<<EOF
server localhost
zone example.com
update delete dyndns.example.com A
update add dyndns.example.com 180 A 
$ip
send
EOF"
;
exec("/usr/bin/nsupdate $data");
?>

Jedes mal wenn das Script aufgerufen wird bekommt dyndns.example.com die IP Adresse von dem Computer der das Script aufgerufen hat zugewiesen. Da der Eintrag eine Gültigkeitsdauer von 3 Minuten (180 Sekunden) hat kann man ihn gut aktuell halten. Das Script kann man natürlich noch erweitern so, dass z.B. auch AAAA Records für IPv6 eingetragen werden. Auch mehrere Subdomains gleichzeitig sind möglich, so kann man falls man zuhause IPv6 verwendet jedem Rechner eine eigene Domain zuweisen die dann zwar nur einen AAAA Record auf die direkte IP des Rechners hat, aber besser wie nichts.

Jetzt muss man nur noch dafür sorgen, dass der DNS Eintrag auch aktualisiert wird wenn sich zuhause am DSL Anschluss die IP Adresse ändert. Dazu kann man falls man einen Rechner hat der eh immer läuft einfach alle 3 Minuten das PHP-Script auf dem Nameserver aufrufen, oder den Router dazu benutzen. Der Vorteil vom Router ist, dass er recht gut weiß wann sich die IP des DSL Anschluss ändert und nur dann dem Nameserver Bescheid geben muss. Außerdem läuft der Router eh immer, zumindest dann wenn man zuhause Internet hat und ohne braucht man auch kein DNS. Viele Router haben die Möglichkeit DynDNS zu konfigurieren, meistens kann man in einer Liste aus DynDNS Anbietern auswählen, wenn man "Manuel" o.Ä. auswählt kann man eine eigene URL angeben. Hier muss einfach die URL auf dem das PHP-Script zum aktualisieren des Nameservers läuft eingetragen werden.


Kommentare


Bitte warten ...

Kommentar schreiben

URLs werden automatisch umgewandelt.
[b]DEIN TEXT[/b] für Fett gedruckt
[quote]DEIN ZITAT[/quote] für Zitate
[code]DEIN CODE[/code] für Code
captcha