Bei dynamischen IP-Adressen ist eine regelmäßige Aktualisierung der DNS-Einträge erforderlich, um die Erreichbarkeit von Servern sicherzustellen. Die neue Hetzner Cloud API ermöglicht eine automatisierte Umsetzung.
Hetzner hat kürzlich ihre DNS-API von dns.hetzner.com auf api.hetzner.cloud umgestellt. Die bisherige API wird voraussichtlich im Mai vollständig abgeschaltet, sodass ein Wechsel unumgänglich ist. Mit der neuen API werden DNS-Einträge nun über sogenannte RRSets verwaltet. Diese Änderung sorgt nicht nur für eine konsistentere Verwaltung der DNS-Records, sondern macht entsprechende Skripte auch deutlich übersichtlicher und besser wartbar.
Wichtig ist außerdem: Wurden Domains vollständig auf die neue DNS-API migriert, muss ein neuer API-Token erstellt und verwendet werden, da Tokens der alten API nicht mehr kompatibel sind. Das folgende DNS-Skript zeigt, wie sich dynamische IP-Adressen unter GNU/Linux automatisch aktualisieren lassen.
Für das DNS-Skript wird cURL benötigt:
sudo apt install curl
Mit folgendem Befehl lässt sich die Zone-ID einer Domain abrufen. Vor der Anwendung muss der API_TOKEN angepasst werden:
curl \
-H "Authorization: Bearer $API_TOKEN" \
"https://api.hetzner.cloud/v1/zones"
Im Folgenden ist das DNS-Skript in Bash dargestellt. API_TOKEN, Zone-IDs und RRsets sind vor der Anwendung an die eigenen Domains anzupassen:
#!/bin/bash
# =========================
# Configuration
# =========================
API_TOKEN="<API-TOKEN>"
# Zones and RRsets to update
# Format: ZONE_ID_OR_NAME:RR_NAME:RR_TYPE
# Example: "123123:www:A"
RRSETS=(
"<ZONE_ID_OR_NAME>:<RR_NAME>:<RR_TYPE>"
"<ZONE_ID_OR_NAME>:<RR_NAME>:<RR_TYPE>"
"<ZONE_ID_OR_NAME>:<RR_NAME>:<RR_TYPE>"
)
IP_FILE="/tmp/last_ip.txt"
# =========================
# Get current public IP
# =========================
CURRENT_IP=$(curl -4 -s https://ifconfig.me)
if [[ -z "$CURRENT_IP" ]]; then
echo "Failed to detect public IP"
exit 1
fi
# =========================
# Read last known IP
# =========================
LAST_IP=""
[[ -f "$IP_FILE" ]] && LAST_IP=$(cat "$IP_FILE")
# =========================
# Compare IPs
# =========================
if [[ "$CURRENT_IP" == "$LAST_IP" ]]; then
echo "No IP change detected ($CURRENT_IP)"
exit 0
fi
echo "Detected IP change: $LAST_IP → $CURRENT_IP"
echo "$CURRENT_IP" > "$IP_FILE"
# =========================
# Update function
# =========================
update_rrset() {
local zone="$1"
local name="$2"
local type="$3"
local ip="$4"
echo "Updating $name.$zone ($type → $ip)"
curl -s -X POST \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"records\": [
{
\"value\": \"$ip\",
\"comment\": \"Updated by DNS-Script\"
}
]
}" \
"https://api.hetzner.cloud/v1/zones/$zone/rrsets/$name/$type/actions/set_records"
}
# =========================
# Iterate RRsets
# =========================
for entry in "${RRSETS[@]}"; do
IFS=':' read -r zone name type <<< "$entry"
update_rrset "$zone" "$name" "$type" "$CURRENT_IP"
done
echo "DNS update completed."
Dynamische IPs automatisch per DNS-Skript aktualisieren (Hetzner Cloud API, GNU/Linux)