Jimini
PCGH-Community-Veteran(in)
[FONT=Verdana, sans-serif]Aloha,
da kürzlich dyndns.org sein kostenloses Angebot komplett eingestellt hat, war ich nach 9 Jahren "gezwungen", mich nach einer Alternative umzusehen. Da ich keine Lust auf irgendwelche komischen URLs hatte, ohnehin schon einen öffentlichen Server betreibe und auf mehreren Domains sitze, habe ich mir einen eigenen DynDNS-Dienst gebaut.
Das Ganze funktioniert dann wie folgt:
- mein Selbstbau-Router zuhause erkennt einen Wechsel der öffentlichen IP-Adresse
- ein Script wird ausgelöst, welches eine Webseite auf meinem öffentlichen Server aufruft
- auf dem öffentlichen Server wird durch den Aufruf der Webseite wiederum ein Script gestartet, welches die IP-Adresse des aufrufenden Clients an den Nameserver übermittelt
ANLEITUNG
(Erläuterung: domain.tld steht für die Adresse, unter welcher der öffentliche Server mit dem Nameserver läuft - also beispielsweise example.net - und dyndns.domain.tld für das System, welches eine wechselnde öffentliche IP-Adresse hat, also beispielsweise home.example.net)
1. Voraussetzungen
- ein öffentlicher Server, auf welchem ihr Rootrechte habt
- eine eigene Domain (domain.tld) und eine Subdomain (dyndns.domain.tld)
- der Nameserver Bind (wird bei vServern in der Regel schon vorkonfiguriert mitgeliefert)
- ein Webserver[/FONT] mit PHP-Support
[FONT=Verdana, sans-serif]2. Erzeugen der Keys auf dem Nameserver[/FONT]
[FONT=Verdana, sans-serif]Um die DNS-Updates halbwegs abzusichern, sollte man Keys verwenden. Zunächst erzeugen wir welche:[/FONT]
[FONT=Verdana, sans-serif]
Beide Dateien werden später noch gebraucht.
Danach kopieren wir die Keys aus den erzeugten Dateien:[/FONT]
[FONT=Verdana, sans-serif]3. Anpassen der Bind-Config[/FONT]
[FONT=Verdana, sans-serif]3.1 /etc/bind/named.conf.local[/FONT]
[FONT=Verdana, sans-serif]
[/FONT][FONT=Verdana, sans-serif]3.2 Erzeugen des Zonen-Files in /var/lib/bind/dyndns.domain.tld[/FONT]
[FONT=Verdana, sans-serif]Nicht vergessen, die Datei für Bind les- und beschreibbar zu machen:[/FONT]
[FONT=Verdana, sans-serif]4. Key für BIND hinterlegen (/etc/bind/named.keys)[/FONT]
[FONT=Verdana, sans-serif]
5. testweise lokal updaten (Keyfiles wurden im 2. Schritt erzeugt)[/FONT]
[FONT=Verdana, sans-serif]
6. Überprüfen, ob das Update angenommen wurde
[/FONT][FONT=Verdana, sans-serif]Im Syslog nach Zeilen wie den folgenden suchen:[/FONT]
[FONT=Verdana, sans-serif]
[/FONT]
[FONT=Verdana, sans-serif]7. Script anlegen[/FONT]
[FONT=Verdana, sans-serif]Natürlich muss das Script noch ausführbar gemacht werden:[/FONT] [FONT=Verdana, sans-serif]
[/FONT]
[FONT=Verdana, sans-serif]8. PHP-File anlegen[/FONT]
[FONT=Verdana, sans-serif]
[/FONT][FONT=Verdana, sans-serif]Anmerkung: bei mir hängt noch ein "[/FONT][FONT=Verdana, sans-serif][FONT=Verdana, sans-serif]$iptables = "/usr/bin/iptables_on";" sowie ein [/FONT]"[/FONT][FONT=Verdana, sans-serif]exec ($iptables);"[/FONT][FONT=Verdana, sans-serif]drin, womit ich direkt meine Firewallregeln aktualisiere.
9. testen, ob das PHP-File beim Aufruf über den Browser ein DNS-Update auslöst[/FONT]
[FONT=Verdana, sans-serif]
10. das PHP-File vor unbefugtem Zugriff schützen, hier am Beispiel von Apache[/FONT]
[FONT=Verdana, sans-serif]
[/FONT]
[FONT=Verdana, sans-serif]Die Config (bei mir ist es /etc/apache2/sites-enabled/default) um folgenden Eintrag erweitern:[/FONT]
[FONT=Verdana, sans-serif]
[/FONT] [FONT=Verdana, sans-serif]Apache neustarten.[/FONT]
[FONT=Verdana, sans-serif]11. das PHP-File kann beispielsweise mittels curl und den eben festgelegten Zugangsdaten aufgerufen werden[/FONT]
[FONT=Verdana, sans-serif]
(der Parameter "--insecure" bestimmt, dass eine Zertifikatswarnung ignoriert wird - mein Webserver liefert nur via HTTPS aus und greift dabei auf ein selbstsigniertes Cert zurück, daher ist diese Option bei mir notwendig)
Am Ende kann man die obige Zeile beispielsweise als Aktion bei einem IP-Wechsel festlegen, bei mir muss ich dazu nur eine Datei in /etc/dhcp3/dhclient-enter-hooks.d/dyndns anlegen, welche folgendes enthält:
[/FONT]
[FONT=Verdana, sans-serif]MfG Jimini
P.S.: für Fragen und Anmerkungen wäre ich dankbar - ich habe das Setup zwar so genau wie möglich dokumentiert, dennoch kann es natürlich sein, dass ich etwas vergessen oder übersehen habe.
Fehlermeldungen:
[/FONT]
da kürzlich dyndns.org sein kostenloses Angebot komplett eingestellt hat, war ich nach 9 Jahren "gezwungen", mich nach einer Alternative umzusehen. Da ich keine Lust auf irgendwelche komischen URLs hatte, ohnehin schon einen öffentlichen Server betreibe und auf mehreren Domains sitze, habe ich mir einen eigenen DynDNS-Dienst gebaut.
Das Ganze funktioniert dann wie folgt:
- mein Selbstbau-Router zuhause erkennt einen Wechsel der öffentlichen IP-Adresse
- ein Script wird ausgelöst, welches eine Webseite auf meinem öffentlichen Server aufruft
- auf dem öffentlichen Server wird durch den Aufruf der Webseite wiederum ein Script gestartet, welches die IP-Adresse des aufrufenden Clients an den Nameserver übermittelt
ANLEITUNG
(Erläuterung: domain.tld steht für die Adresse, unter welcher der öffentliche Server mit dem Nameserver läuft - also beispielsweise example.net - und dyndns.domain.tld für das System, welches eine wechselnde öffentliche IP-Adresse hat, also beispielsweise home.example.net)
1. Voraussetzungen
- ein öffentlicher Server, auf welchem ihr Rootrechte habt
- eine eigene Domain (domain.tld) und eine Subdomain (dyndns.domain.tld)
- der Nameserver Bind (wird bei vServern in der Regel schon vorkonfiguriert mitgeliefert)
- ein Webserver[/FONT] mit PHP-Support
[FONT=Verdana, sans-serif]2. Erzeugen der Keys auf dem Nameserver[/FONT]
[FONT=Verdana, sans-serif]Um die DNS-Updates halbwegs abzusichern, sollte man Keys verwenden. Zunächst erzeugen wir welche:[/FONT]
Code:
dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST dyndns.domain.tld
Beide Dateien werden später noch gebraucht.
Danach kopieren wir die Keys aus den erzeugten Dateien:[/FONT]
Code:
cat Kdyndns.domain.tld*
[FONT=Verdana, sans-serif]3.1 /etc/bind/named.conf.local[/FONT]
Code:
zone "dyndns.domain.tld" {
type master;
file "/var/lib/bind/dyndns.domain.tld";
allow-update {
localhost; };
allow-query {
any;
};
allow-transfer {
127.0.0.1;
ÖFFENTLICHE.IP.DES.SERVERS;
};
notify yes;
};
[/FONT][FONT=Verdana, sans-serif]3.2 Erzeugen des Zonen-Files in /var/lib/bind/dyndns.domain.tld[/FONT]
Code:
$ORIGIN .
$TTL 60 ;
dyndns.domain.tld IN SOA domain.tld. dyndns.domain.tld. (
1 ; serial
3600 ; refresh (1 hour)
900 ; retry (15 minutes)
2419200 ; expire (4 weeks)
180 ; minimum (3 minutes)
)
NS dyndns.domain.tld.
A ÖFFENTLICHE.IP.DES.SERVERS[FONT=Verdana, sans-serif][SIZE=2]
[/SIZE][/FONT]
Code:
chown bind:bind /var/lib/bind/dyndns.domain.tld
Code:
chmod 700 /var/lib/bind/dyndns.domain.tld
Code:
[FONT=Verdana, sans-serif][SIZE=2][FONT=Verdana, sans-serif][SIZE=2]key dyndns.domain.tld {
a[/SIZE][/FONT]lgorithm HMAC-SHA256;[/SIZE][/FONT]
[FONT=Verdana, sans-serif][SIZE=2] secret "HIER KOMMT DER KEY AUS DEM KEYFILE REIN";
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2]};[/SIZE][/FONT]
5. testweise lokal updaten (Keyfiles wurden im 2. Schritt erzeugt)[/FONT]
Code:
[FONT=Verdana, sans-serif][SIZE=2][FONT=Verdana, sans-serif][SIZE=2]nsupdate -k /pfad/zum/keyfile.private
>[/SIZE][/FONT] server 127.0.0.1
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2]> zone dyndns.domain.tld
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2]> update delete dyndns.domain.tld
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2]> update add dyndns.domain.tld 60 A ÖFFENTLICHE.IP.DES.DYNDNS-SYSTEMS
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2]> show (OPTIONAL ZUM CHECKEN)
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2]> send[/SIZE][/FONT]
6. Überprüfen, ob das Update angenommen wurde
[/FONT][FONT=Verdana, sans-serif]Im Syslog nach Zeilen wie den folgenden suchen:[/FONT]
[FONT=Verdana, sans-serif]Den Nameserver direkt abfragen:[/FONT][FONT=Verdana, sans-serif]n[/FONT][FONT=Verdana, sans-serif][FONT=Verdana, sans-serif]amed[6500]: client 127.0.0.1#21264: signer "dyndns.domain.tld" approved
n[/FONT]amed[6500]: client 127.0.0.1#21264: updating zone 'dyndns.domain.tld/IN': delete all rrsets from name 'dyndns.domain.tld'[/FONT]
[FONT=Verdana, sans-serif]named[6500]: client 127.0.0.1#21264: updating zone 'dyndns.domain.tld/IN': adding an RR at 'dyndns.domain.tld' A[/FONT]
[FONT=Verdana, sans-serif]
Code:
dig dyndns.domain.tld
[FONT=Verdana, sans-serif]7. Script anlegen[/FONT]
Code:
#!/bin/bash
echo -e "
server 127.0.0.1
zone dyndns.domain.tld
update delete dyndns.domain.tld
update add dyndns.domain.tld 60 A $1
send" | /usr/bin/nsupdate -k /pfad/zum/key.private
Code:
chmod +x /pfad/zum/script
[FONT=Verdana, sans-serif]8. PHP-File anlegen[/FONT]
[FONT=Verdana, sans-serif]
Code:
<?php
$ip = getenv("REMOTE_ADDR");
$updatescript = "/pfad/zum/updatescript $ip";
exec ($updatescript);
?>
9. testen, ob das PHP-File beim Aufruf über den Browser ein DNS-Update auslöst[/FONT]
[FONT=Verdana, sans-serif]
10. das PHP-File vor unbefugtem Zugriff schützen, hier am Beispiel von Apache[/FONT]
[FONT=Verdana, sans-serif]
Code:
htpasswd2 -s /pfad/zum/userfile dyndns-loginname
[FONT=Verdana, sans-serif]Die Config (bei mir ist es /etc/apache2/sites-enabled/default) um folgenden Eintrag erweitern:[/FONT]
[FONT=Verdana, sans-serif]
Code:
<Directory "/pfad/zum/PHP-Script">
Options Indexes FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
AuthType Basic
AuthName "Bitte einloggen:"
AuthUserFile /pfad/zum/userfile
Require valid-user
IndexIgnore download
</Directory>
[FONT=Verdana, sans-serif]11. das PHP-File kann beispielsweise mittels curl und den eben festgelegten Zugangsdaten aufgerufen werden[/FONT]
[FONT=Verdana, sans-serif]
Code:
curl --user USER:PASSWORT --insecure https://domain.tld/script
Am Ende kann man die obige Zeile beispielsweise als Aktion bei einem IP-Wechsel festlegen, bei mir muss ich dazu nur eine Datei in /etc/dhcp3/dhclient-enter-hooks.d/dyndns anlegen, welche folgendes enthält:
[/FONT]
Code:
[FONT=Verdana, sans-serif][SIZE=2]#!/bin/bash
[/SIZE][/FONT][FONT=Verdana, sans-serif][SIZE=2][FONT=Verdana, sans-serif][SIZE=2]curl --user USER:PASSWORT --insecure https://domain.tld/script[/SIZE][/FONT][/SIZE][/FONT]
P.S.: für Fragen und Anmerkungen wäre ich dankbar - ich habe das Setup zwar so genau wie möglich dokumentiert, dennoch kann es natürlich sein, dass ich etwas vergessen oder übersehen habe.
Fehlermeldungen:
=> checken, ob der Key korrekt in named.keys hinterlegt wurde. Bind neustarten und nochmal versuchen.; TSIG error with server: tsig indicates error
update failed: NOTAUTH(BADSIG)
=> dieser Fehler wird beispielsweise dann ausgegeben, wenn die Key-Datei fehlt. Sind *.private und *.key im gleichen Verzeichnis hinterlegt und lesbar für Bind?02-Oct-2014 07:36:41.144 /etc/bind/keys/KEYFILE.private:1: unknown option 'Private-key-format:'
02-Oct-2014 07:36:41.144 /etc/bind/keys/KEYFILE.private:8: unexpected token near end of file
could not read key from /etc/bind/keys/KEYFILE.{private,key}: unexpected token
[/FONT]
Zuletzt bearbeitet: