Eigenes DynDNS mit PowerDNS: Unterschied zwischen den Versionen
Lukas (Diskussion | Beiträge) Die Seite wurde neu angelegt: „Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren od…“ |
Lukas (Diskussion | Beiträge) K Github-Link |
||
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
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. | 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 | DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei [[d:Mein_eigenes_DynDNS|Uwe Debacher]] beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern [https://www.powerdns.com/ 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 == | == Installation von PDNS == | ||
Wir erstellen danach eine | 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: | Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll: | ||
Zeile 13: | Zeile 61: | ||
Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen. | 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 [http://www.poweradmin.org/ 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): | 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-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11 | ||
Zeile 36: | Zeile 84: | ||
== Eintragen der Zonen == | == 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: | 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: | ||
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. | 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. | ||
Zeile 43: | Zeile 89: | ||
== Zweiter Nameserver == | == 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: | 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: | ||
Hier ist besonders der Reiter "Zones" interessant. | Hier ist besonders der Reiter "Zones" interessant. | ||
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 | 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). | 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/ | |||
== Neue Version 2020 == | |||
Wegen eines Serverumzugs musste auch das DynDNS umziehen. Dabei bin ich der zwischenzeitlich umgestellten Version auf eine Subdomain gefolgt. Es reicht dann aus, einen Nameserver-Eintrag für eine Subdomain anzulegen, ohne die Arbeit bei der Registrierungsstelle. Wir benötigen zwei Einträge im DNS der zu verwendenden Domain: | |||
dns.thiel2s.de A w.x.y.z. | |||
ddns.thiel2s.de NS dns.thiel2s.de | |||
Nun können wir *.ddns.thiel2s.de als DynDNS-Adressen nutzen. Dafür nutzen wir weiterhin den PDNS-Server mit MariaDB-Backend. Als Grundlage kommt ein Debian 10 zum Einsatz, auf dem folgende Pakete installiert werden: | |||
apt-get update | |||
apt-get install pdns-server pdns-backend-mysql apache2 php mariadb-server | |||
Als Frontend zur grundlegenden Administration des PDNS kommt der PDNSManager zum Einsatz. Die Doku inkl. Konfiguration des PDNS ist [https://pdnsmanager.org/quickstart/ hier] einzusehen. | |||
Nachdem der Manager installiert wurde, stehen auch die entsprechenden Tabellen zur Verfügung. Nun können wir im PDNS die Datenbankanbindung einstellen. Dafür in der Datei <code>/etc/powerdns/pdns.d/pdns.local.gmysql.conf/</code> muss dafür folgendes eingetragen werden: | |||
launch=gmysql | |||
gmysql-host=localhost | |||
gmysql-port=3306 | |||
gmysql-dbname=pdns | |||
gmysql-user=powerdnsuser | |||
gmysql-password=assword | |||
gmysql-dnssec=no | |||
Für das Update über die Fritz!Box ist nun noch ein Script erforderlich, das die Aktualisierung der Records bei Änderung der IP-Adresse vornimmt. Ein Script, das dazu genutzt werden kann, steht [https://github.com/LT42/ddns-updater hier] zur Verfügung. Wichtig ist, auch die Serial Number des SOA-Records zu aktualisieren. Momentan ist das im Skript fehleranfällig, da ein massiver Aufruf der Skripte die Serial Number außerhalb des darstellbaren Bereichs erhöht. | |||
Ein Aufruf erfolgt dann z.B. über | |||
https://dns.thiel2s.de/poweradmin/updatescript.php?hostname=<domain>&passwort=<pass> |
Aktuelle Version vom 13. März 2021, 13:49 Uhr
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:
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:
Hier ist besonders der Reiter "Zones" interessant.
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/
Neue Version 2020
Wegen eines Serverumzugs musste auch das DynDNS umziehen. Dabei bin ich der zwischenzeitlich umgestellten Version auf eine Subdomain gefolgt. Es reicht dann aus, einen Nameserver-Eintrag für eine Subdomain anzulegen, ohne die Arbeit bei der Registrierungsstelle. Wir benötigen zwei Einträge im DNS der zu verwendenden Domain:
dns.thiel2s.de A w.x.y.z. ddns.thiel2s.de NS dns.thiel2s.de
Nun können wir *.ddns.thiel2s.de als DynDNS-Adressen nutzen. Dafür nutzen wir weiterhin den PDNS-Server mit MariaDB-Backend. Als Grundlage kommt ein Debian 10 zum Einsatz, auf dem folgende Pakete installiert werden:
apt-get update apt-get install pdns-server pdns-backend-mysql apache2 php mariadb-server
Als Frontend zur grundlegenden Administration des PDNS kommt der PDNSManager zum Einsatz. Die Doku inkl. Konfiguration des PDNS ist hier einzusehen.
Nachdem der Manager installiert wurde, stehen auch die entsprechenden Tabellen zur Verfügung. Nun können wir im PDNS die Datenbankanbindung einstellen. Dafür in der Datei /etc/powerdns/pdns.d/pdns.local.gmysql.conf/
muss dafür folgendes eingetragen werden:
launch=gmysql gmysql-host=localhost gmysql-port=3306 gmysql-dbname=pdns gmysql-user=powerdnsuser gmysql-password=assword gmysql-dnssec=no
Für das Update über die Fritz!Box ist nun noch ein Script erforderlich, das die Aktualisierung der Records bei Änderung der IP-Adresse vornimmt. Ein Script, das dazu genutzt werden kann, steht hier zur Verfügung. Wichtig ist, auch die Serial Number des SOA-Records zu aktualisieren. Momentan ist das im Skript fehleranfällig, da ein massiver Aufruf der Skripte die Serial Number außerhalb des darstellbaren Bereichs erhöht.
Ein Aufruf erfolgt dann z.B. über
https://dns.thiel2s.de/poweradmin/updatescript.php?hostname=<domain>&passwort=<pass>