DynDNS Service - Marke Eigenbau [Update]

Nachdem dyn.com den kostenlosen DynamicDNS-Service quasi eingestellt hat, kann ich momentan mein privates Netz von außen nicht mehr erreichen.

Um das zu ändern sehe ich 2 Möglichkeiten:

  1. Ich ziehe zu einem anderen Dynymic DNS Anbieter um, bspw. noip.com
  2. Ich mache mir mein eigenes DynDNS

Ich habe mich für Variante 2 entschieden. So laufe ich nicht Gefahr in wenigen Monaten schon wieder zu einem anderen Anbieter wechseln zu müssen. Zudem gestaltet sich das ganze recht simpel, da ich schon einen Server betreibe der hierfür verwendet werden kann.

Die Einrichtung eines dynamischen DNS teilt sich grob in die folgenden 4 Schritte:

  1. Subdomain für Dynamic DNS wählen 
  2. DNS Records der Hauptdomain anpassen
  3. eigenen Server als Nameserver konfigurieren
  4. Update-Script für DNS Updates erstellen.

1. Subdomain wählen:

Prinzipiell kann man hier jede beliebige SubDomain wählen. Man benötigt allerdings Zugriff auf die DNS-Zone der zugehörigen Hauptdomain. Für das Beispiel in dieser Anleitung werde ich mit folgenden Annahmen arbeiten:

Domain: domain.tld

SubDomain für DynamicDNS: dns.domain.tld

2. DNS Einträge der Hauptdomain anpassen:

Um unsere gewählte SubDomain (oder weitere SubDomains nach dem Schema host1.dns.domain.tld) als DynDNS-Adressen nutzen zu können, müssen wir dns.domain.tld zu einer neuen DNS-Zone machen. Wir sorgen also dafür, dass die DNS Auflösung für diese (Sub-)Domain (und alle darunter) über einen weiteren Nameserver (DNS-Server) erfolgen soll. Diese Aufgabe übernimmt dann unser eigener Server.

Hierfür ergänzen wir die DNS Zone der Hauptdomain (sollte ähnlich zu folgender sein) um die fett markierten Zeilen:

domain.tld 1800 IN NS   dns1.provider.tld
domain.tld 1800 IN NS   dns2.provider.tld
domain.tld 86400 IN MX 10 mail.domain.tld
domain.tld 86400 IN A   <IP>
mail.domain.tld 86400 IN A   <IP>
*.domain.tld 86400 IN A   <IP>
www.domain.tld 86400 IN A   <IP>
dns.domain.tld  1800  IN  NS    ns1.domain.tld
dns.domain.tld  1800  IN  NS    ns2.domain.tld

So werden DNS Clients angewiesen, für die DNS-Zone dns.domain.tld einen weiteren Nameserver für die IP-Zuordnung anzufragen. Diese Zuordnungen können wir dann Problemlos nach belieben ändern, da wir Zugang zu diesem Server haben.

3. Eigenen Server zum Nameserver für die Zone dns.domain.tld machen

Der vorletzte Schritt besteht darin, den Server hinter domain.tld zum Nameserver für die DNS-Zone dns.domain.tld zu machen. Auf meinem Server läuft für die komplette Verwaltung ISPConfig, sodass ich diesen Schritt per Wizard vornehmen konnte. Der fertige DNS-Zonen-Eintrag, womit man Ihn auch immer herstellt, sieht dann so aus:

dns.domain.tld 1800 IN NS ns1.domain.tld
dns.domain.tld 1800 IN NS ns2.domain.tld
dns.domain.tld 60 IN A <dynamische IP>
*.dns.domain.tld 60 IN A <dynamische IP>

Wichtig sind hierbei die letzten beiden Zeilen. Diese beiden Einträge weisen nun den SubDomains dns.domain.tld und *.dns.domain.tld eine IP zu. Diese IP soll unserer dynamischen IP entsprechen und durch das Script aus Schritt 4 regelmäßig aktualisiert werden. Um diese Aktualisierung vornehmen zu können, ist es wichtig eine möglichst kurze TTL (Time to live) zu wählen, hier 60 sek. Dies ist die Angabe darüber, wann ein Client den Namen dns.domain.tld neu zu einer evtl. geänderten IP auflöst, also die Zeit, wann die SubDomain auf eine neue IP verweist.

4. Updatescript für DNS-Updates erstellen

Als letzter Schritt muss nun noch ein Script erstellt werden, dass die zu verwendende IP-Adresse entgegen nimmt und in unserem DNS-Server einträgt. Das folgende Script funktioniert, falls der DNS-Server von ISPConfig verwltet wird. Wird ein anderes Config-Tool, oder direkt ein DNS Server verwendet, muss das Script entsprechend angepasst werden.

[Update 11.01.2015] - Zonenupdate hinzugefügt, ID's werden aus DB gelesen.

<?php

require('soap_config.php');

$client = new SoapClient(null,
      array('location'   => $soap_location,
            'uri'        => $soap_uri,
            'trace'      => 1,
            'exceptions' => 1));

$con = mysqli_connect(<HOSTNAME>,<USER>,<PASS>,<DB>);

$url = $_REQUEST['domain'];

// Perform queries 
$sql = "SELECT id FROM dns_rr WHERE name = '$url.' AND type ='A'";
$res = mysqli_fetch_row(mysqli_query($con,$sql));
$id = $res[0];

$sql = "SELECT id FROM dns_rr WHERE name = '*.$url.' AND type ='A'";
$res = mysqli_fetch_row(mysqli_query($con,$sql));
$wild_id = $res[0];

$sql = "SELECT id FROM dns_soa WHERE origin = '$url.'";
$res = mysqli_fetch_row(mysqli_query($con,$sql));
$zone_id = $res[0];

mysqli_close($con);

try {
     
        $session_id = $client->login($_REQUEST['user'],$_REQUEST['pass']);
     
        //* Get the dns record
        $dns_record1 = $client->dns_a_get($session_id, $id);
        $dns_record2 = $client->dns_a_get($session_id, $wild_id);
     
        //* Enter IP
        $dns_record1['data'] = $_REQUEST['ip'];
        $dns_record2['data'] = $_REQUEST['ip'];
        $dns_record1['serial'] = $dns_record1['serial']+1;
        $dns_record2['serial'] = $dns_record2['serial']+1;
        $client->dns_a_update($session_id, null, $id, $dns_record1);
        $client->dns_a_update($session_id, null, $wild_id, $dns_record2);

        $zone = $client->dns_zone_get($session_id, $zone_id);
        $zone['serial'] = $zone['serial'] + 1;
        $client->dns_zone_update($session_id, 0, $zone_id, $zone);
     
        $client->logout($session_id);

} catch (SoapFault $e) {
	echo $client->__getLastResponse();
	die('SOAP Error: '.$e->getMessage());
}

?>

Hinweis: Dieses Script entspricht im Prinzip dem Example Script, dass ISPConfig mitliefert (/remoting_client/examples/dns_a_update.php). Dort findet sich auch die benötigte soap_config.php. Allerdings werden hier die Ids der A-Records und der Zone aus der DB gelesen.

Aufgerufen wird das Script nun über:

http://domain.tld/{PfadZumScript}/update.php?ip={IP}&user={USER}&pass={PASSWORD}&domain={DOMAIN}

IP: Die IP auf die der Eintrag verweisen soll.

USERNAME: Benutzer der berechtigt ist, DNS Einträge zu ändern.

PASSWORD: Das Passwort dieses Benutzers.

ID: Id des zu ändernden DNS-A Eintrags (kann über die ISPConfig Datenbank, Tabelle dns_rr, herausgefunden werden).

So lässt sich das Updatescript leicht, z.B. in Fritz!Box Router eintragen. Diese stellen hierfür die DynDNS-Anbieter Einstellung Benutzerdefiniert bereit. Die URL lautet dann:

http://domain.tld/{PfadZumScript}/update.php?ip=<ipaddr>&user=<username>&pass=<password>&domain=<domain>