Zum Inhalt

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:

Systemd Dienst zum Starten des DynDNS-Skriptes
[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.


  1. Die Zeit bis zur nächsten Prüfung lässt sich im Skript durch die Dauer des sleep-Befehls verändern.