DynDNS Konfiguration bei ipv64.net

Dennis Schröder (Prox IT UG) bietet auf seiner Webseite https://ipv64.net unter anderem einen kostenlosen DynDNS Dienst an. Wer seinen Homeserver nicht über ein VPN, sondern klassisch über https erreichen möchte, der kann diesen Dienst nicht nur auf seinem DSL-Router (z. B. einer Fritz!Box), sondern auch auf seinem Homeserver einrichten um die dynamisch vergebenen IPv4 ud IPv6-Adressen des Internetproviders für die eigene Domain zu aktualisieren.

Besonders hervorzuheben ist, dass Dennis alle wichtigen Nameservereinträge, also z. B. auch TXT ermöglicht. Somit ist es möglich einen korrekt konfigurierten Nameserver mit Letsencrypt Zertifikaten auf dem Homeserver einzurichten, was nur bei wenigen DynDNS Anbietern möglich ist.

In meinem Fall funktionierte das veraltetet Debian DDNS nicht zuverlässig, weshalb ich ein eigenes Script zur Aktualisierung der aktuellen IPv4 und IPv6-Adressen meines Internetzuganges konfigurierte.

BASH
#!/bin/bash

# RGL 2026-09-22 Erweiterung um Log und Fehlerstatus

# Aktualisiert die IPv4- und IPv6-Adresse bei ipv64.net und protokolliert
# Zum Ansehen des Logs:
### journalctl -t ipv64_check_v4 -t ipv64_check_v6 --since "1 hour ago"
# für jeden Aufruf HTTP-Status, Antworttext und curl-Exitcode.

# Den Key von der Webseite https://ipv64.net für die DynDNS abrufen!
KEY="**********************************"
URL="https://ipv64.net/nic/update?key=${KEY}"

update() {
  local proto="$1"   # "-4" oder "-6"
  local tag="$2"      # "ipv64_v4" oder "ipv64_v6"

  # -w hängt "HTTP_STATUS:<code>" an die eigentliche Antwort an,
  # damit wir Body und Status in einem einzigen curl-Aufruf bekommen.
  local response
  response=$(curl "${proto}" --http1.1 --max-time 10 -s \
    -w "\nHTTP_STATUS:%{http_code}" "$URL")
  local curl_exit=$?

  local http_status
  http_status=$(echo "$response" | grep -o 'HTTP_STATUS:[0-9]*' | cut -d: -f2)
  local body
  body=$(echo "$response" | sed '/HTTP_STATUS:/d')

  if [ "$curl_exit" -ne 0 ]; then
    logger -t "$tag" "FEHLER: curl-Exitcode $curl_exit (kein Netzwerk/Timeout?) - Antwort: $body"
  elif [ "$http_status" != "200" ]; then
    logger -t "$tag" "FEHLER: HTTP $http_status - Antwort: $body"
  else
    logger -t "$tag" "OK: HTTP $http_status - Antwort: $body"
  fi
}

verify() {
  local proto="$1"        # "-4" oder "-6"
  local record_type="$2"  # "A" oder "AAAA"
  local tag="$3"

  local external_ip
  external_ip=$(curl "${proto}" -s --max-time 10 ifconfig.me)

  # Abfrage direkt gegen einen öffentlichen Resolver (1.1.1.1), um lokale
  # DNS-Caches (z. B. dnsmasq auf dem YunoHost-Server) zu umgehen.
  local dns_ip
  dns_ip=$(dig +short "$record_type" rgl.ipv64.de @1.1.1.1 | tail -n1)

  if [ -z "$external_ip" ]; then
    logger -t "$tag" "FEHLER: externe IP ($record_type) konnte nicht ermittelt werden"
  elif [ -z "$dns_ip" ]; then
    logger -t "$tag" "FEHLER: DNS-Eintrag ($record_type) für rgl.ipv64.de konnte nicht abgefragt werden"
  elif [ "$external_ip" = "$dns_ip" ]; then
    logger -t "$tag" "OK: externe IP ($external_ip) stimmt mit DNS-Eintrag ($record_type) überein"
  else
    logger -t "$tag" "FEHLER: externe IP ($external_ip) weicht vom DNS-Eintrag ($record_type: $dns_ip) ab"
  fi
}

update -4 ipv64_v4
update -6 ipv64_v6

# Kurze Pause, damit ipv64.net die Änderung in der eigenen Zone verarbeiten kann,
# bevor wir per öffentlichem Resolver nachfragen.
sleep 5

verify -4 A ipv64_check_v4
verify -6 AAAA ipv64_check_v6

anschließend noch ...

SH
$ chmod +770  /usr/local/bin/update_ipv64.sh
$ chown root:root /usr/local/bin/update_ipv64.sh

... und einen Cronjob einrichten, z. B.

TXT
# Nachts zwischen 4 und 4:59 Uhr alle 6 Minuten prüfen (10 Updates)
*/6 4 * * * /usr/local/bin/update_ipv64.sh

# den Rest des Tages nur einmal pro Stunde prüfen (23 Updates)
0 0-3,5-23 * * * /usr/local/bin/update_ipv64.sh

Da sowohl IPv4 als auch IPv6 durch das Script aktualisiert wird, kommt man somit täglich auf genau 66 Updates.

```twig