onderka.com

Eigener DynDNS auf Netcup-vServer mit API

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!

DynDNS-Dienst für Netcup-Server mit der Netcup DNS-API

Netcup stellt für Abfragen und Änderungen der DNS-Daten eine API zur Verfügung. Lars-Sören Steck hat auf Github Code veröffentlich, der auf Clients ausgeführt werden kann und mit der API dynamische DNS-Einträge aktualisiert.

Ich habe das Repository mit meinem bisherigen Code zu einem DynDNS-Server für Netcup verwurstelt.

Funktion

Clients werden authentifiziert, im Erfolgsfall wird der DNS A-Record für hostname1.ddns in der Domäne example.com mit der Netcup-API aktualisiert (Bisher nur IPv4).

Voraussetzungen

  • Einen eigenen Server bei Netcup, Shell-Zugang wäre toll
  • Eine Domain, deren DNS-Verwaltung im Netcup CCP vorgenommen wird (kein externer NS)
  • Apache Webserver mit PHP
  • Apache mod_rewrite oder mod_alias für DynDNS-kompatible URLs (/nic/update?...)

Ich gehe davon aus, dass man – sofern man einen eigenen vServer besitzt – auch über die nötigen Kenntnisse im Umgang mit PHP, Apache, DNS-Einträgen und der Shell hat.

Installation

  • DNS für example.com einrichten
  • Eine Subdomain für den DynDNS einrichten, z.B. ddns.example.com, A-Eintrag oder CNAME für example.com
  • einen Apache VHost für ddns.example.com einrichten, HTTPS ausdrücklich empfohlen
  • Einen Key und ein Passwort für die Netcup DNS-API erstellen
  • Das Archiv in den Ordner des VHosts entpacken.
  • Die Ordner data und log für den Apache-User (meist www-data, Gruppe www-data) schreibbar machen
  • Einstellungen vornehmen

Konfiguration

Bearbeiten von include/config.php, mindestens:

CUSTOMERNR     Netcup-Kundennummer
APIKEY         API-Key
APIPASSWORD    API-Passwort
DOMAIN         Domain mit von Netcup verwaltetem DNS, Beispiel 'example.com'
DDNS_ZONE      Subdomain von DOMAIN, die für den DynDNS-Server verwendet wird, Beispiel 'ddns'
DEBUG          true für gesprächige Ausgaben im Logfile, false für nur das Wichtigste

Bearbeiten von include/users.php:

$known_clients['hostname1'] = 'password1';
$known_clients['hostname2'] = 'password2';
...

Die User hostname1/hostname2 für die Hosts hostname1.ddns.example.com bzw. hostname2.ddns.example.com mit den Passwörtern password1/password2 sind somit aktiv.

Tests mit einem Browser

Ohne Authentifizierung wird die IP des Clients angezeigt:

  • https://ddns.example.com/

Einfache Update-URL:

  • https://ddns.example.com/?name=hostname1&pass=password1

DynDNS-kompatible URL:

  • https://ddns.example.com/nic/update?name=hostname1&pass=password1
  • https://ddns.example.com/nic/update?hostname=hostname1&pass=password1

Kürzeste URL:

  • https://hostname1:password1@ddns.example.com

Achtung: Basic Auth (https://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... Mit cURL funktioniert es.

Das Umschreiben von URLs (/nic/update?... nach /index.php?...) wird in der .htaccess gesteuert, mod_rewrite muss dazu aktiviert sein. Alternativ mit RedirectMatch etwas selbst basteln.

Beispiel: AVM FRITZ!Box

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

Ddns_setup_fritzbox

Dies wird ausgewertet zu:

  • https://[benutzername]:[passwort]@ddns.example.com/?hostname=<benutzername>&pass=<passwort>&hostname=<domainname>&myip=<ipaddr>

Beispiel: cURL

Eine simple Kommandozeile für einen Cronjob auf einem Client:

curl -v -s "https://hostname1:password1@ddns.example.com"

Beispiel: WGET

wget --http-user=hostname1 --http-passwd=password1 --no-check-certificate https://ddns.example.com

Server-Antworten

Die Antworten sind weitestgehend an den DynDNS-Standard (https://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 (HTTP 500, IP-Datei nicht schreibbar, API-Fehler, etc.)

Nginx-Proxy

Hinter einem Nginx als Proxy ist $_SERVER['REMOTE_ADDR'] eventuell leer: In diesem Fall muss in include/functions.php in Zeile 9 stattdessen $_SERVER['HTTP_X_REAL_IP'] verwendet werden.

   // IP des HTTP-Clients verwenden
   //define("CLIENT_IP", $_SERVER['REMOTE_ADDR']);
   define("CLIENT_IP", $_SERVER['HTTP_X_REAL_IP']);

oder alternativ muss Nginx REMOTE_ADDR bereitstellen:

fastcgi_param  REMOTE_ADDR        $remote_addr;

beziehungsweise

fastcgi_param  REMOTE_ADDR        $http_x_real_ip;

Download

Version 0.1 vom 14.04.2020: nc_ddns_master.tar.bz2

Mit Skripten und Quellcode auf dieser Seite sollte man keine Herz-Lungen-Maschine betreiben!

31 andere Seiten unter 'Computer und Netzwerk'