Eigenes DynDNS mit PowerDNS

Aus LT42-Wiki
Zur Navigation springen Zur Suche springen

Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren oder sich anderwaltig umzuschauen. Ich habe mich dann für no-ip.org entschieden, mit dessen Service ich bis heute sehr zufrieden. Lediglich einmal kam es zu DNS-Problemen, die dann aber auch schnell gelöst waren. Da ich öfter DynDNS-Dienste einsetze, lege ich für alle Kunden verschiedene Konten an, was dann natürlich gerne mal zu Passwortverwechslungen führt.

DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei Uwe Debacher beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern PowerDNS, der seine Domain-Daten in einer Datenbank speichert. Dadurch sind sie durch PHP manipulierbar und können so ohne wenig Aufwand von außen aktualisiert werden.

Installation von PDNS

Wir erstellen danach eine Datenbank mit einem Benutzer. Und fügen folgendes Datenbank-Schema ein:

CREATE TABLE IF NOT EXISTS 'domains' (
  'id' int(11) NOT NULL,
  'name' varchar(255) NOT NULL,
  'master' varchar(128) DEFAULT NULL,
  'last_check' int(11) DEFAULT NULL,
  'type' varchar(6) NOT NULL,
  'notified_serial' int(11) DEFAULT NULL,
  'account' varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS 'hostnames' (
  'hostname' varchar(255) NOT NULL,
  'userid' varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS 'records' (
  'id' int(11) NOT NULL,
  'domain_id' int(11) DEFAULT NULL,
  'name' varchar(255) DEFAULT NULL,
  'type' varchar(10) DEFAULT NULL,
  'content' varchar(255) DEFAULT NULL,
  'ttl' int(11) DEFAULT NULL,
  'prio' int(11) DEFAULT NULL,
  'change_date' int(11) DEFAULT NULL,
  'ordername' varchar(255) DEFAULT NULL,
  'auth' tinyint(1) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS 'users' (
  'id' varchar(255) NOT NULL,
  'password' varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE 'domains'
 ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'name_index' ('name');

ALTER TABLE 'hostnames'
 ADD PRIMARY KEY ('hostname'), ADD UNIQUE KEY 'hostname_index' ('hostname');

ALTER TABLE 'records'
 ADD PRIMARY KEY ('id'), ADD KEY 'rec_name_index' ('name'), ADD KEY 'nametype_index' ('name','type'), ADD KEY 'domain_id' ('domain_id'), ADD KEY 'orderindex' ('ordername'), ADD KEY 'id' ('id');

ALTER TABLE 'users'
 ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'user_index' ('id');

ALTER TABLE 'records'
MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;

Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:

apt-get update
apt-get install pdns-server pdns-backend-mysql

Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen.

Eigentlich steuert man PowerDNS über die Administrationsoberfläche PowerAdmin. Das ist dank PHPMyAdmin aber eigentlich nicht nötig.

PowerDNS läuft standardmäßig noch nicht. Wir passen die Datei /etc/powerdns/pdns.conf wie folgt an (Die Zeilen können einfach auskommentiert und neu eingefügt werden):

allow-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11
allow-recursion=127.0.0.1
daemon=yes
master=yes

Nun lässt PowerDNS den Zonen-Download vom lokalen Server und den Servern von BuddyNS zu (siehe unten), startet als Daemon und sieht sich als Zonen-Master (standardmäßig nämlich nicht).

Nun startet PowerDNS aber noch nicht richtig. Dieser Fehler hat mich einige Zeit gekostet: Unter /etc/powerdns/pdns.d/ müssen zwei Konfiguration-Dateien angepasst werden: In /etc/powerdns/pdns.d/pdns.simplebind.conf kommentieren wir beide Zeilen aus:

#launch=bind
#bind-config=/etc/powerdns/bindbackend.conf

und in /etc/powerdns/pdns.d/pdns.local.gmysql.conf kontrollieren wir die Zugangsdaten zu MySQL und ändern folgende Zeile von yes auf no:

gmysql-dnssec=no

Damit sollte PowerDNS via

service pdns restart

starten.

Eintragen der Zonen

Damit sich unser Server auch als Master für die Domain sieht, müssen wir eine Master Zone anlegen. Das geht über PowerAdmin nach einer Anmeldung über den Link "Master Zone hinzufügen". Der Name der Zone ist der Name der Domain. Unter "Zonen auflisten" können wir dann die Zone mit dem kleinen Stift neben dem Namen bearbeiten. Hier sind vor allem erstmal drei Einträge der Marke "NS" wichtig:

DNS-pdns-zones.png

Diese Einträge sagen den weltweiten DNS-Servern, wer die DNS-Server für unsere Domain sind. Danach müssen wir natürlich die Standard-Records (A für Adressauflösung und MX für Mail) eintragen.

Zweiter Nameserver

Für die Ausfallsicherheit sind Domains immer zwei unterschiedliche Nameserver zuzuweisen. Idealerweise sind beide auch nicht im gleichen Netz. Für alle, die keine zwei getrennten 24 Stunden erreichbaren Server betreiben, bietet sich der Service von http://www.buddyns.com an. Nach dem Registrieren mit Domainname, IP-Adresse des primären DNS-Servers (IP des eigenen Servers) und E-Mail-Adresse bekommt man ein Passwort zugeschickt, mit dem man Zugriff auf das Bullyboard hat:

DNS-buddy-board.png

Hier ist besonders der Reiter "Zones" interessant.

DNS-buddy-zones.png

Bis alles korrekt eingestellt ist, ist der obige Balken noch rot. Haben wir noch keine Einstellungen beim Registrar vorgenommen, sollten die Felder "Authority declares BuddyNS" und "Registry declares BuddyNS" nicht auf OK stehen. Sollte hier aber alles andere stimmen, können wir die DNS-Einstellungen unter http://www.denic.de/hintergrund/nast.html testen. Dazu geben wir unseren Domainnamen und die beiden DNS-Server an. BuddyNS bittet darum, die regionalen Nameserver zu benutzen. Für Europa sind das e.ns.buddyns.com und c.ns.buddyns.com

Gibt die Denic grünes Licht, können wir die Nameserver beim Registrar ändern (meist per Domain-Update o.ä. auslösbar).

Konfiguration Fritz!Box

Die Grundidee ist einfach: Jede Nacht bekommt die Fritz!Box durch den Provider nach der Zwangstrennung eine neue IP-Adresse zugewiesen. Nach diesem Update soll die Fritz!Box die IP-Adresse des DynDNS neu setzen. Sie kann dann auf ein PHP-Script zugreifen, das die Daten in der Datenbank aktualisiert. Das sollte natürlich mit einem Passwort geschützt sein, damit kein Fremder die Domain kapern kann.

Ich benutze momentan eine abgewandelte Version des Scriptes aus der c't und benutze mysqli statt PDO als Datenbank-Anbindung. Sehr wichtig ist es, dass die Seriennummer des DNS-Records im SOA-Record nach einer Änderung hochgesetzt wird. Der Autor arbeitet mit preg_match, um die entsprechende Stelle im Record zu finden und hochzusetzen.

In der Fritz!Box kann man mit Platzhaltern arbeiten, um das PHP-Script aufzurufen. Mehr dazu findet sich in der AVM-Hilfe.

Hinweise zur Konfiguration der Fritz!Box finden sich auch hier: http://www.heise.de/ct/inhalt/2013/24/196/