Come configurare Cloudflare Dynamic DNS

Supponiamo che tu abbia pubblicato un sito web dalla tua rete domestica e che tu abbia creato un record DNS che punti all’indirizzo IP pubblico del tuo router. Come fai a mantenere aggiornato il tuo record DNS quando l’indirizzo IP pubblico cambia? Potresti considerare di configurare un DNS dinamico di Cloudflare.

I provider di servizi Internet (ISP) assegnano tipicamente agli abbonati indirizzi IP dinamici, che possono cambiare in qualsiasi momento. Di conseguenza, il tuo record DNS rimane puntato a un indirizzo IP che non ti appartiene più e il tuo sito web diventa non accessibile.

Continua a leggere perché questo tutorial ti aiuterà a mantenere aggiornato il tuo record DNS utilizzando l’API (interfaccia di programmazione delle applicazioni) di Cloudflare e PowerShell. Cominciamo!

Prerequisiti

Se hai intenzione di seguire questo tutorial direttamente, di seguito sono riportati i requisiti necessari.

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

I domini di primo livello gratuiti (TLD), come .ml, .ga, .tk, .cf e .gq, non sono applicabili per l’automazione del DNS dinamico di Cloudflare e non funzioneranno con questo tutorial.

Sample DNS A record in Cloudflare

Cosa è il Cloudflare Dynamic DNS?

I record DNS sono intrinsecamente statici e non funzionano bene con gli indirizzi IP dinamici. Ora, per risolvere questo problema, dovrai configurare un DNS dinamico. Fortunatamente, Cloudflare fornisce un’API che ti permette di gestire i record DNS in modo programmato.

Per configurare un DNS dinamico con Cloudflare, dovrai eseguire un processo su un client all’interno della tua rete che compie due azioni principali: ottenere l’indirizzo IP pubblico attuale della tua rete e aggiornare automaticamente il corrispondente record DNS.

L’immagine sottostante mostra il diagramma di alto livello di come avviene il flusso di aggiornamento del DNS dinamico di Cloudflare.

Cloudflare Dynamic DNS update flow

Sono disponibili molti client DNS dinamici da installare, principalmente per sistemi Linux, come su un server Ubuntu o Raspberry PI. Esistono anche servizi DNS dinamici di terze parti che possono essere a pagamento o gratuiti. Ma in questo tutorial, verrà utilizzato uno script di aggiornamento DNS che viene eseguito su PowerShell 7.1.

Ottenere il token API di Cloudflare

Quando si aggiorna il record DNS dinamico di Cloudflare in modo programmatico, lo script deve autenticarsi presso l’API di Cloudflare. Solo in questo modo Cloudflare ti consentirà di apportare modifiche ai record DNS nel tuo account.

Cloudflare consente di creare token API con le autorizzazioni necessarie per il suo scopo. A sua volta, è possibile utilizzare il nome utente del proprio account Cloudflare e il token API risultante per autenticarsi presso l’API di Cloudflare.

Per creare un token API di Cloudflare, seguire questi passaggi.

1. Aprire il browser, accedere a https://dash.cloudflare.com/login/ e accedere al proprio account Cloudflare.

2. Dopo aver effettuato l’accesso alla dashboard di Cloudflare, fare clic sul pulsante del profilo nell’angolo in alto a destra e fare clic su Il mio profilo.

Opening your Cloudflare profile page

3. Successivamente, fare clic sul collegamento scheda Token API. Nella sezione Token API, fare clic sul pulsante Crea token. L’esempio qui sotto assume che non si sia ancora creato alcun token API.

Clicking Create Token

4. Nella lista dei modelli di token API , fai clic sul modello Edit zone DNS per utilizzarlo. Questo modello ti consente di creare un token API con permessi di modifica per tutte o alcune zone DNS selezionate nel tuo account.

Selecting the Edit zone DNS API token template

5. Nella sezione Risorse della zona sulla pagina Crea Token, fai clic sulla casella a discesa più a destra e seleziona la zona DNS da includere nell’accesso di questo token API. Dopo aver scelto la zona DNS, fai clic su Continua alla riepilogo.

Facoltativamente, per limitare il periodo di validità del token API, compila le sezioni Data di inizio e Data di fine nella sezione TTL. Se lasciato vuoto, il token API non avrà una data di scadenza.

Selecting the DNS Zone

6. Rivedi il riepilogo e assicurati che l’API abbia il permesso DNS:Modifica per la zona DNS precedentemente selezionata. Infine, fai clic su Crea Token per creare il token API.

Reviewing the API token permission

7. Dopo aver creato il token API, copia il valore del token e assicurati di conservarlo in modo sicuro. Tratta il token API come tratteresti una password.

Copying the API Token

8. Torna alla scheda Token API e conferma l’esistenza del token API creato.

Verifying the API Token

Configurazione dello script di aggiornamento dinamico del DNS Cloudflare

Ora hai un account Cloudflare e un token API Cloudflare con i permessi per modificare una zona DNS. Cosa fare dopo? Dovrai mettere il token API in uso e integrarlo con uno script che aggiornerà dinamicamente il record DNS Cloudflare.

Questo tutorial fornisce uno script PowerShell funzionante specificamente per aggiornare un record DNS in Cloudflare.

Salvataggio dello Script

Segui i passaggi seguenti per salvare lo script PowerShell dinamico DNS di Cloudflare sul tuo computer client.

1. Decidi in quale cartella salvare lo script e crea quella cartella se non esiste ancora. In questo esempio, la posizione dello script è in C:\CloudflareDDNS.

2. Apri il tuo editor di codice, come VSCode, e crea un nuovo file script PowerShell chiamato Update-CloudflareDDNS.ps1. Salva lo script all’interno della cartella C:\CloudflareDDNS.

3. Copia lo script qui sotto, incollalo nel tuo editor di codice e salva il file. Fai riferimento ai commenti inline per capire cosa fa lo script.

#richiede -Versione 7.1

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

# Costruisci gli header della richiesta una volta sola. Questi header saranno utilizzati durante l'esecuzione dello script.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Regione Test del token
## Questo blocco verifica che la tua chiave API sia valida.
## Se non lo è, lo script terminerà.

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

#Regione Ottieni ID della zona
## Recupera l'identificatore della zona del dominio in base al nome della zona. Se l'identificatore non viene trovato, lo script terminerà.
$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."
    # Termina lo script
    return
}
## Memorizza l'ID della zona DNS
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#Fine Regione

#Regione Ottieni record DNS
## Recupera i dettagli del record DNS esistente da 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."
    # Termina lo script
    return
}
## Memorizza l'indirizzo IP esistente nel record DNS
$old_ip = $DnsRecord.result.content
## Memorizza il valore del tipo di record DNS
$record_type = $DnsRecord.result.type
## Memorizza il valore dell'ID del record DNS
$record_id = $DnsRecord.result.id
## Memorizza il valore TTL del record DNS
$record_ttl = $DnsRecord.result.ttl
## Memorizza il valore di "proxied" del record DNS
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#FineRegione

#Regione Ottieni l'attuale indirizzo IP pubblico
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#FineRegione

#Regione Aggiorna il record Dynamic DNS
## Confronta l'indirizzo IP attuale con il record DNS
## Se l'indirizzo IP attuale non corrisponde all'indirizzo IP del record DNS, aggiorna il record DNS.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## Aggiorna il record DNS con il nuovo indirizzo 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)"
        ## Termina lo 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."
}
#FineRegione

Eseguire lo script

Ora che hai salvato lo script di aggiornamento del DNS dinamico di Cloudflare, cosa succede dopo? Prima di distribuire lo script, è essenziale testarne la funzionalità. Per eseguire lo script sono necessari quattro dettagli per avere successo, e sono i seguenti:

  • Email – che è l’indirizzo email del tuo account Cloudflare.
  • Token – il token API che hai creato in precedenza dal tuo account Cloudflare.
  • Dominio – il nome di dominio DNS che contiene il record DNS che desideri aggiornare. (ad esempio, lazyexchangeadmin.cyou).
  • Record – il record DNS che desideri aggiornare. (ad esempio, demo.lazyexchangeadmin.cyou).

Per eseguire lo script, procedi nel seguente modo.

1. In primo luogo, apri una sessione di PowerShell. Oppure, se stai usando VSCode, utilizza invece il terminale PowerShell di VSCode.

2. Successivamente, esegui una ricerca del record DNS per confermare l’indirizzo IP corrente del record DNS. Per farlo, esegui il cmdlet Resolve-DnsName, come puoi vedere di seguito. Assicurati di fornire il nome di dominio completamente qualificato (FQDN) con il parametro -Name.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

Il comando dovrebbe restituire il record DNS cercato, incluso il suo indirizzo IP.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Ora, invoca lo script Update-CloudflareDDNS.ps1 per aggiornare il record DNS in Cloudflare eseguendo il comando qui sotto. Assicurati di cambiare l’Email, il Token, il Domain, e il Record. Il comando qui sotto assume che il tuo script sia in C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

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

Lo script quindi esegue le seguenti azioni, come puoi vedere nella schermata sottostante.

  1. Convalida il token API.
  2. Trova il dominio che contiene il record DNS da aggiornare.
  3. Trova il record DNS da aggiornare.
  4. Confronta l’indirizzo IP del record DNS con l’indirizzo IP esterno o pubblico effettivo.
  5. Aggiorna l’indirizzo IP del record DNS in Cloudflare.
  6. Visualizza il risultato dell’aggiornamento del DNS dinamico.
Running the Cloudflare dynamic DNS update script

4. Torna al tuo cruscotto Cloudflare e verifica che il record DNS rifletta il nuovo indirizzo IP. La schermata sottostante mostra che l’indirizzo IP è cambiato al valore dell’indirizzo IP esterno dopo l’esecuzione dello script di aggiornamento.

Verifying the DNS record in Cloudflare

5. Infine, esegui un’altra ricerca del record DNS come hai fatto al passo 2 per confermare se il nuovo indirizzo IP è già stato propagato pubblicamente.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

La propagazione del record DNS può richiedere alcuni minuti, ore o addirittura giorni. In questo esempio, la propagazione di Cloudflare ha richiesto meno di un minuto.

Looking up a DNS record after the Cloudflare dynamic DNS update

Pianificazione del Compito di Aggiornamento DNS Dinamico di Cloudflare

A questo punto, hai uno script funzionante che aggiorna il record DNS dinamico di Cloudflare. Ma eseguire lo script manualmente ogni volta non è l’obiettivo. Devi assicurarti che l’aggiornamento del DNS dinamico venga eseguito automaticamente secondo un programma, ogni volta che necessario.

A seconda del sistema operativo che stai utilizzando, il metodo per pianificare l’esecuzione dello script varia, come un lavoro cron in Linux. Questo tutorial creerà un’attività pianificata di Windows che esegue lo script di aggiornamento del DNS dinamico di Cloudflare ogni cinque minuti.

Definizione dell’azione dell’attività pianificata

La tua attività pianificata deve avere un’azione, che puoi creare eseguendo il cmdlet New-ScheduledTaskAction . In questo esempio, l’azione è quella di eseguire lo script Update-CloudflareDDNS.ps1 utilizzando il file eseguibile di PowerShell pwsh.exe.

Per farlo, apri una nuova finestra di PowerShell come amministratore. Successivamente, copia ed esegui il codice qui sotto in PowerShell. Assicurati di modificare le variabili $scriptPath, $Email, $Token, $Domain, e $Record.

# Definire le proprietà dell'azione del compito pianificato
## Inserire il percorso dello script PowerShell
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## Indirizzo email dell'account Cloudflare
$Email = '[email protected]'
## Token API di Cloudflare
$Token = 'kGW8n........eJl5a'
## Nome di dominio DNS
$Domain = 'lazyexchangeadmin.cyou'
## Record DNS da aggiornare
$Record = 'demo.lazyexchangeadmin.cyou'

# Creare l'oggetto azione del compito pianificato
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Creazione dell’Attivazione del Compito Pianificato

Dopo aver definito cosa farà il compito, è necessario creare un trigger o un programma per il compito eseguendo il cmdlet New-ScheduledTaskTrigger. Copia il codice seguente ed eseguilo in PowerShell per creare un nuovo trigger di attivazione del compito che si esegue ogni cinque minuti per una durata di dieci anni.

# Creare un nuovo programma per il trigger del compito pianificato
## Trigger = ogni 5 minuti per 10 anni.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Registrazione del Nuovo Compito Pianificato nel Sistema

Infine, sei pronto per registrare il nuovo compito pianificato sul computer. Per farlo, dovrai eseguire il cmdlet Register-ScheduledTask, come il codice qui sotto. Copia il codice qui sotto ed eseguilo in PowerShell per registrare il compito pianificato.

Il compito pianificato risultante verrà eseguito con l’account locale SYSTEM. Sentiti libero di assegnare un account utente diverso per eseguire il compito pianificato secondo necessità.

# Registra il compito pianificato nel sistema.
## Nome del compito pianificato
$TaskName = 'Update Cloudflare Dynamic DNS'
## Descrizione del compito pianificato
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Crea il compito pianificato
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Come puoi vedere qui sotto, il comando ha creato il compito pianificato e lo stato è pronto. Da questo momento in avanti, lo script verrà eseguito ad intervalli di cinque minuti.

Registering the New Scheduled Task

Conclusione

Mantenere aggiornati i record DNS con le modifiche degli indirizzi IP dinamici non deve essere un problema. Non è nemmeno necessario pagare per un servizio DNS dinamico! Gestendo le tue zone DNS in Cloudflare, puoi sfruttare la loro API, che ti consente di aggiornare i tuoi record DNS in modo programmato.

Hai imparato in questo tutorial come aggiornare un record DNS dinamico di Cloudflare utilizzando una combinazione di chiamate API, PowerShell 7 e attività pianificate. Tutto ciò ti permette di configurare il meccanismo di aggiornamento DNS dinamico di Cloudflare una volta e mantenerlo in esecuzione a intervalli non assistiti.

Considereresti la gestione delle tue zone DNS con Cloudflare per cogliere i vantaggi della sua API? Oppure conosci un modo più conveniente e accessibile?

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