So richten Sie Cloudflare Dynamic DNS ein

Angenommen, Sie haben eine Website aus Ihrem Heimnetzwerk veröffentlicht und einen DNS-Eintrag erstellt, der auf die öffentliche IP-Adresse Ihres Routers verweist. Wie halten Sie Ihren DNS-Eintrag aktuell, wenn sich Ihre öffentliche IP-Adresse ändert? Möglicherweise sollten Sie in Betracht ziehen, eine dynamische DNS von Cloudflare einzurichten.

Internetdienstanbieter (ISP) weisen ihren Abonnenten in der Regel dynamische IP-Adressen zu, die sich jederzeit ändern können. Dadurch bleibt Ihr DNS-Eintrag auf eine IP-Adresse verweisen, die nicht mehr Ihnen gehört, und Ihre Website wird unzugänglich.

Lesen Sie weiter, denn dieses Tutorial wird Ihnen helfen, Ihren DNS-Eintrag mithilfe der Anwendungsprogrammierschnittstelle (API) von Cloudflare und PowerShell aktuell zu halten. Legen wir los!

Voraussetzungen

Wenn Sie dieses Tutorial praktisch umsetzen möchten, benötigen Sie die folgenden Voraussetzungen.

  • A computer with PowerShell 7.1 where you’ll run the Cloudflare dynamic DNS update script. This tutorial will use a Windows 10 computer.
  • A script editor of your choice. This tutorial will use Visual Studio Code v1.59.1 (recommended).
  • A domain that you already own. The example domain in this tutorial is lazyexchangeadmin.cyou.

Kostenlose Top-Level-Domains (TLD) wie .ml, .ga., .tk, .cf und .gq sind für die automatische Cloudflare Dynamic DNS nicht geeignet und funktionieren nicht mit diesem Tutorial.

Sample DNS A record in Cloudflare

Was ist Cloudflare Dynamic DNS?

DNS-Einträge sind von Natur aus statisch und funktionieren nicht gut mit dynamischen IP-Adressen. Um dieses Problem zu lösen, musst du dynamisches DNS einrichten. Glücklicherweise bietet Cloudflare eine API, mit der du DNS-Einträge programmgesteuert verwalten kannst.

Um Cloudflare Dynamic DNS einzurichten, musst du einen Prozess auf einem Client in deinem Netzwerk ausführen, der zwei Hauptaufgaben erledigt: die aktuelle öffentliche IP-Adresse deines Netzwerks abrufen und den entsprechenden DNS-Eintrag automatisch aktualisieren.

Das folgende Bild zeigt das High-Level-Diagramm, wie der Cloudflare Dynamic DNS Update-Ablauf erfolgt.

Cloudflare Dynamic DNS update flow

Es gibt viele dynamische DNS-Clients, die installiert werden können, hauptsächlich für Linux-Systeme wie ein Ubuntu-Server oder Raspberry Pi. Es gibt auch Drittanbieter-DNS-Dienste, die kostenpflichtig oder kostenlos sein können. In diesem Tutorial verwenden Sie jedoch ein DNS-Updater-Skript, das unter PowerShell 7.1 ausgeführt wird.

Erhalten eines Cloudflare API-Tokens

Wenn Sie den Cloudflare Dynamic DNS-Eintrag programmgesteuert aktualisieren möchten, muss sich Ihr Skript bei der Cloudflare-API authentifizieren. Nur dann erlaubt Ihnen Cloudflare, Änderungen an den DNS-Einträgen in Ihrem Konto vorzunehmen.

Cloudflare ermöglicht Ihnen das Erstellen von API-Tokens mit ausreichenden Berechtigungen für diesen Zweck. Sie können dann Ihren Cloudflare-Benutzernamen und das resultierende API-Token verwenden, um sich bei der Cloudflare-API zu authentifizieren.

Um ein Cloudflare API-Token zu erstellen, befolgen Sie diese Schritte.

1. Öffnen Sie Ihren Browser, navigieren Sie zu https://dash.cloudflare.com/login/ und melden Sie sich in Ihrem Cloudflare-Konto an.

2. Nach dem Anmelden im Cloudflare-Dashboard klicken Sie auf die Profilschaltfläche in der oberen rechten Ecke und klicken Sie auf Mein Profil.

Opening your Cloudflare profile page

3. Klicken Sie als Nächstes auf den Link API Tokens. Klicken Sie unter dem Abschnitt API Tokens auf die Schaltfläche Token erstellen. Das folgende Beispiel geht davon aus, dass Sie bisher noch keine API-Tokens erstellt haben.

Clicking Create Token

4. Klicken Sie auf der Liste der API-Token-Vorlagen auf die Vorlage „Zone-DNS bearbeiten“, um sie zu verwenden. Diese Vorlage ermöglicht es Ihnen, ein API-Token mit Bearbeitungsberechtigung für alle oder ausgewählte DNS-Zonen in Ihrem Konto zu erstellen.

Selecting the Edit zone DNS API token template

5. Unter dem Abschnitt „Zonenressourcen“ auf der Seite „Token erstellen“ klicken Sie auf das rechte Dropdown-Feld und wählen Sie die DNS-Zone aus, die in den Zugriff dieses API-Tokens einbezogen werden soll. Nachdem Sie die DNS-Zone ausgewählt haben, klicken Sie auf „Weiter zur Zusammenfassung“.

Optional: Um den Gültigkeitszeitraum des API-Tokens einzuschränken, füllen Sie das Feld „Startdatum“ und „Enddatum“ im Abschnitt „TTL“ aus. Wenn Sie diese Felder leer lassen, hat das API-Token kein Ablaufdatum.

Selecting the DNS Zone

6. Überprüfen Sie die Zusammenfassung und stellen Sie sicher, dass die API die Berechtigung „DNS:Edit“ für die zuvor ausgewählte DNS-Zone hat. Klicken Sie abschließend auf „Token erstellen“, um das API-Token zu erstellen.

Reviewing the API token permission

7. Nachdem Sie das API-Token erstellt haben, kopieren Sie den Token-Wert und stellen Sie sicher, dass Sie ihn sicher aufbewahren. Behandeln Sie das API-Token wie ein Passwort.

Copying the API Token

8. Gehen Sie zur Registerkarte „API-Tokens“ zurück und bestätigen Sie die Existenz des von Ihnen erstellten API-Tokens.

Verifying the API Token

Einrichten des Cloudflare Dynamic DNS Update Scripts

Sie haben jetzt das Cloudflare-Konto und das Cloudflare-API-Token mit Bearbeitungsberechtigung für eine DNS-Zone. Was kommt als Nächstes? Sie müssen das API-Token verwenden und es mit einem Skript integrieren, das den Cloudflare Dynamic DNS-Eintrag programmgesteuert aktualisiert.

Dieses Tutorial bietet Ihnen ein funktionierendes PowerShell-Skript speziell zum Aktualisieren eines DNS-Eintrags in Cloudflare.

Speichern des Skripts

Befolgen Sie die folgenden Schritte, um das PowerShell-Skript für dynamisches DNS in Cloudflare auf Ihrem Client-Computer zu speichern.

1. Entscheiden Sie, in welchen Ordner Sie das Skript speichern möchten, und erstellen Sie diesen Ordner, wenn er noch nicht vorhanden ist. In diesem Beispiel befindet sich das Skript im Ordner C:\CloudflareDDNS.

2. Öffnen Sie Ihren Code-Editor, z. B. VSCode, und erstellen Sie eine neue PowerShell-Skriptdatei namens Update-CloudflareDDNS.ps1. Speichern Sie das Skript im Ordner C:\CloudflareDDNS.

3. Kopieren Sie das unten stehende Skript, fügen Sie es in Ihren Code-Editor ein und speichern Sie die Datei. Lesen Sie die Inline-Kommentare, um zu verstehen, was das Skript tut.

#requires -Version 7.1

[cmdletbinding()]
param (
    [parameter(Mandatory)]
    $Email,
    [parameter(Mandatory)]
    $Token,
    [parameter(Mandatory)]
    $Domain,
    [parameter(Mandatory)]
    $Record
)

# Erstellt die Anforderungsheader einmalig. Diese Header werden im gesamten Skript verwendet.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Region Token Test
## Dieser Block überprüft, ob Ihr API-Schlüssel gültig ist.
## Wenn nicht, wird das Skript beendet.

$uri = "https://api.cloudflare.com/client/v4/user/tokens/verify"

$auth_result = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($auth_result.result)) {
    Write-Output "API token validation failed. Error: $($auth_result.errors.message). Terminating script."
    # Skript beenden
    return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#EndRegion

#Region Zone-ID abrufen
## Ruft die Zone-Identifier der Domain anhand des Zonennamens ab. Wenn der Identifier nicht gefunden wird, wird das Skript beendet.
$uri = "https://api.cloudflare.com/client/v4/zones?name=$($Domain)"
$DnsZone = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($DnsZone.result)) {
    Write-Output "Search for the DNS domain [$($Domain)] return zero results. Terminating script."
    # Skript beenden
    return
}
## DNS-Zonen-ID speichern
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#End Region

#Region DNS-Eintrag abrufen
## Ruft die Details des vorhandenen DNS-Eintrags von Cloudflare ab.
$uri = "https://api.cloudflare.com/client/v4/zones/$($zone_id)/dns_records?name=$($Record)"
$DnsRecord = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers -SkipHttpErrorCheck
if (-not($DnsRecord.result)) {
    Write-Output "Search for the DNS record [$($Record)] return zero results. Terminating script."
    # Skript beenden
    return
}
## Aktuelle IP-Adresse im DNS-Eintrag speichern
$old_ip = $DnsRecord.result.content
## DNS-Eintragstyp-Wert speichern
$record_type = $DnsRecord.result.type
## DNS-Eintrag-ID-Wert speichern
$record_id = $DnsRecord.result.id
## DNS-Eintrag-TTL-Wert speichern
$record_ttl = $DnsRecord.result.ttl
## DNS-Eintrag-Proxied-Wert speichern
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#EndRegion

#Region Aktuelle öffentliche IP-Adresse abrufen
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#EndRegion

#Region Dynamic DNS-Eintrag aktualisieren
## Vergleichen Sie die aktuelle IP-Adresse mit dem DNS-Eintrag
## Wenn die aktuelle IP-Adresse nicht mit der IP-Adresse des DNS-Eintrags übereinstimmt, aktualisieren Sie den DNS-Eintrag.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## Aktualisieren Sie den DNS-Eintrag mit der neuen IP-Adresse
    $uri = "https://api.cloudflare.com/client/v4/zones/$($zone_id)/dns_records/$($record_id)"
    $body = @{
        type    = $record_type
        name    = $Record
        content = $new_ip
        ttl     = $record_ttl
        proxied = $record_proxied
    } | ConvertTo-Json

    $Update = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -SkipHttpErrorCheck -Body $body
    if (($Update.errors)) {
        Write-Output "DNS record update failed. Error: $($Update[0].errors.message)"
        ## Skript beenden
        return
    }

    Write-Output "DNS record update successful."
    return ($Update.result)
}
else {
    Write-Output "The current IP address and DNS record IP address are the same. There's no need to update."
}
#EndRegion

Das Skript ausführen

Nachdem Sie das Cloudflare-Dynamic-DNS-Aktualisierungsskript gespeichert haben, was kommt als nächstes? Bevor Sie das Skript bereitstellen, ist es wichtig, zu testen, ob seine Funktionalität funktioniert. Zum Ausführen des Skripts sind vier Details erforderlich, und das sind:

  • E-Mail – dies ist die E-Mail-Adresse für Ihr Cloudflare-Konto.
  • Token – das API-Token, das Sie zuvor aus Ihrem Cloudflare-Konto erstellt haben.
  • Domain – der DNS-Domänenname, der den DNS-Eintrag enthält, den Sie aktualisieren möchten. (z. B. lazyexchangeadmin.cyou).
  • Record – der DNS-Eintrag, den Sie aktualisieren möchten. (z. B. demo.lazyexchangeadmin.cyou).

Um das Skript auszuführen, gehen Sie wie folgt vor.

1. Öffnen Sie zunächst eine PowerShell-Sitzung. Oder verwenden Sie, wenn Sie VSCode verwenden, stattdessen das VSCode PowerShell-Terminal.

2. Führen Sie als Nächstes eine DNS-Eintragssuche durch, um die IP-Adresse des aktuellen DNS-Eintrags zu bestätigen. Führen Sie dazu das Resolve-DnsName-Cmdlet aus, wie unten gezeigt. Stellen Sie sicher, den vollqualifizierten Domänennamen (FQDN) mit dem -Name-Parameter anzugeben.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

Der Befehl sollte den DNS-Eintrag zurückgeben, den Sie gesucht haben, einschließlich seiner IP-Adresse.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Nun, rufen Sie das Skript Update-CloudflareDDNS.ps1 auf, um den DNS-Eintrag in Cloudflare zu aktualisieren, indem Sie den folgenden Befehl ausführen. Stellen Sie sicher, dass Sie die Werte für Email, Token, Domain und Record ändern. Der Befehl geht davon aus, dass sich Ihr Skript unter C:\CloudflareDDNS\Update-CloudflareDDNS.ps1 befindet.

C:\CloudflareDDNS\Update-CloudflareDDNS.ps1 `
-Email '[email protected]' `
-Token 'kGW8n........eJl5a' `
-Domain 'lazyexchangeadmin.cyou' `
-Record 'demo.lazyexchangeadmin.cyou'

Das Skript führt dann die folgenden Aktionen durch, wie im Screenshot unten zu sehen.

  1. Validiert das API-Token.
  2. Findet die Domain mit dem zu aktualisierenden DNS-Eintrag.
  3. Sucht den zu aktualisierenden DNS-Eintrag.
  4. Vergleicht die IP-Adresse des DNS-Eintrags mit der tatsächlichen externen oder öffentlichen IP-Adresse.
  5. Aktualisiert die IP-Adresse des DNS-Eintrags in Cloudflare.
  6. Zeigt das Ergebnis der dynamischen DNS-Aktualisierung an.
Running the Cloudflare dynamic DNS update script

4. Gehen Sie zurück zu Ihrem Cloudflare-Dashboard und überprüfen Sie, ob der DNS-Eintrag die neue IP-Adresse widerspiegelt. Der Screenshot unten zeigt, dass sich die IP-Adresse nach dem Ausführen des Update-Skripts auf die externe IP-Adresse geändert hat.

Verifying the DNS record in Cloudflare

5. Führen Sie abschließend eine weitere DNS-Aufzeichnungsabfrage wie in Schritt 2 durch, um zu bestätigen, ob die neue IP-Adresse bereits öffentlich propagiert wurde.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

Die Propagierung des DNS-Eintrags kann mehrere Minuten, Stunden oder sogar Tage dauern. In diesem Beispiel hat die Cloudflare-Propagierung weniger als eine Minute gedauert.

Looking up a DNS record after the Cloudflare dynamic DNS update

Planung der Cloudflare Dynamic DNS Update-Aufgabe

An diesem Punkt haben Sie jetzt ein funktionierendes Skript, das Ihren Cloudflare Dynamic DNS-Eintrag aktualisiert. Das Skript manuell jedes Mal auszuführen ist jedoch nicht das Ziel. Sie müssen sicherstellen, dass die Dynamic DNS-Aktualisierung automatisch gemäß einem Zeitplan erfolgt, so oft wie nötig.

Je nachdem, welches Betriebssystem Sie verwenden, variiert die Art und Weise, wie Sie das Skript planen, wie beispielsweise ein Cron-Job in Linux. In diesem Tutorial wird eine geplante Aufgabe für Windows erstellt, die das Cloudflare Dynamic DNS-Aktualisierungsskript alle fünf Minuten ausführt.

Festlegen der Aktion für die geplante Aufgabe

Ihre geplante Aufgabe muss eine Aktion haben, die Sie mit dem Befehl New-ScheduledTaskAction erstellen können. In diesem Beispiel besteht die Aktion darin, das Skript Update-CloudflareDDNS.ps1 mit der PowerShell-Ausführungsdatei pwsh.exe auszuführen.

Öffnen Sie dazu ein neues PowerShell-Fenster als Administrator. Kopieren Sie den unten stehenden Code in PowerShell und führen Sie ihn aus. Stellen Sie sicher, dass Sie die Variablen $scriptPath, $Email, $Token, $Domain und $Record ändern.

# Definieren Sie die Eigenschaften der geplanten Aufgabenaktion
## Geben Sie den Pfad zum PowerShell-Skript ein
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## E-Mail-Adresse des Cloudflare-Kontos
$Email = '[email protected]'
## Cloudflare-API-Token
$Token = 'kGW8n........eJl5a'
## DNS-Domänenname
$Domain = 'lazyexchangeadmin.cyou'
## Zu aktualisierender DNS-Eintrag
$Record = 'demo.lazyexchangeadmin.cyou'

# Erstellen Sie das geplante Aufgabenaktionsobjekt
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Erstellen des Auslösers für die geplante Aufgabe

Nachdem Sie definiert haben, was die Aufgabe tun wird, müssen Sie als nächstes einen Auslöser oder Zeitplan für die Aufgabe erstellen, indem Sie das New-ScheduledTaskTrigger-Cmdlet ausführen. Kopieren Sie den folgenden Code und führen Sie ihn in PowerShell aus, um einen neuen Aufgaben-Auslöser zu erstellen, der alle fünf Minuten innerhalb eines Zeitraums von zehn Jahren ausgeführt wird.

# Erstellen Sie einen neuen geplanten Aufgaben-Auslöser-Zeitplan
## Auslöser = alle 5 Minuten für 10 Jahre.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Registrieren der neuen geplanten Aufgabe im System

Endlich sind Sie bereit, die neue geplante Aufgabe auf dem Computer zu registrieren. Dazu müssen Sie das Register-ScheduledTask-Cmdlet ausführen, genau wie der folgende Code. Kopieren Sie den untenstehenden Code und führen Sie ihn in PowerShell aus, um die geplante Aufgabe zu registrieren.

Die resultierende geplante Aufgabe wird unter dem lokalen SYSTEM-Konto ausgeführt. Fühlen Sie sich frei, einem anderen Benutzerkonto zuzuweisen, um die geplante Aufgabe bei Bedarf auszuführen.

# Registrieren Sie die geplante Aufgabe im System.
## Name der geplanten Aufgabe
$TaskName = 'Update Cloudflare Dynamic DNS'
## Beschreibung der geplanten Aufgabe
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Erstellen Sie die geplante Aufgabe
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Wie unten zu sehen ist, hat der Befehl die geplante Aufgabe erstellt, und der Status ist bereit. Von diesem Punkt an wird das Skript in einem Fünf-Minuten-Intervall ausgeführt.

Registering the New Scheduled Task

Abschluss

Halten Sie DNS-Einträge mit Änderungen der dynamischen IP-Adressen auf dem neuesten Stand, muss keine Herausforderung sein. Sie müssen auch nicht für einen dynamischen DNS-Dienst bezahlen! Durch das Verwalten Ihrer DNS-Zonen in Cloudflare können Sie von deren API profitieren und Ihre DNS-Einträge programmgesteuert aktualisieren.

Sie haben in diesem Tutorial gelernt, wie Sie einen dynamischen Cloudflare-DNS-Eintrag mithilfe von API-Aufrufen, PowerShell 7 und geplanten Aufgaben aktualisieren können. All dies ermöglicht es Ihnen, Ihren Cloudflare-dynamischen DNS-Aktualisierungsmechanismus einmal zu konfigurieren und das Update in regelmäßigen Intervallen unbeaufsichtigt laufen zu lassen.

Würden Sie in Betracht ziehen, Ihre DNS-Zonen mit Cloudflare zu verwalten, um die Vorteile seiner API zu nutzen? Oder kennen Sie eine bequemere und zugänglichere Möglichkeit?

Source:
https://adamtheautomator.com/cloudflare-dynamic-dns/