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:
- Ich ziehe zu einem anderen Dynymic DNS Anbieter um, bspw. noip.com
- 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:
- Subdomain für Dynamic DNS wählen
- DNS Records der Hauptdomain anpassen
- eigenen Server als Nameserver konfigurieren
- 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>