Zum Inhalt springen

Dynamische IPs automatisch per DNS-Skript aktualisieren (Hetzner Cloud API, GNU/Linux)

21. Januar 2026 durch
Christian Lisec

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."
Christian Lisec 21. Januar 2026
Diesen Beitrag teilen