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:

 DynDNS Einstellungen der Fritzbox

 

 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.