Eigener DynDNS mit Bind, Apache und PHP

In Computer und Netzwerk | Erstellt: 03.03.2015, 15:20 | Editiert: 31.10.2018, 06:18 (Formatierung) | 5.710 mal angesehen | Seite drucken

Aktualisiert: Version 2.0 für Bind und dnsmasq ist hier

Nach einigem Googeln in die Tat umgesetzt, um von Dienstleistern unabhängig zu werden: Ein DynDNS-Server mit Bind, Apache und PHP. Eine (kurze) Anleitung findet sich auch in der README.txt des Archivs, hier die Zusammenfassung:

Voraussetzungen

  • Einen eigenen Server
  • Einen installierten Bind Nameserver
  • Apache Webserver mit PHP
  • Apache mod_rewrite für DynDNS-kompatible URLs (/nic/update?...)

Ich gehe davon aus, dass man – sofern man die Rechte zum Update seines eigenen DNS hat – auch über die nötigen Kenntnisse im Umgang mit PHP, Apache und der Shell hat.

Installation

  • Bind auf example.com einrichten
  • Eine DNS-Zone für den DynDNS einrichten, z.B. ddns.example.com
  • Einen Key für Bind zum Update der Zone erstellen
  • Bind einrichten, so dass die Zone mit dem erstellten Key aktualisiert werden darf

Bis hierher ist das Setup dem Leser überlassen, nur einige Anhaltspunkte zum Weiterlesen:

Für das Erstellen des Keys taugt folgendes Kommando:

ddns-confgen -q -a hmac-md5 -k ddns-update-key-php -r /dev/urandom | tee ddns-update-key-php

In der named.conf den Key definieren:

// DDNS-Update Key

key "ddns-update-key-php" {
        algorithm hmac-md5;
        secret "5F1234TrallalaHopsassa12345abcABCC+jc1A==";
};

und in der Zone Updates mit diesem Key erlauben:

zone "ddns.example.com" {
        // ...
        allow-update {
                key ddns-update-key-php;
        };
        // ...
};

Installation und Konfiguration der Software

  • Einen Virtual Host erstellen, beispielsweise ddns.example.com
  • Das Archiv in die DocumentRoot entpacken
  • Alle Ordner und Dateien für den Apache-User (normalerweise www-data:www-data) lesbar, die Ordner log/ und data/ schreibbar machen

Bearbeiten von include/config.php, mindestens:

  • DNS_SERVER: Höchstwahrscheinlich 127.0.0.1/localhost
  • DDNS_ZONE: Die zu aktualisierende Zone wie ddns.example.com, ohne Punkt am Ende
  • KEY_NAME: Der Name des Update-Schlüssels, wie ddns-update-key-php
  • KEY_VALUE: Der Wert ("secret") des Schlüssels, wie 5FPbxxVasoXxssC+jc1A==

Bearbeiten von include/users.php: USERNAME ist gleichzeitig der dynamische Hostname, also USERNAME.ddns.example.com. Beispiel:

$known_clients['home'] = 'home$$pASSw0rd';

Der User home mit dem Passwort home$$pASSw0rd ist somit für das Update von home.ddns.example.com eingerichtet.

Tests mit einem Browser

Ohne Authentifizierung wird die IP des Clients angezeigt:

  • http://ddns.example.com/

Einfache Update-URL:

  • http://ddns.example.com/?name=home&pass=home$$pASSw0rd

DynDNS-kompatible URL:

  • http://ddns.example.com/nic/update?name=home&pass=home$$pASSw0rd
  • http://ddns.example.com/nic/update?hostname=home&pass=home$$pASSw0rd

Kürzeste URL:

  • http://home:home$$pASSw0rd@ddns.example.com

Achtung: "Basic Auth" (http://user:pass@hostname) wird heute von vielen Browsern nicht mehr unterstützt bzw. stillschweigend ignoriert! So kann man Stunden damit verbringen zu suchen, wo PHP User & Passwort versteckt hat….

M0n0wall

M0n0wall (dessen DynDNS-Client seit Jahren verbockt ist), lässt sich so mit der Einstellung "DynDNS (custom)" zum Laufen bekommen:

Ddns_setup_m0n0wall

Er ruft dann folgende URL auf:

  • http://[username]:[password]@ddns.example.com/nic/update?system=custom&hostname=[hostname]&myip=[wan-ip]&wildcard=OFF&

Das Rewrite von /nic/update?... nach /index.php?... wird in der .htaccess gesteuert, mod_rewrite muss dazu aktiviert sein.

AVM FRITZ!Box

Eine FRITZ!Box funktioniert mit "Benutzerdefiniert" als DynDNS-Anbieter und folgenden Einstellungen:

Ddns_setup_fritzbox

Dies wird ausgewertet zu:

  • http://[username]:[password]@ddns.example.com/?hostname=<username>&pass=<pass>&hostname=<domain>&myip=<ipaddr>

Bash/cURL

Eine simple Kommandozeile für einen Cronjob:

curl -v -s "http://home:home$$pASSw0rd@ddns.example.com"

Server-Antworten

Die Antworten sind weitestgehend an den DynDNS-Standard (http://www.noip.com/integrate/response) angepasst:

  • good IP_ADDRESS: Host aktualisiert
  • nochg IP_ADDRESS: Keine Änderung seit letztem Update
  • badauth: Benutzer und/oder Passwort ungültig
  • 911: Interner Serverfehler (Apache Error 500, IP-Datei nicht schreibbar, nsupdate-Fehler)

Dateien

Download (Version 1.0): privater-ddns_1.0.tar.bz2

Die Inhaltsstoffe, 1:1 aus dem Archiv zitiert:

favicon.ico            - An icon. You guessed it. Ripped from DynDNS
index.php              - Main php file
.htaccess              - Basic settings and rewriting of DynDNS protocol URLs
data/${client}.ip      - Stored client IPs
data/.htaccess         - Folder protection
include/config.php     - PHP system configutation
include/functions.php  - PHP functions
include/users.php      - DynDNS user setup
include/.htaccess      - Folder protection
log/debug.log          - Log for debugging
log/events.log         - Log for events
log/.htaccess          - Folder protection

Weitere Seiten in 'Computer und Netzwerk'

Kommentare (3)

Carl sagt:

Ich habe den Verdacht, in dem Archiv fehlt die root .htaccess; besteht die Möglichkeit, die RewriteRules so zu bekommen?

Stefan sagt:

Ooops, fail. Die relevanten Zeilen:


# Rewrite DynDNS protocol "/nic/update?..." to "/index.php?..."
# -----------------------------------------------------------------------------
RewriteEngine On
RewriteRule ^nic/update?(.*)$ /index.php$1

[...]

<FilesMatch "\~$">
    Require all denied
</FilesMatch>

<FilesMatch "^\.ht">
   Require all denied
</FilesMatch>

<FilesMatch "\.log$">
   Require all denied
</FilesMatch>

<FilesMatch "\.ip$">
   Require all denied
</FilesMatch>

Carl sagt:

Vielen Dank für die schnelle Antwort, funktioniert wunderbar!

Schreibe einen Kommentar

Captcha * Time limit is exhausted. Please reload CAPTCHA.