onderka.com

Eigener DynDNS mit Bind, Apache und PHP

Diese Seite wurde vor mehr als 2 Jahren erstellt und vor über einem Monat zuletzt bearbeitet. Der Inhalt hat eventuell längst sein Mindesthaltbarkeitsdatum überschritten!

Eine Version für dnsmasq ist hier zu finden.

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 bzw. einen Server mit Shell-Zugang
  • Einen installierten Bind Nameserver
  • Apache Webserver mit PHP
  • Apache mod_rewrite oder mod_alias für DynDNS-kompatible URLs (/nic/update?...)

Die Rewrite-Regel für Apache sieht in etwas wie folgt aus:

RewriteEngine on
RewriteRule ^/nic/update?(.*)$ /index.php?$1 [NC, QSA]

also alle GET-Parameter, die der Standard-URL /nic/update mitgegeben werden, werden an /index.php übergeben.

Ich gehe davon aus, dass man – sofern man die Rechte zum Update seiner eigenen DNS-Zone 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. Alternativ mit RedirectMatch etwas selbst basteln.

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.1): privater-ddns_1.1.tar.bz2

Die Inhaltsstoffe, 1 zu 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

Andere Seiten unter 'Computer und Netzwerk'