Dynamisches DNS mit ddclient aktualisieren

Zum Aktualisieren der IPv4 und IPv6-Adressen meines Heimservers nutze ich nun nicht mehr meine eigenen Scripte, sondern ddclient.
ddclient
Heimserver
IPv6
ubuntuusers
Autor:in

Joe Slam

Veröffentlichungsdatum

31 März 2024 - 20:00

Geändert

31 März 2024 - 22:43

Mein Heimserver ist seit Jahren über eine dynamische-DNS-Adresse von spDYN per SSH erreichbar. Da ich einer der letzten glücklichen kleinen Lichter bin, die noch eine echte IP4-Adresse erhalten (und keine genattete), kann ich mich so immer von überall auf meine Kiste einloggen.

Bislang habe ich meine aktuellen IP-Adressen mittels Script geupdatet. Im Zuge notwendiger Aktualisierungen bin ich über ddclient gestolpert und nutze es seit dem ausschließlich - mein Script ist in Rente gegangen.

ddclient

ddclient ist ein Perl-Client, der dynamische DNS-Einträge für Konten vieler dynamischer DNS-Dienste aktualisieren kann. Auf der Github-Seite steht eine Liste der kompatiblen Dienste bereit, viele weitere Dienste funktionieren aber ebenfalls, da sie die selben Protokolle verwenden.

Ich nutze ddclient mit folgenden freien DynDNS-Anbietern:

Da ich einen echten Dual-Stack habe, sollen IPv4 und IPv6 gleichzeitig aktualisiert werden.

Installation

ddclient kann installiert werden mittels:

# Ubuntu
sudo apt-get install ddclient

# Arch, btw
pacman -S ddclient

Konfiguration

systemd

Ich bereite mir ein Systemd-Skellet vor, so dass ich alle .conf-Dateien im Verzeichnis /etc/ddclient/ steuern kann.

sudo nano /etc/systemd/system/ddclient@.service

[Unit]
Documentation=man:ddclient(8)
Description=Update dynamic domain name service entries
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
Environment=daemon_interval=10m
EnvironmentFile=-/etc/default/ddclient
ExecStart=/sbin/ddclient -syslog -file /etc/ddclient/%I.conf -cache /var/cache/ddclient/%I.cache
Restart=on-failure

[Install]
WantedBy=multi-user.target

Jetzt müssen die Services neu geladen werden,…

sudo systemctl daemon-reload

…und schon kann es losgehen. Alle FOO.conf-Dateien im Verzeichnis /etc/ddclient lassen sich nun steuern mittels systemctl start ddclient@FOO (ohne .conf).

Dafür müssen wir aber diese Config-Dateien erstellen, und wir sollten wissen, wie wir unsere “echten” globalen IPv4 und IPv6-Adressen abrufen können.

IP-Adressen abrufen

ddclient kann die Adressen entweder über die Interfaceschnittstelle oder über das Web beziehen. Das führt bei mir allerdings zu Probleme:

  • über die Interface-Schnittstelle (z.B. eth0) finde ich nur meine lokal LAN-IP (weil ich hinter meiner FritzBox sitze)
  • über die web-Methode finde ich nur eine IPv6-Adresse, nicht aber meine IPv4.

Daher muss ich sicherstellen, dass für IPv4 wirklich die gültige IPv4 gefunden wird, und für IPv6 ebenso. Ich kann diese externen IP-Adressen mittels curl abrufen:

# externe IPv4
curl -s4 http://ifconfig.me/ip

# externe IPv6
curl -s6 http://ifconfig.me/ip

Dies mache ich mir in ddclient zu nutze, denn neben “Interface” und “Web” kann über den Parameter cmd=<PROGRAM> ein custom Script angegeben werden, welches die IP-Adressen ermittelt. Ich erzeuge mir diese Scripte jeweils für IPv4 und IPv6 direkt im Verzeichnis /etc/ddclient.

sudo nano /etc/ddclient/myipv4address.sh

curl -s4 http://ifconfig.me/ip

sudo nano /etc/ddclient/myipv6address.sh

curl -s6 http://ifconfig.me/ip

Die Scriptdateien müssen noch ausführbar gemacht werden: sudo chmod +x /etc/ddclient/myipv6address.sh /etc/ddclient/myipv4address.sh

ddclient für meinen Anbieter konfigurieren

Für jeden DynDNS-Dienst lege ich mir eine eigene Config-Datei an. So sieht z.B. meine Client-Config für DuckDNS aus:

sudo nano /etc/ddclient/duckdns.conf

daemon=300                       # check every 300 seconds
syslog=yes                       # log update msgs to syslog
pid=/var/run/ddclientduckdns.pid # record PID in file.
ssl=yes                          # use ssl-support.
debug=yes                        # write to journal log
verbose=yes                      # write to journal log
usev4=cmdv4, cmdv4=/etc/ddclient/myipv4address.sh # IPv4
usev6=cmdv6, cmdv6=/etc/ddclient/myipv6address.sh # IPv6

#### DUCKDNS.org ########
#------------------------
protocol=duckdns,    # Komma muss bleiben
password=9a5dc6a5-FUCK-AFD-bbaf-foobar # ersetze dein Token
YOURNAME.duckdns.org # deinen Namen ersetzen

Für Dynv6.com sieht diese so aus:

sudo nano /etc/ddclient/dynv6.conf

daemon=300                     # check every 300 seconds
syslog=yes                     # log update msgs to syslog
pid=/var/run/ddclientdynv6.pid # record PID in file.
ssl=yes                        # use ssl-support.
debug=yes                      # write to journal log
verbose=yes                    # write to journal log
usev4=cmdv4, cmdv4=/etc/ddclient/myipv4address.sh # für IPv4
usev6=cmdv6, cmdv6=/etc/ddclient/myipv6address.sh # für IPv6

#### DYNv6.com ##########
#------------------------
protocol=dyndns2
server=dynv6.com
password='sKx3hF_stPT_fuck_AfD_1rPmskxiTga' 
login=none
YOURNAME.dynv6.net

ddclient starten

Zunächst können die Einstellungen getestet werden, ohne Daten zum Server zu senden:

ddclient -daemon=0 -debug -verbose -noquiet -file /etc/ddclient/dynv6.conf

Sieht alles gut aus, können wir die Dienste wie folgt aktivieren:

# aktivieren und starten
sudo systemctl enable --now ddclient@duckdns
sudo systemctl enable --now ddclient@dynv6

# Logs ansehen
journalctl -u ddclient@duckdns -f
journalctl -u ddclient@dynv6 -f

Tolle Sache, funktioniert prima!