Von DynDNS oder NoIP.com kennen viele dynamische DNS Services. Sie erlauben es, trotz der sich täglich ändernden IP Adresse am DSL Anschluss, den eigenen Rechner im Heimnetz z.B. für ein VPN unter einem gleichbleibenden DNS Namen erreichbar zu halten. Ändert sich die IP Adresse, übermittelt z.B. der DSL Router oder der Linux Server im Heimnetz die neue IP Adresse an den dynamischen DNS Service und dieser trägt sie für den hinterlegten Domainnamen ein.
Bei der LUG Stormarn haben wir vor einiger Zeit auf Basis einer Anleitung der Zeitschrift c't einen eigenen dynamischen DNS Service eingerichtet. Unterhalb der Domain dyn.lug-stormarn.de kann jeder interessierte LUGaner seinen Host unter seiner eigenen Subdomain unterhalb von dyn.lug-stormarn.de (z.B. homeserver.dyn.lug-stormarn.de) erreichen. Diese Anleitung zeigt grob, wie wir dies umgesetzt haben.
Voraussetzungen
Ausgangsbasis ist unser LUG Server bei einem Hostingprovider im Internet. Auf diesem System mit Debian wheezy haben wir neben dem Apache Webserver auch den DNS Service Bind9 sowie die dnsutils mittels apt-get installiert.
apt-get install apache2 bind9 dnsutils
Die Aktualisierung der DNS Zone im laufenden Betrieb erfolgt über ein CGI Script, welches durch einen HTTP Aufruf angestoßen wird und die DNS Zone über das Kommando nsupdate aus den dnsutils erneuert.
Konfiguration des Bind
Delegation der Subdomain dyn an unseren LUG Server
Der Nameservice Bind soll über die Domain dyn.lug-stormarn.de alle dynamischen Adressen verwalten. Bei unserem Provider, der den Nameserver für lug-stormarn.de stellt, tragen wir daher in die Zone für lug-stormarn.de ein, dass für alle Adressen unter dyn.lug-stormarn.de unser LUG Server (IP 78.47.197.182) direkt befragt werden soll. Dies erfolgt durch folgenden Eintrag in der Zone lug-stormarn.de beim Provider
dyn NS 78.47.197.182
Einrichtung des Bind auf dem LUG Server
Die neue Zone dyn.lug-stormarn.de müssen wir dem Bind auf dem LUG Server bekannt machen und legen sie wie folgt an.
/etc/bind/named.conf.local:
zone "dyn.lug-stormarn.de" {
type master;
file "dyn.lug-stormarn.de";
allow-update { localhost; };
allow-transfer { localhost; };
notify yes;
};
Das ebenfalls benötigte Zonenfile hierfür legen wir ebenfalls wir nachfolgend aufgeführt an.
/var/cache/bind/dyn.lug-stormarn.de:
$ORIGIN . $TTL 3600 ; 1 hour dyn.lug-stormarn.de IN SOA dyn.lug-stormarn.de. root.lug-stormarn.de. ( 9 ; serial 3600 ; refresh (1 hour) 900 ; retry (15 minutes) 604800 ; expire (1 week) 180 ; minimum (3 minutes) ) NS dyn.lug-stormarn.de. A 78.47.197.182 MX 10 lug-stormarn.de. $ORIGIN dyn.lug-stormarn.de. $TTL 60 ; 1 minute
Konfiguration des Apache
Unterhalb des Debian typischen /var/www legen wir für unseren Webservice ein Directory dyn.lug-stormarn.de an, in welches wir später das Update Script stellen.
Erreichbar sein soll das Update Script unter http://dyn.lug-stormarn.de/update.cgi. Wir legen daher hierzu einen Apache Virtual Host an.
/etc/apache2/sites-available/dyn.lug-stormarn.de:
<VirtualHost *:80> DocumentRoot /var/www/dyn.lug-stormarn.de ServerName dyn.lug-stormarn.de CustomLog /var/log/apache2/dyn.lug-stormarn.de_access.log combined Options +ExecCGI AddHandler cgi-script .cgi RewriteEngine on RewriteCond %{REQUEST_URI} ^/nic/update$ RewriteRule (.*) /var/www/dyn.lug-stormarn.de/update.cgi <Location /> AuthType Basic AuthUserFile /var/www/.htpasswd.dyn.lug-stormarn.de AuthGroupFile /dev/null AuthName "DyDNS API Access." Order allow,deny Deny from all Satisfy any Require valid-user </Location> </VirtualHost>
Anschließend aktivieren wir den Virtual Host im Apache mittels
a2ensite dyn.lug-stormarn.de
service apache2 reload
Die Aktualisierung einer Hostadresse im dynamischen DNS erfolgt durch Aufruf eines update.cgi Scripts. Der Zugriff auf dieses Script soll passwortgeschützt sein. Hierzu verwenden wir in der Konfiguration die HTTP Basic Authentication und hinterlegen die gültigen Benutzer und Kennworte in der Datei /var/www/.htpasswd.dyn.lug-stormarn.de.
Diese Datei sowie einen ersten User erzeugen wir mittels
htpasswd -c /var/www/.htpasswd.dyn.lug-stormarn.de. test
Weitere User werden später mittels
htpasswd /var/www/.htpasswd.dyn.lug-stormarn.de. test2
angelegt.
DNS Update Script
Unter /var/www/dyn.lug-stormarn.de/ erzeugen wir nun das bereits erwähnte Update Script update.cgi.
Die Vorlage für dieses Script entstammt der Zeitschrift c't. Wir haben es nur soweit abgespeckt und vereinfacht, dass jetzt folgende Rahmenbedingungen gelten:
- Der Username beim Einloggen ist auch der einzutragende Domainname für den Host unterhalb dyn.lug-stormarn.de
- Die einzutragende IP Adresse ist die Adresse, von der der HTTP Aufruf des update.cgi erfolgt
/var/www/dyn.lug-stormarn.de/update.cgi:
#!/usr/bin/perl -wT
use strict;
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
my $ip;
my $hostname;
# Ohne frisst ddnsclient die Antwort nicht
print header;
# Paramter auslesen
$ip = param("myip") || $ENV{REMOTE_ADDR};
$hostname = $ENV{REMOTE_USER} . ".dyn.lug-stormarn.de";
# Aufruf von nsupdate vorbereiten
my $commands = qq{
server localhost
zone dyn.lug-stormarn.de
update delete $hostname.
update add $hostname. 60 A $ip
send
};
# Aufruf in einer "sicheren" Umgebung mit Generalschluessel
my $nsupdate = "/usr/bin/nsupdate";
$ENV{PATH} = "/bin:/usr/bin";
delete @ENV{ 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
open( NSUPDATE, "| $nsupdate" ) or print "911" && exit;
print NSUPDATE $commands or print "911" && exit;
close NSUPDATE or print "911" && exit;
# Erfolg vermelden ...
print "good $ip";
Wichtig ist, dass der Webserver Ausführungsrechte auf die Scriptdatei bekommt. Mittels
chmod 755 /var/www/dyn.lug-stormarn.de/update.cgi
erteilen wir diese Rechte.
Test des Service
Mit einem beliebigen Browser können wir den eingerichteten Service testen. Hierzu rufen wir http://dyn.lug-stormarn.de/update.cgi auf. In das erscheinende Anmeldefenster tragen wir die Zugangsdaten ein, welche wir vorhin über htpasswd angelegt haben, in unserem Beispiel der User 'test'. Falls die Eintragung erfolgreich war, erhalten wir im Browser die Bestätigungsmeldung
good 91.38.0.176
Anschließend liefert eine Namensauflösung für den Host test.dyn.lug-stormarn.de folgendes zurück:
ulf@seehund:~$ host test.dyn.lug-stormarn.de test.dyn.lug-stormarn.de has address 91.38.0.176
Nutzung des dynamischen DNS in der Fritzbox
Unser neu eingerichtete dynamische DNS Service lässt sich u.a. auch mit der Fritzbox nutzen.
Hierzu geben wir unter Internet -> Freigaben -> Dynamic DNS die folgenden Werte an:
Wichtig sind nur die Felder für 'Update-URL', 'Benutzername' und 'Kennwort'. Der Wert für 'Domainname' ist nur informativ angegeben, aber er wird bei der Aktualisierung ignoriert da als Hostname ja der Username genommen wird.
Mit diesen Einstellungen verbindet sich die Fritzbox immer automatisch nach einer DSL Trennung wieder mit unserem dynamischen DNS Service und aktualisiert den Eintrag.
Nutzung des dynamischen DNS mit einem Linux Server
Sollte der eigene DSL Router nicht über die Möglichkeit verfügen, eine eigene Update URL sowie die Zugangsdaten anzugeben, kann die automatische Aktualisierung auch z.B. durch einen Linux Server erfolgen. Auf diesem wird einfach zyklisch die Update URL z.B. durch wget mittels
wget -O /var/log/dns-update.log -o /dev/null http://myhost:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. /update.cgi >/dev/null 2>&1
aufgerufen. Als Cron-Job eingerichtet, der alle 15 Minuten läuft, ist spätestens eine viertel Stunde nach dem Neuaufbau der DSL Verbindung die neue, zugeteilte IP Adresse auch wieder mit dem eingetragenen Hostnamen verknüpft.