Eigener DynDNS-Dienst mit PowerDNS (PDNS)

Da immer mehr Anbieter eines Dynamischen DNS-Services dazu übergehen, ihre kostenlosen Dienste einzustellen, stelle ich hier für Nutzer des PowerDNS-Servers eine Möglichkeit vor, einen solchen Dienst selbst zu etablieren.

Dazu benötigen wir:

  • einen vollständig eingerichteten PowerDNS Server mit MySQL-Backend
  • folgende installierten, konfigurierten und lauffähigen Dienste:
    • Webserver (bspw. Apache2)
    • PHP mit Apache-Modul php_mysql
    • MySQL-Server

1. Erreichbarkeit des DynDNS-Scripts
Um das Script für die Außenwelt bzw. den eigenen Router (der eine Aktualisierung via DynDNS-Dienste erlaubt) zur Verfügung zu stellen, bestehen mehrere Möglichkeiten:

  • Als einzelne Datei unter der bestehenden Domain und dessen Hauptverzeichnis
  • Als index.php in einer seperaten Subdomain

Ich bevorzuge übersichtshalber die zweite Möglichkeit, so dass die Adresse zur Aktualisierung wie folgt aussehen könnte:

https://dyn.klenzel.de/?bla=blubb

In jedem Fall empfehle ich, den Webserver bzw. den für das Script verwendeten Host für den Zugriff via SSL (https) zu konfigurieren, damit das unten erwähnte Passwort nicht im Klartext übertragen wird.

 

2. Das Script
Wie immer führen viele Wege zum Ziel, daher möchte ich hier nur eine rudimentäre Vorgehensweise zeigen, ein solches Script zu realisieren.

<?php

mysql_connect("DBHOST", "DB-NUTZER", "PASSWORT") or die(mysql_error());
mysql_select_db("DATENBANK") or die(mysql_error());

$pass1=mysql_real_escape_string($_GET['pass']);
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
$host=mysql_real_escape_string($_GET['host']);


switch ($host) {
case "zuhause":
        $pass2="abc123";
        break;
default:
        $pass2=FALSE;
    break;
}

if (($pass1 != $pass2) OR (!$pass2)) {
        echo "Falsches Passwort oder unbekannter Host";
        exit;
}

$domain=$host.".dyn.klenzel.de";
$domain2="*.".$domain;

$result1=mysql_query("UPDATE records SET content='$ip' WHERE name='$domain';");
$result2=mysql_query("UPDATE records SET content='$ip' WHERE name='$domain2';");

?>

Zur Erklärung des Scripts: Sollte der (DSL-)Router zuhause dieses Script aufrufen, wird somit gleichzeitig die IP des Aufrufenden übermittelt und kann in diesem Script verwertet werden. In der aufzurufenden Adresse wird zusätzlich die Subdomain übermittelt, die aktualisiert werden soll sowie zur einfachen Absicherung ein Passwort. Mit der Übergabe der Subdomain ist es Möglich, mehrere Personen dieses Script nutzen zu lassen.

Anschließend werden die Daten validiert und die jeweiligen Einträge in der Tabelle „records“ der Datenbank von PowerDNS mit der jeweils aktuellen IP aktualisiert.

Dafür ist es notwendig, die entsprechende Subdomain vor Nutzung des Scripts anzulegen. Aufgrund der DynDNS-Funktionalität empfiehlt sich hier eine möglichst niedrige TTL zu wählen, beispielsweise 3600 Sekunden.

Als kleine Erweiterung habe ich in der Konfiguration des PDNS (/etc/pdns/pdns.conf) die sog. wildcard-url aktiviert und für jede DynDNS-Subdomain einen solchen Wildcard-Record (*.subdomain) erstellt.

wildcard-url=yes

Die zweite „UPDATE“-Anweisung im Script aktualisiert daher diese Wildcard-Subdomain.

 

3. Einrichtung im (DSL-)Router
Damit nun bei jeder Änderung der öffentlichen IP-Adresse des heimischen DSL-Anschlusses der DNS-Eintrag im PDNS-Server geändert wird, muss dies im DSL-Router konfiguriert werden. Als Beispiel zeige ich dies hier anhand einer Fritzbox 7270:

Unter dem Punkt „Internet“ ⇒ „Freigaben „Dynamic DNS“ befindet sich die Möglichkeit dieses zu aktivieren und konfigurieren.

fritz-dyndns

 

3.1 Dynamic DNS-Anbieter
Nachdem der Haken bei „Dynamic DNS benutzen“ gesetzt wurde, wählen wir im Feld „Dynamic DNS-Anbieter“ den Punkt „Benutzerdefiniert“.

 

3.2 Update-URL
Nun tragen wir den wichtigsten Punkt ein, die „Update-URL„. Diese setzt sich aus der von uns gewählten Update-URL (Punkt 1), dem Passwort sowie der Subdomain (Punkt 2) zusammen. Ist das Script aus Punkt 2 beispielsweise unter http://dyn.klenzel.de/index.php zu erreichen, wollen wir die Subdomain „zuhause“ aktualisieren und haben wir für diese Subdomain im Script das Passwort „ab123“ gewählt, lautet die Update-URL im Ganzen so:

https://dyn.klenzel.de/?domain=zuhause&pass=ab123

Sollte das Script unter index.php gespeichert worden sein, kann dieser Dateiname in der URL weggelassen werden.

 

3.3 Domainname
Der Inhalt dieses Feldes spielt für das Script keine Rolle, kann jedoch zur Übersichtlichkeit eingetragen werden:

zuhause.klenzel.de

 

3.4 Benutzername, Kennwort und Kennwortbestätigung
Diese beiden Felder spielen für unser Script ebenfalls keine Rolle, da diese an dieser Stelle nicht ausgewertet werden. Da jedoch zumindest die FritzBox an dieser Stelle eine Eingabe erwartet, können hier beliebiege Werte eingetragen werden (jedoch sollten natürlich Kennwort und Kennwortbestätigung übereinstimmen, da die FritzBox dies überprüft)

 

4. Speichern und Prüfen
Nachdem alle Einstellungen gespeichert worden sind, sollte der DSL-Router direkt eine Aktualisierung druchführen. Dies können wir bei unserem Webserver (hier auf einem RedHat-basierenden System) beispielsweise wie folgt prüfen:

tail /var/log/httpd/access.log

Erscheint nun die Abfrage von der aktuellen heimischen IP, gilt es nun zu prüfen, ob die notwendigen Einträge in der MySQL-Datenbank aktualisiert wurden. Die jeweils aktuelle, öffentliche IP, mit welcher man sich zur Zeit im Internet bewegt, zeigt u.a. die Seite https://de.vpnmentor.com/tools/ipinfo/

Stimmt die IP-Adresse in der MySQL-Datenbank mit der aktuellen überein, hat der Update-Vorgang des DSL-Routers funktioniert und unser Heim ist ab sofort unter der konfigurierten dynamischen DNS-Adresse erreichbar. Wie es nun weiter geht, also welche Dienste hinter dieser Adresse (bzw. den Adressen, es wurde ja eine Wildcard-Subdomain angelegt) etabliert werden ist dann natürlich jedem selbst überlassen.