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.
#!/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 ...
$ chmod +770 /usr/local/bin/update_ipv64.sh
$ chown root:root /usr/local/bin/update_ipv64.sh
... und einen Cronjob einrichten, z. B.
# 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.