Hoe Cloudflare Dynamic DNS instellen

Stel dat je een website hebt gepubliceerd vanuit je thuisnetwerk en je hebt een DNS-record aangemaakt dat wijst naar het publieke IP-adres van je router. Hoe houd je je DNS-record up-to-date wanneer je publieke IP-adres verandert? Misschien moet je overwegen om Cloudflare Dynamic DNS in te stellen.

Internetproviders (ISP’s) wijzen meestal dynamische IP-adressen toe aan hun abonnees, die op elk moment kunnen veranderen. Hierdoor blijft je DNS-record wijzen naar een IP-adres dat niet langer van jou is, en wordt je website ontoegankelijk.

Blijf lezen, want deze handleiding zal je helpen om je DNS-record bij te werken met behulp van de Application Programming Interface (API) van Cloudflare en PowerShell. Laten we aan de slag gaan!

Vereisten

Als je van plan bent om deze handleiding praktisch te volgen, zijn hier de vereisten die je nodig hebt.

  • 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.

Gratis top-level domeinen (TLD’s), zoals .ml, .ga, .tk, .cf en .gq, zijn niet van toepassing voor Cloudflare Dynamic DNS-automatisering en zullen niet werken met deze handleiding.

Sample DNS A record in Cloudflare

Wat is Cloudflare Dynamische DNS?

DNS-records zijn inherent statisch en werken niet goed met dynamische IP-adressen. Nu, om dat probleem op te lossen, moet je dynamische DNS instellen. Gelukkig biedt Cloudflare een API waarmee je DNS-records programmatisch kunt beheren.

Om Cloudflare dynamische DNS in te stellen, moet je een proces uitvoeren op een client binnen je netwerk dat twee hoofdacties uitvoert: het huidige openbare IP-adres van je netwerk ophalen en automatisch het overeenkomstige DNS-record bijwerken.

De onderstaande afbeelding toont het hoog-niveau diagram van hoe de Cloudflare dynamische DNS-update plaatsvindt.

Cloudflare Dynamic DNS update flow

Er zijn veel dynamische DNS-clients beschikbaar om te installeren, voornamelijk voor Linux-systemen, zoals op een Ubuntu-server of Raspberry PI. Er bestaan ook externe dynamische DNS-services die betaald of gratis kunnen zijn. Maar in deze handleiding implementeer je een DNS-updater-script dat wordt uitgevoerd op PowerShell 7.1.

Het verkrijgen van een Cloudflare API Token

Wanneer je de Cloudflare dynamische DNS-record programmatisch bijwerkt, moet je script zich authentiseren bij de Cloudflare API. Alleen dan staat Cloudflare toe dat je wijzigingen aanbrengt in de DNS-records van jouw account.

Cloudflare staat toe dat je API-tokens maakt met voldoende rechten voor het beoogde doel. Vervolgens kun je jouw Cloudflare-accountgebruikersnaam en het resulterende API-token gebruiken om je te authenticeren bij de Cloudflare API.

Volg deze stappen om een Cloudflare API Token aan te maken.

1. Open je browser, ga naar https://dash.cloudflare.com/login/ en log in op je Cloudflare-account.

2. Nadat je bent ingelogd op het Cloudflare-dashboard, klik je op de profielknop in de rechterbovenhoek en klik je op Mijn Profiel.

Opening your Cloudflare profile page

3. Klik vervolgens op de API Tokens-tablink. Onder de API Tokens-sectie klik je op de knop Token Maken. Het voorbeeld hieronder gaat ervan uit dat je nog geen API-tokens hebt aangemaakt.

Clicking Create Token

4. Op de lijst van API-token sjablonen, klik op het Bewerk zone DNS sjabloon om het te gebruiken. Dit sjabloon stelt u in staat om een API-token te maken met bewerkingsrechten voor alle of geselecteerde DNS-zones in uw account.

Selecting the Edit zone DNS API token template

5. Onder de Zonebronnen sectie op de Token maken pagina, klik op de rechter dropdown-box en selecteer de DNS-zone om op te nemen in de toegang van dit API-token. Nadat u de DNS-zone heeft gekozen, klik op Doorgaan naar samenvatting.

Optioneel, om de geldigheidsduur van het API-token te beperken, vul de Startdatum en Einddatum in onder de TTL sectie. Indien blanco gelaten, zal het API-token geen vervaldatum hebben.

Selecting the DNS Zone

6. Controleer de samenvatting en zorg ervoor dat de API DNS:Bewerken toestemming heeft voor de eerder geselecteerde DNS-zone. Klik ten slotte op Token maken om het API-token te maken.

Reviewing the API token permission

7. Nadat u het API-token heeft aangemaakt, kopieer de tokenwaarde en zorg ervoor dat u deze veilig opslaat. Behandel het API-token zoals u een wachtwoord zou behandelen.

Copying the API Token

8. Ga terug naar het API-tokens tabblad en bevestig het bestaan van het API-token dat u heeft aangemaakt.

Verifying the API Token

Het instellen van het Cloudflare Dynamische DNS Update Script

U heeft nu het Cloudflare-account en het Cloudflare API-token met toestemming om een DNS-zone te bewerken. Wat is de volgende stap? U moet het API-token gebruiken en integreren met een script dat de Cloudflare dynamische DNS-record programmatisch bijwerkt.

Deze tutorial biedt u een werkend PowerShell-script specifiek voor het bijwerken van een DNS-record in Cloudflare.

Het Script Opslaan

Volg de onderstaande stappen om het Cloudflare dynamische DNS PowerShell-script op uw clientcomputer op te slaan.

1. Beslis in welke map u het script wilt opslaan en maak die map aan als deze nog niet bestaat. In dit voorbeeld bevindt de locatie van het script zich in C:\CloudflareDDNS.

2. Open uw code-editor, zoals VSCode, en maak een nieuw PowerShell-scriptbestand genaamd Update-CloudflareDDNS.ps1. Sla het script op in de map C:\CloudflareDDNS.

3. Kopieer het onderstaande script, plak het in uw code-editor en sla het bestand op. Raadpleeg de inline opmerkingen om te begrijpen wat het script doet.

#vereist -Versie 7.1

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

# Bouw de verzoekheaders eenmalig op. Deze headers worden gedurende het script gebruikt.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Regio Token Test
## Dit blok controleert of je API-sleutel geldig is.
## Zo niet, dan wordt het script afgebroken.

$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."
    # Script afsluiten
    return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#Eindregio

#Regio Zone ID ophalen
## Haalt de zone-ID van het domein op op basis van de zone-naam. Als de ID niet wordt gevonden, wordt het script afgebroken.
$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."
    # Script afsluiten
    return
}
## Sla de DNS-zone-ID op
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#Eindregio

#Regio DNS-record ophalen
## Haalt de gegevens van het bestaande DNS-record op van Cloudflare.
$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."
    # Script afsluiten
    return
}
## Sla het bestaande IP-adres op in het DNS-record
$old_ip = $DnsRecord.result.content
## Sla de waarde van het DNS-recordtype op
$record_type = $DnsRecord.result.type
## Sla de waarde van het DNS-record-ID op
$record_id = $DnsRecord.result.id
## Sla de waarde van de DNS-record-TTL op
$record_ttl = $DnsRecord.result.ttl
## Sla de waarde van de DNS-record-proxied op
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#Eindregio

#Regio Huidig openbaar IP-adres ophalen
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#Eindregio

#Regio Dynamisch DNS-record bijwerken
## Vergelijk het huidige IP-adres met het DNS-record
## Als het huidige IP-adres niet overeenkomt met het IP-adres in het DNS-record, werk het DNS-record dan bij.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## Werk het DNS-record bij met het nieuwe IP-adres
    $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)"
        ## Script afsluiten
        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."
}
#Eindregio

Het Script Uitvoeren

Nu je het Cloudflare dynamische DNS-update script hebt opgeslagen, wat is de volgende stap? Voordat je het script implementeert, is het essentieel om te testen of de functionaliteit ervan werkt. Het uitvoeren van het script vereist vier details om succesvol te zijn, en dat zijn:

  • E-mail – dit is het e-mailadres voor je Cloudflare-account.
  • Token – de API-token die je eerder hebt aangemaakt vanuit je Cloudflare-account.
  • Domein – de domeinnaam van het DNS dat het DNS-record bevat dat je wilt bijwerken. (bijv. lazyexchangeadmin.cyou).
  • Record – het DNS-record dat je wilt bijwerken. (bijv. demo.lazyexchangeadmin.cyou).

Om het script uit te voeren, volg je deze stappen.

1. Open eerst een PowerShell-sessie. Of als je VSCode gebruikt, gebruik dan in plaats daarvan de PowerShell-terminal van VSCode.

2. Voer vervolgens een DNS-recordopzoeking uit om het huidige IP-adres van het DNS-record te bevestigen. Voer hiervoor het Resolve-DnsName-cmdlet uit, zoals je hieronder kunt zien. Zorg ervoor dat je de volledig gekwalificeerde domeinnaam (FQDN) opgeeft met de -Name-parameter.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

De opdracht zou het DNS-record moeten retourneren dat je hebt opgezocht, inclusief het IP-adres.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Voer nu het script Update-CloudflareDDNS.ps1 uit om het DNS-record in Cloudflare bij te werken door de onderstaande opdracht uit te voeren. Zorg ervoor dat je de Email, Token, Domein en Record aanpast. De onderstaande opdracht gaat ervan uit dat je script zich bevindt in C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

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

Het script voert vervolgens de volgende acties uit, zoals te zien is op de onderstaande screenshot.

  1. Valideert de API-token.
  2. Vindt het domein met het te updaten DNS-record.
  3. Vindt het te updaten DNS-record.
  4. Vergelijkt het IP-adres van het DNS-record met het daadwerkelijke externe of publieke IP-adres.
  5. Werk het IP-adres van het DNS-record bij in Cloudflare.
  6. Toont het resultaat van de dynamische DNS-update.
Running the Cloudflare dynamic DNS update script

4. Ga terug naar je Cloudflare-dashboard en controleer of het DNS-record het nieuwe IP-adres weergeeft. De onderstaande screenshot laat zien dat het IP-adres is gewijzigd naar de waarde van het externe IP-adres na het uitvoeren van het update-script.

Verifying the DNS record in Cloudflare

5. Voer tot slot nog een DNS-recordzoekopdracht uit zoals je deed in stap 2 om te bevestigen of het nieuwe IP-adres al openbaar is verspreid.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

DNS-recordverspreiding kan enkele minuten, uren of zelfs dagen duren. In dit voorbeeld duurde de verspreiding via Cloudflare slechts minder dan een minuut.

Looking up a DNS record after the Cloudflare dynamic DNS update

Planning van de Cloudflare Dynamische DNS Update Taak

Op dit moment heb je een werkend script dat je Cloudflare dynamische DNS-record bijwerkt. Maar het handmatig uitvoeren van het script telkens is niet het doel. Je moet ervoor zorgen dat de dynamische DNS-update automatisch op een schema wordt uitgevoerd, zo vaak als nodig is.

Afhankelijk van welk besturingssysteem je gebruikt, varieert de manier waarop je het script inplant om te worden uitgevoerd, zoals een cron-taak in Linux. Deze tutorial zal een geplande taak voor Windows maken die het Cloudflare dynamische DNS-update script elke vijf minuten uitvoert.

Het definiëren van de Actie voor de Geplande Taak

Je geplande taak moet een actie hebben, die je kunt maken door het New-ScheduledTaskAction cmdlet uit te voeren. In dit voorbeeld is de actie om het Update-CloudflareDDNS.ps1 script uit te voeren met behulp van het PowerShell uitvoerbare bestand pwsh.exe.

Om dit te doen, open je een nieuwe PowerShell-venster als beheerder. Kopieer en voer vervolgens de onderstaande code uit in PowerShell. Zorg ervoor dat je de $scriptPath, $Email, $Token, $Domain en $Record variabelen wijzigt.

# Definieer de eigenschappen van de geplande taakactie
## Voer het pad van het PowerShell-script in
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## E-mailadres van het Cloudflare-account
$Email = '[email protected]'
## Cloudflare API-token
$Token = 'kGW8n........eJl5a'
## DNS-domeinnaam
$Domain = 'lazyexchangeadmin.cyou'
## DNS-record om bij te werken
$Record = 'demo.lazyexchangeadmin.cyou'

# Maak het object voor de geplande taakactie aan
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Het aanmaken van de Geplande Taaktrigger

Nadat je hebt gedefinieerd wat de taak zal doen, moet je vervolgens een trigger of schema voor de taak maken door het New-ScheduledTaskTrigger cmdlet uit te voeren. Kopieer de onderstaande code en voer deze uit in PowerShell om een nieuwe taaktrigger aan te maken die elke vijf minuten binnen een periode van tien jaar wordt uitgevoerd.

# Maak een nieuwe geplande taaktriggerplanning aan
## Trigger = elke 5 minuten gedurende 10 jaar.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Het registreren van de nieuwe geplande taak in het systeem

Eindelijk ben je klaar om de nieuwe geplande taak op de computer te registreren. Hiervoor moet je het Register-ScheduledTask cmdlet uitvoeren, net zoals de onderstaande code. Kopieer de code hieronder en voer deze uit in PowerShell om de geplande taak te registreren.

De resulterende geplande taak wordt uitgevoerd onder het account van lokaal SYSTEM. Voel je vrij om, indien nodig, een ander gebruikersaccount toe te wijzen om de geplande taak uit te voeren.

# Registreer de geplande taak in het systeem.
## Naam van de geplande taak
$TaskName = 'Update Cloudflare Dynamic DNS'
## Beschrijving van de geplande taak
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Maak de geplande taak
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Zoals je hieronder kunt zien, heeft de opdracht de geplande taak aangemaakt, en de status is gereed. Vanaf dit punt zal het script op regelmatige basis, om de vijf minuten, worden uitgevoerd.

Registering the New Scheduled Task

Conclusie

Het up-to-date houden van DNS-records bij veranderingen in dynamische IP-adressen hoeft geen uitdaging te zijn. Je hoeft ook niet te betalen voor een dynamische DNS-service! Door je DNS-zones te beheren in Cloudflare, kun je profiteren van hun API, waardoor je je DNS-records programmatisch kunt bijwerken.

Je hebt in deze tutorial geleerd hoe je een Cloudflare dynamische DNS-record kunt bijwerken met behulp van een combinatie van API-aanroepen, PowerShell 7 en geplande taken. Dit stelt je in staat om je Cloudflare dynamische DNS-update mechanisme eenmaal te configureren en de update automatisch te laten uitvoeren op een interval.

Zou je overwegen om je DNS-zones te beheren met Cloudflare om te profiteren van de voordelen van de API? Of is er een meer handige en toegankelijke manier die je kent?

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