DNS-Update via Bash-Script und API (fortgeschritten)
Wichtig
Damit du DynDNS nutzen kannst, MUSS zuerst ein DNS-API-Benutzer gemäß der Anleitung (Benutzer im Kundenportal erstellen) erstellt werden!
Unveränderte API-Syntax
Trotz neuer DNS-API-Zugänge und -Funktionen bleibt die Kern-API-Syntax unverändert gegenüber früheren Versionen.
Die DynDNS-Schnittstelle nutzt weiterhin die gleiche API-Syntax und ist daher auch ohne Anpassung des Skripts nutzbar (außer den neuen Login-Daten).
Für alle Domain-Kunden bieten wir einen DynDNS-Dienst an, welcher über die Servercow-DNS-API mit den Servercow-Nameservern kommuniziert.
In dieser Anleitung lernst du, wie du mit Hilfe eines Bash-Skripts einen DynDNS-Dienst für deine Domain baust.
Vorbereitung¶
Das Skript ist für die Bash-Shell ausgelegt. Sollte deine Linux-Distribution mit einer anderen Shell arbeiten, installiere bitte die Bash-Shell.
Auf jedem Betriebssystem benötigst du cURL.
DynDNS via Skript und systemd-Dienst¶
Das Skript¶
Im Folgenden siehst du ein Beispielskript, das simpel mit cURL-Befehlen den neuen Eintrag setzt. Das Skript läuft unendlich (bis zu einem manuellen Abbruch) weiter — ideal, um daraus später einen Dienst zu machen:
#!/bin/bash
while true; do
if [ -f /tmp/old_ip4 ]; then
IP4_OLD=$(</tmp/old_ip4)
else
IP4_OLD=none
fi
IP4_NEW=$(curl -s ip4.mailcow.email)
if [[ "${IP4_NEW}" != "${IP4_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"A\",\"name\":\"subdomain\",\"content\":\"${IP4_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP4_NEW} > /tmp/old_ip4
if [ -f /tmp/old_ip6 ]; then
IP6_OLD=$(</tmp/old_ip6)
else
IP6_OLD=none
fi
IP6_NEW=$(curl -s ip6.mailcow.email)
if [[ "${IP6_NEW}" != "${IP6_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"AAAA\",\"name\":\"subdomain\",\"content\":\"${IP6_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP6_NEW} > /tmp/old_ip6
sleep 120
done
#!/bin/bash
while true; do
if [ -f /tmp/old_ip ]; then
IP_OLD=$(</tmp/old_ip)
else
IP_OLD=none
fi
IP_NEW=$(curl -s ip4.mailcow.email)
if [[ "${IP_NEW}" != "${IP_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"A\",\"name\":\"subdomain\",\"content\":\"${IP_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP_NEW} > /tmp/old_ip
sleep 120
done
#!/bin/bash
while true; do
if [ -f /tmp/old_ip ]; then
IP_OLD=$(</tmp/old_ip)
else
IP_OLD=none
fi
IP_NEW=$(curl -s ip6.mailcow.email)
if [[ "${IP_NEW}" != "${IP_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"AAAA\",\"name\":\"subdomain\",\"content\":\"${IP_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP_NEW} > /tmp/old_ip
sleep 120
done
Mach das Skript anschließend ausführbar:
chmod +x /pfad/zum/skript/dyndns.sh
Der systemd-Dienst (automatisches Starten des Skriptes)¶
Damit das Skript regelmäßig die IPs aktualisiert, kannst du das automatisieren.
Lege dafür einen systemd-Dienst an, der das Skript beim Hochfahren automatisch im Hintergrund startet. Da das Skript unendlich läuft, kann der Dienst recht einfach gehalten werden.
Erstelle den Dienst mit:
systemctl edit --force --full dnsupdate.service
Als Inhalt verwende:
[Unit]
Description=Update DNS
[Service]
Type=simple
ExecStart=/pfad/zum/skript/dyndns.sh
KillMode=process
[Install]
WantedBy=multi-user.target
Aktiviere den Dienst mit:
systemctl enable dnsupdate.service
systemctl start dnsupdate.service
Nun sollte das Skript automatisch laufen und alle 21 Minuten prüfen, ob sich deine IP verändert hat und bei Bedarf den DNS-Eintrag aktualisieren.
DynDNS via Skript und Cronjob¶
Das Skript¶
Alternativ zur systemd-Variante kannst du das Skript so nutzen, dass es von einem Cronjob angestoßen wird und nach der Ausführung beendet ist.
Entferne dafür die unendliche Schleife und rufe das Skript in festen Abständen via Cron auf.
Beispiel (Dual-Stack):
#!/bin/bash
if [ -f /tmp/old_ip4 ]; then
IP4_OLD=$(</tmp/old_ip4)
else
IP4_OLD=none
fi
IP4_NEW=$(curl -s ip4.mailcow.email)
if [[ "${IP4_NEW}" != "${IP4_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"A\",\"name\":\"subdomain\",\"content\":\"${IP4_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP4_NEW} > /tmp/old_ip4
if [ -f /tmp/old_ip6 ]; then
IP6_OLD=$(</tmp/old_ip6)
else
IP6_OLD=none
fi
IP6_NEW=$(curl -s ip6.mailcow.email)
if [[ "${IP6_NEW}" != "${IP6_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"AAAA\",\"name\":\"subdomain\",\"content\":\"${IP6_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP6_NEW} > /tmp/old_ip6
#!/bin/bash
if [ -f /tmp/old_ip ]; then
IP_OLD=$(</tmp/old_ip)
else
IP_OLD=none
fi
IP_NEW=$(curl -s ip4.mailcow.email)
if [[ "${IP_NEW}" != "${IP_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"A\",\"name\":\"subdomain\",\"content\":\"${IP_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP_NEW} > /tmp/old_ip
#!/bin/bash
if [ -f /tmp/old_ip ]; then
IP_OLD=$(</tmp/old_ip)
else
IP_OLD=none
fi
IP_NEW=$(curl -s ip6.mailcow.email)
if [[ "${IP_NEW}" != "${IP_OLD}" ]]; then
curl -s -X POST 'https://api.servercow.de/dns/v1/domains/DEINE_DOMAIN.tld' \
-H 'X-Auth-Username: DEIN_API_BENUTZER' \
-H 'X-Auth-Password: DEIN_API_PASSWORT' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"AAAA\",\"name\":\"subdomain\",\"content\":\"${IP_NEW}\",\"ttl\":60}" -o /dev/null
fi
echo ${IP_NEW} > /tmp/old_ip
Denk auch hier daran, das Skript ausführbar zu machen:
chmod +x /pfad/zum/skript/dyndns.sh
Der Cronjob¶
Um den Cronjob anzulegen, empfehlen wir für Einsteiger die Seite: crontab-generator.org!
Als Beispiel ein Cronjob, der alle 5 Minuten läuft:
crontab -e # Editiere die Cronjobs auf dem System
*/5 * * * * /bin/bash /pfad/zum/skript/dyndns.sh
Das Zeitintervall kannst du nach Bedarf anpassen. Wir empfehlen jedoch keine Abstände länger als eine Stunde.
-
Die Zeit bis zur nächsten Prüfung lässt sich im Skript durch die Dauer des
sleep-Befehls verändern. ↩