Comment configurer Cloudflare Dynamic DNS

Supposons que vous ayez publié un site web depuis votre réseau domestique et que vous ayez créé un enregistrement DNS pointant vers l’adresse IP publique de votre routeur. Comment maintenir à jour votre enregistrement DNS lorsque votre adresse IP publique change ? Il serait peut-être judicieux de mettre en place un service DNS dynamique Cloudflare.

Les fournisseurs de services Internet (FSI) attribuent généralement des adresses IP dynamiques à leurs abonnés, pouvant changer à tout moment. En conséquence, votre enregistrement DNS continue de pointer vers une adresse IP qui n’est plus la vôtre, rendant votre site web inaccessible.

Continuez à lire, car ce tutoriel vous aidera à maintenir à jour votre enregistrement DNS en utilisant l’interface de programmation d’application (API) de Cloudflare et PowerShell. Mettons-nous en marche !

Prérequis

Si vous envisagez de suivre ce tutoriel de manière pratique, voici les exigences dont vous avez besoin.

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

Les domaines de premier niveau (TLD) gratuits tels que .ml, .ga, .tk, .cf et .gq ne sont pas applicables pour l’automatisation du DNS dynamique Cloudflare et ne fonctionneront pas avec ce tutoriel.

Sample DNS A record in Cloudflare

Qu’est-ce que Cloudflare Dynamic DNS?

Les enregistrements DNS sont intrinsèquement statiques et ne fonctionnent pas bien avec les adresses IP dynamiques. Maintenant, pour résoudre ce problème, vous devrez configurer un DNS dynamique. Heureusement, Cloudflare fournit une API qui vous permet de gérer les enregistrements DNS de manière programmatique.

Pour configurer un DNS dynamique Cloudflare, vous devrez exécuter un processus sur un client à l’intérieur de votre réseau qui effectue deux actions principales : obtenir l’adresse IP publique actuelle de votre réseau et mettre à jour automatiquement l’enregistrement DNS correspondant.

L’image ci-dessous montre le diagramme de haut niveau de la façon dont le flux de mise à jour DNS dynamique de Cloudflare se produit.

Cloudflare Dynamic DNS update flow

De nombreux clients de DNS dynamique sont disponibles à installer, principalement pour les systèmes Linux, comme sur un serveur Ubuntu ou un Raspberry PI. Des services de DNS dynamique tiers existent également, pouvant être payants ou gratuits. Mais dans ce tutoriel, vous déploierez un script de mise à jour DNS qui s’exécute sur PowerShell 7.1.

Obtention d’un jeton d’API Cloudflare

Lors de la mise à jour du DNS dynamique de Cloudflare de manière programmatique, votre script doit s’authentifier auprès de l’API Cloudflare. Ce n’est qu’alors que Cloudflare vous permettra d’apporter des modifications aux enregistrements DNS de votre compte.

Cloudflare vous permet de créer des jetons d’API avec les autorisations nécessaires à leur utilisation. Ensuite, vous pouvez utiliser le nom d’utilisateur de votre compte Cloudflare et le jeton d’API résultant pour vous authentifier auprès de l’API Cloudflare.

Pour créer un jeton d’API Cloudflare, suivez ces étapes.

1. Ouvrez votre navigateur, accédez à https://dash.cloudflare.com/login/ et connectez-vous à votre compte Cloudflare.

2. Après vous être connecté au tableau de bord Cloudflare, cliquez sur le bouton de profil en haut à droite et cliquez sur Mon Profil.

Opening your Cloudflare profile page

3. Ensuite, cliquez sur le lien de l’onglet Jetons d’API. Sous la section Jetons d’API, cliquez sur le bouton Créer un jeton. L’exemple ci-dessous suppose que vous n’avez pas encore créé de jetons d’API.

Clicking Create Token

4. Sur la liste des modèles de jetons API, cliquez sur le modèle Modifier la zone DNS pour l’utiliser. Ce modèle vous permet de créer un jeton API avec des autorisations de modification pour toutes les zones DNS ou sélectionnées de votre compte.

Selecting the Edit zone DNS API token template

5. Sous la section Ressources de zone sur la page Créer un jeton, cliquez sur la boîte déroulante la plus à droite et sélectionnez la zone DNS à inclure dans l’accès de ce jeton API. Après avoir choisi la zone DNS, cliquez sur Continuer vers le résumé.

Facultativement, pour limiter la période de validité du jeton API, remplissez les champs Date de début et Date de fin sous la section TTL. S’ils sont laissés vides, le jeton API n’aura pas de date d’expiration.

Selecting the DNS Zone

6. Passez en revue le résumé et assurez-vous que l’API a l’autorisation DNS:Modifier pour la zone DNS précédemment sélectionnée. Enfin, cliquez sur Créer le jeton pour créer le jeton API.

Reviewing the API token permission

7. Après avoir créé le jeton API, copiez la valeur du jeton et assurez-vous de la stocker en toute sécurité. Traitez le jeton API comme vous traiteriez un mot de passe.

Copying the API Token

8. Retournez à l’onglet Jetons API et confirmez l’existence du jeton API que vous avez créé.

Verifying the API Token

Configuration du script de mise à jour DNS dynamique Cloudflare

Vous avez maintenant le compte Cloudflare et le jeton API Cloudflare avec l’autorisation de modifier une zone DNS. Et ensuite ? Vous devrez mettre le jeton API à profit et l’intégrer à un script qui mettrait à jour automatiquement l’enregistrement DNS dynamique Cloudflare.

Ce tutoriel vous fournit un script PowerShell fonctionnel spécifiquement pour mettre à jour un enregistrement DNS dans Cloudflare.

Enregistrement du script

Suivez les étapes ci-dessous pour enregistrer le script PowerShell de DNS dynamique Cloudflare sur votre ordinateur client.

1. Décidez dans quel dossier enregistrer le script et créez ce dossier s’il n’existe pas encore. Dans cet exemple, l’emplacement du script est dans C:\CloudflareDDNS.

2. Ouvrez votre éditeur de code, tel que VSCode, et créez un nouveau fichier de script PowerShell appelé Update-CloudflareDDNS.ps1. Enregistrez le script à l’intérieur du dossier C:\CloudflareDDNS.

3. Copiez le script ci-dessous, collez-le dans votre éditeur de code et enregistrez le fichier. Référez-vous aux commentaires en ligne pour comprendre ce que fait le script.

#requires -Version 7.1

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

# Construisez les en-têtes de requête une fois. Ces en-têtes seront utilisés tout au long du script.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Région Test du jeton
## Ce bloc vérifie que votre clé API est valide.
## Sinon, le script se terminera.

$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."
    # Sortie du script
    return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#FinRégion

#Région Obtenir l'ID de zone
## Récupère l'identifiant de zone du domaine en fonction du nom de la zone. Si l'identifiant n'est pas trouvé, le script se terminera.
$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."
    # Sortie du script
    return
}
## Stockez l'ID de zone DNS
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#FinRégion

#Région Obtenir l'enregistrement DNS
## Récupérer les détails de l'enregistrement DNS existant depuis 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."
    # Sortie du script
    return
}
## Stockez l'adresse IP existante dans l'enregistrement DNS
$old_ip = $DnsRecord.result.content
## Stockez la valeur du type d'enregistrement DNS
$record_type = $DnsRecord.result.type
## Stockez la valeur de l'ID de l'enregistrement DNS
$record_id = $DnsRecord.result.id
## Stockez la valeur TTL de l'enregistrement DNS
$record_ttl = $DnsRecord.result.ttl
## Stockez la valeur du proxy de l'enregistrement DNS
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#FinRégion

#Région Obtenir l'adresse IP publique actuelle
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#FinRégion

#Région Mettre à jour l'enregistrement DNS dynamique
## Comparez l'adresse IP actuelle avec l'enregistrement DNS
## Si l'adresse IP actuelle ne correspond pas à l'adresse IP de l'enregistrement DNS, mettez à jour l'enregistrement DNS.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## Mettez à jour l'enregistrement DNS avec la nouvelle adresse IP
    $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)"
        ## Sortie du script
        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."
}
#FinRégion

Exécution du script

Maintenant que vous avez enregistré le script de mise à jour dynamique de DNS Cloudflare, que faire ensuite ? Avant de déployer le script, il est essentiel de tester si sa fonctionnalité fonctionne. L’exécution du script nécessite quatre détails pour réussir, et ce sont les suivants :

  • Email – qui est l’adresse e-mail de votre compte Cloudflare.
  • Token – le jeton API que vous avez précédemment créé à partir de votre compte Cloudflare.
  • Domaine – le nom de domaine DNS qui contient l’enregistrement DNS que vous souhaitez mettre à jour. (par exemple, lazyexchangeadmin.cyou).
  • Enregistrement – l’enregistrement DNS que vous souhaitez mettre à jour. (par exemple, demo.lazyexchangeadmin.cyou).

Pour exécuter le script, procédez comme suit.

1. Tout d’abord, ouvrez une session PowerShell. Ou, si vous utilisez VSCode, utilisez plutôt le terminal PowerShell de VSCode.

2. Ensuite, effectuez une recherche d’enregistrement DNS pour confirmer l’adresse IP actuelle de l’enregistrement DNS. Pour ce faire, exécutez la cmdlet Resolve-DnsName, comme vous pouvez le voir ci-dessous. Assurez-vous de fournir le nom de domaine pleinement qualifié (FQDN) avec le paramètre -Name.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

La commande devrait renvoyer l’enregistrement DNS que vous avez recherché, y compris son adresse IP.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Maintenant, invoquez le script Update-CloudflareDDNS.ps1 pour mettre à jour l’enregistrement DNS dans Cloudflare en exécutant la commande ci-dessous. Assurez-vous de modifier les champs Email, Token, Domain et Record. La commande ci-dessous suppose que votre script se trouve dans C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

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

Le script effectue ensuite les actions suivantes, comme vous pouvez le voir sur la capture d’écran ci-dessous.

  1. Valide le jeton d’API.
  2. Trouve le domaine contenant l’enregistrement DNS à mettre à jour.
  3. Trouve l’enregistrement DNS à mettre à jour.
  4. Compare l’adresse IP de l’enregistrement DNS avec l’adresse IP externe ou publique réelle.
  5. Met à jour l’adresse IP de l’enregistrement DNS dans Cloudflare.
  6. Affiche le résultat de la mise à jour du DNS dynamique.
Running the Cloudflare dynamic DNS update script

4. Retournez ensuite sur votre tableau de bord Cloudflare et vérifiez si l’enregistrement DNS reflète la nouvelle adresse IP. La capture d’écran ci-dessous montre que l’adresse IP a changé pour la valeur de l’adresse IP externe après l’exécution du script de mise à jour.

Verifying the DNS record in Cloudflare

5. Enfin, effectuez une autre recherche d’enregistrement DNS comme vous l’avez fait à l’étape 2 pour confirmer si la nouvelle adresse IP est déjà propagée publiquement.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

La propagation de l’enregistrement DNS peut prendre plusieurs minutes, heures, voire jours. Dans cet exemple, la propagation de Cloudflare n’a pris que moins d’une minute.

Looking up a DNS record after the Cloudflare dynamic DNS update

Planification de la tâche de mise à jour dynamique DNS Cloudflare

À ce stade, vous disposez désormais d’un script fonctionnel qui met à jour votre enregistrement DNS dynamique Cloudflare. Mais exécuter le script manuellement à chaque fois n’est pas le but. Vous devez vous assurer que la mise à jour du DNS dynamique s’exécute automatiquement selon un horaire aussi souvent que nécessaire.

En fonction du système d’exploitation que vous utilisez, la façon dont vous planifiez l’exécution du script varie, comme une tâche cron sous Linux. Ce tutoriel créera une tâche planifiée Windows qui exécute le script de mise à jour du DNS dynamique Cloudflare toutes les cinq minutes.

Définition de l’action de la tâche planifiée

Votre tâche planifiée doit avoir une action, que vous pouvez créer en exécutant la cmdlet New-ScheduledTaskAction. Dans cet exemple, l’action consiste à exécuter le script Update-CloudflareDDNS.ps1 en utilisant le fichier exécutable PowerShell pwsh.exe.

Pour ce faire, ouvrez une nouvelle fenêtre PowerShell en tant qu’administrateur. Ensuite, copiez et exécutez le code ci-dessous dans PowerShell. Assurez-vous de modifier les variables $scriptPath, $Email, $Token, $Domain, et $Record.

# Définir les propriétés de l'action de la tâche planifiée
## Entrez le chemin du script PowerShell
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## Adresse e-mail du compte Cloudflare
$Email = '[email protected]'
## Jeton d'API Cloudflare
$Token = 'kGW8n........eJl5a'
## Nom de domaine DNS
$Domain = 'lazyexchangeadmin.cyou'
## Enregistrement DNS à mettre à jour
$Record = 'demo.lazyexchangeadmin.cyou'

# Créer l'objet d'action de la tâche planifiée
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Création du déclencheur de la tâche planifiée

Après avoir défini ce que la tâche fera, vous devez ensuite créer un déclencheur ou un calendrier pour la tâche en exécutant la cmdlet New-ScheduledTaskTrigger. Copiez le code ci-dessous et exécutez-le dans PowerShell pour créer un nouveau déclencheur de tâche qui s’exécute toutes les cinq minutes pendant une durée de dix ans.

# Créer un nouveau planificateur de tâches planifiées
## Déclencheur = toutes les 5 minutes pendant 10 ans.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Enregistrement de la nouvelle tâche planifiée dans le système

Enfin, vous êtes prêt à enregistrer la nouvelle tâche planifiée sur l’ordinateur. Pour ce faire, vous devrez exécuter la cmdlet Register-ScheduledTask, de la même manière que le code ci-dessous. Copiez le code ci-dessous et exécutez-le dans PowerShell pour enregistrer la tâche planifiée.

La tâche planifiée résultante s’exécutera sous le compte local SYSTEM. N’hésitez pas à attribuer un compte utilisateur différent pour exécuter la tâche planifiée si nécessaire.

# Enregistrez la tâche planifiée dans le système.
## Nom de la tâche planifiée
$TaskName = 'Update Cloudflare Dynamic DNS'
## Description de la tâche planifiée
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Créez la tâche planifiée
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Comme vous pouvez le voir ci-dessous, la commande a créé la tâche planifiée, et le statut est prêt. À partir de ce point, le script s’exécutera à intervalles de cinq minutes.

Registering the New Scheduled Task

Conclusion

Bien sûr! Voici la traduction en français de votre texte:

Garder les enregistrements DNS à jour avec les changements d’adresses IP dynamiques ne doit pas être un défi. Vous n’avez pas non plus besoin de payer pour un service DNS dynamique ! En gérant vos zones DNS dans Cloudflare, vous pouvez tirer parti de leur API, ce qui vous permet de mettre à jour vos enregistrements DNS de manière programmatique.

Vous avez appris dans ce tutoriel comment mettre à jour un enregistrement DNS dynamique Cloudflare en utilisant une combinaison d’appels API, de PowerShell 7 et de tâches planifiées. Tout cela vous permet de configurer votre mécanisme de mise à jour DNS dynamique Cloudflare une fois et de le laisser s’exécuter à intervalles réguliers sans surveillance.

Envisageriez-vous de gérer vos zones DNS avec Cloudflare pour profiter des avantages de son API ? Ou connaissez-vous une méthode plus pratique et accessible ?

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