DNS-Update via Bash-Script und API (fortgeschritten)
Wichtig
Damit Sie DynDNS benutzen können MUSS erst ein DNS API Benutzer anhand der Anleitung (Benutzer im Kundenportal erstellen) erstellt sein!
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 lernen Sie, wie Sie mit hilfe eines Bash Skriptes einen DynDNS Dienst für Ihre Domain bauen.
Vorbereitung¶
Das Skript ist für die Bash Shell ausgelegt. Sollte Ihre Linux Distribution mit einer anderen Shell arbeiten, installieren Sie bitte die Bash Shell nach.
Auf jedem Betriebssystem wird cURL vorausgesetzt.
DynDNS via Skript und Systemd Dienst¶
Das Skript¶
Im folgenden Sehen Sie ein Beispiel Skript, welches simpel mit cURL Befehlen den neuen Eintrag setzt. Dabei wird dieses Skript unendlich lange (bis zu einem manuellen Abbruch) weiterlaufen, also 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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"AAAA\",\"name\":\"subdomain\",\"content\":\"${IP4_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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-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
Bitte noch das Skript ausführbar machen:
chmod +x /pfad/zum/skript/dyndns.sh
Der Systemd Dienst (automatisches Starten des Skriptes)¶
Damit das Skript regelmäßig die IPs aktualisiert können wir dies automatisieren.
Dafür erstellen wir uns einen systemd Dienst, welcher das Skript beim hochfahren automatisch für uns im Hintergrund startet. Da das Skript unendlich lange läuft können wir den Dienst recht einfach halten.
Legen wir den Dienst an:
systemctl edit --force --full dnsupdate.service
Als Inhalt nehmen wir:
[Unit]
Description=Update DNS
[Service]
Type=simple
ExecStart=/pfad/zum/skript/dyndns.sh
KillMode=process
[Install]
WantedBy=multi-user.target
Wir aktivieren 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 die eigene IP verändert hat und bei bedarf den DNS Eintrag auf die neue IP zeigen lassen.
DynDNS via Skript und Cronjob¶
Das Skript¶
Alternativ zu der Systemd Variante als Dienst können Sie das Skript auch so nutzen, dass es von einem Cronjob manuell angestoßen und nach der Ausführung beendet wird.
Wir entfernen also Quasi die unendliche Schleife und rufen das Skript zu einem festen Zeitpunkt gezielt via Cronjob auf.
In diesem Fall sieht das Skript dann so aus:
#!/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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-H 'Content-Type: application/json' \
--data "{\"type\":\"AAAA\",\"name\":\"subdomain\",\"content\":\"${IP4_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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-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/IHRE_DOMAIN.tld' \
-H 'X-Auth-Username: IHR_API_BENUTZER' \
-H 'X-Auth-Password: IHR API PASSWORD' \
-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
Auch hier bitte wieder an das ausführbar machen denken:
chmod +x /pfad/zum/skript/dyndns.sh
Der Cronjob¶
Um den Cronjob anzulegen empfehlen wir für neulinge die Seite: crontab-generator.org!
Wir geben einen Cronjob, welcher alle 5 Minuten läuft als Beispiel vor:
crontab -e # Editieren der Cronjobs auf dem System
*/5 * * * * /bin/bash /pfad/zum/skript/dyndns.sh
Den Zeitlichen Interval können Sie nach bedarf selber festlegen. Wir empfehlen jedoch keine längeren Abstände als maximal 1 Stunde.
-
Die Zeit zur nächsten Prüfung lässt sich im Skript anhand der Dauer des
sleep
Befehles verändern. ↩