Como Configurar o Cloudflare Dynamic DNS

Suponha que você tenha publicado um site a partir da sua rede doméstica e criado um registro DNS que aponta para o endereço IP público do seu roteador. Como manter seu registro DNS atualizado quando o endereço IP público muda? Talvez você deva considerar configurar um DNS dinâmico do Cloudflare.

Os provedores de serviços de internet (ISPs) geralmente atribuem endereços IP dinâmicos aos seus assinantes, que podem mudar a qualquer momento. Como resultado, seu registro DNS continua apontando para um endereço IP que já não é seu, e seu site se torna inacessível.

Continue lendo, pois este tutorial o ajudará a manter seu registro DNS atualizado usando a interface de programação de aplicativos (API) do Cloudflare e o PowerShell. Vamos começar!

Pré-requisitos

Se você pretende seguir este tutorial, abaixo estão os requisitos necessários.

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

Domínios de nível superior (TLD) gratuitos, como .ml, .ga, .tk, .cf e .gq, não são aplicáveis para automação de DNS dinâmico do Cloudflare e não funcionarão com este tutorial.

Sample DNS A record in Cloudflare

O que é DNS Dinâmico do Cloudflare?

Os registros DNS são inherentemente estáticos e não se comportam bem com endereços IP dinâmicos. Agora, para resolver esse problema, você precisará configurar um DNS dinâmico. Felizmente, o Cloudflare fornece uma API que permite que você gerencie registros DNS de forma programática.

Para configurar um DNS dinâmico do Cloudflare, você precisará executar um processo em um cliente dentro de sua rede que faça duas ações principais: obter o endereço IP público atual de sua rede e atualizar automaticamente o registro DNS correspondente.

A imagem abaixo mostra o diagrama de alto nível de como ocorre o fluxo de atualização dinâmica do DNS do Cloudflare.

Cloudflare Dynamic DNS update flow

Existem muitos clientes de DNS dinâmico disponíveis para instalação, principalmente para sistemas Linux, como em um servidor Ubuntu ou Raspberry PI. Também existem serviços de DNS dinâmico de terceiros que podem ser pagos ou gratuitos. Mas neste tutorial, você estará implantando um script de atualização de DNS que é executado no PowerShell 7.1.

Obtendo o Token da API do Cloudflare

Ao atualizar o registro de DNS dinâmico do Cloudflare programaticamente, seu script deve se autenticar na API do Cloudflare. Somente então o Cloudflare permitirá que você faça alterações nos registros de DNS em sua conta.

O Cloudflare permite criar tokens de API com permissões suficientes para seu propósito. Por sua vez, você pode usar o nome de usuário da sua conta do Cloudflare e o token de API resultante para autenticar na API do Cloudflare.

Para criar um Token da API do Cloudflare, siga estas etapas.

1. Abra seu navegador, acesse https://dash.cloudflare.com/login/ e faça login em sua conta do Cloudflare.

2. Após fazer login no painel do Cloudflare, clique no botão de perfil no canto superior direito e clique em Meu Perfil.

Opening your Cloudflare profile page

3. Em seguida, clique na guia API Tokens. Na seção API Tokens, clique no botão Criar Token. O exemplo abaixo pressupõe que você ainda não criou nenhum token de API.

Clicking Create Token

4. Na lista de modelos de token de API, clique no modelo de Edit zone DNS para utilizá-lo. Esse modelo permite que você crie um token de API com permissão de edição para todas ou selecionadas zonas DNS em sua conta.

Selecting the Edit zone DNS API token template

5. Na seção Recursos da Zona na página de Criar Token, clique na caixa de seleção mais à direita e selecione a zona DNS para incluir no acesso deste token de API. Após escolher a zona DNS, clique em Continuar para o resumo.

Opcionalmente, para limitar o período de validade do token de API, preencha a Data de Início e a Data de Término> na seção TTL. Se deixado em branco, o token de API não terá data de expiração.

Selecting the DNS Zone

6. Revise o resumo e certifique-se de que a API tenha permissão de Edit:DNS para a zona DNS previamente selecionada. Por fim, clique em Criar Token para criar o token de API.

Reviewing the API token permission

7. Após criar o token de API, copie o valor do token e certifique-se de armazená-lo com segurança. Trate o token de API como você trataria uma senha.

Copying the API Token

8. Volte para a guia de Token de API e confirme a existência do token de API que você criou.

Verifying the API Token

Configurando o Script de Atualização de DNS Dinâmico do Cloudflare

Agora você possui a conta do Cloudflare e o Token de API do Cloudflare com permissão para editar uma zona DNS. E agora? Você precisará utilizar o token de API e integrá-lo a um script que atualizaria programaticamente o registro de DNS dinâmico do Cloudflare.

Este tutorial fornece a você um script PowerShell funcional especificamente para atualizar um registro DNS no Cloudflare.

Salvando o Script

Siga as etapas abaixo para salvar o script PowerShell dinâmico do Cloudflare no seu computador cliente.

1. Decida em qual pasta salvar o script e crie essa pasta se ela ainda não existir. Neste exemplo, a localização do script é em C:\CloudflareDDNS.

2. Abra seu editor de código, como o VSCode, e crie um novo arquivo de script PowerShell chamado Update-CloudflareDDNS.ps1. Salve o script dentro da pasta C:\CloudflareDDNS.

3. Copie o script abaixo, cole-o no seu editor de código e salve o arquivo. Consulte os comentários inline para entender o que o script faz.

#requires -Version 7.1

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

# Construa os cabeçalhos da solicitação uma vez. Esses cabeçalhos serão usados ao longo do script.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Região Teste de Token
## Este bloco verifica se sua chave de API é válida.
## Caso contrário, o script será encerrado.

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

#Região Obter ID da Zona
## Recupera o identificador da zona do domínio com base no nome da zona. Se o identificador não for encontrado, o script será encerrado.
$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."
    # Encerrar script
    return
}
## Armazenar o ID da zona DNS
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#FimRegião

#Região Obter Registro DNS
## Recupera os detalhes do registro DNS existente do 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."
    # Encerrar script
    return
}
## Armazenar o endereço IP existente no registro DNS
$old_ip = $DnsRecord.result.content
## Armazenar o valor do tipo de registro DNS
$record_type = $DnsRecord.result.type
## Armazenar o valor do ID do registro DNS
$record_id = $DnsRecord.result.id
## Armazenar o valor TTL do registro DNS
$record_ttl = $DnsRecord.result.ttl
## Armazenar o valor proxy do registro DNS
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#FimRegião

#Região Obter Endereço IP Público Atual
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#FimRegião

#Região Atualizar Registro DNS Dinâmico
## Comparar o endereço IP atual com o registro DNS
## Se o endereço IP atual não corresponder ao endereço IP do registro DNS, atualize o registro DNS.
if ($new_ip -ne $old_ip) {
    Write-Output "The current IP address does not match the DNS record IP address. Attempt to update."
    ## Atualize o registro DNS com o novo endereço 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)"
        ## Encerrar 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."
}
#FimRegião

Executando o Script

Agora que você salvou o script de atualização dinâmica do DNS do Cloudflare, o que vem depois? Antes de implantar o script, testar se sua funcionalidade funciona é essencial. Executar o script requer quatro detalhes para ser bem-sucedido, e esses são:

  • Email – que é o endereço de e-mail para sua conta do Cloudflare.
  • Token – o token da API que você criou anteriormente em sua conta do Cloudflare.
  • Domínio – o nome do domínio DNS que contém o registro DNS que você deseja atualizar. (por exemplo, lazyexchangeadmin.cyou).
  • Registro – o registro DNS que você deseja atualizar. (por exemplo, demo.lazyexchangeadmin.cyou).

Para executar o script, siga estas etapas.

1. Primeiro, abra uma sessão do PowerShell. Ou, se estiver usando o VSCode, use o terminal do PowerShell do VSCode.

2. Em seguida, execute uma pesquisa de registro DNS para confirmar o endereço IP atual do registro DNS. Para fazer isso, execute o cmdlet Resolve-DnsName, conforme você pode ver abaixo. Certifique-se de fornecer o nome de domínio totalmente qualificado (FQDN) com o parâmetro -Name.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

O comando deve retornar o registro DNS que você pesquisou, incluindo seu endereço IP.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Agora, invoque o script Update-CloudflareDDNS.ps1 para atualizar o registro DNS no Cloudflare executando o comando abaixo. Certifique-se de alterar o Email, Token, Domínio e Registro. O comando abaixo assume que seu script está em C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

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

O script então realiza as seguintes ações, como você pode ver na captura de tela abaixo.

  1. Valida o token da API.
  2. Encontra o domínio que contém o registro DNS a ser atualizado.
  3. Encontra o registro DNS a ser atualizado.
  4. Compara o endereço IP do registro DNS com o endereço IP externo ou público atual.
  5. Atualiza o endereço IP do registro DNS no Cloudflare.
  6. Exibe o resultado da atualização do DNS dinâmico.
Running the Cloudflare dynamic DNS update script

4. Volte para o painel do Cloudflare e verifique se o registro DNS reflete o novo endereço IP. A captura de tela abaixo mostra que o endereço IP mudou para o valor do endereço IP externo após a execução do script de atualização.

Verifying the DNS record in Cloudflare

5. Por fim, execute outra consulta de registro DNS como fez no passo 2 para confirmar se o novo endereço IP já foi propagado publicamente.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

A propagação do registro DNS pode levar vários minutos, horas ou até dias. Neste exemplo, a propagação do Cloudflare levou menos de um minuto.

Looking up a DNS record after the Cloudflare dynamic DNS update

Agendando a Tarefa de Atualização Dinâmica do DNS do Cloudflare

Neste ponto, você agora tem um script funcional que atualiza o registro dinâmico do seu DNS no Cloudflare. No entanto, executar o script manualmente cada vez não é o objetivo. Você deve garantir que a atualização dinâmica do DNS seja executada automaticamente em um cronograma, tão frequentemente quanto necessário.

Dependendo do sistema operacional que você está usando, a forma de agendar a execução do script varia, como um trabalho cron no Linux. Este tutorial criará uma tarefa agendada no Windows que executa o script de atualização dinâmica do DNS do Cloudflare a cada cinco minutos.

Definindo a Ação da Tarefa Agendada

Sua tarefa agendada precisa ter uma ação, que você pode criar executando o cmdlet New-ScheduledTaskAction. Neste exemplo, a ação é executar o script Update-CloudflareDDNS.ps1 usando o arquivo executável do PowerShell pwsh.exe.

Para fazer isso, abra uma nova janela do PowerShell como administrador. Em seguida, copie e execute o código abaixo no PowerShell. Certifique-se de alterar as variáveis $scriptPath, $Email, $Token, $Domain, e $Record.

# Definir as propriedades da ação da tarefa agendada
## Insira o caminho do script do PowerShell
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## Endereço de e-mail da conta Cloudflare
$Email = '[email protected]'
## Token da API Cloudflare
$Token = 'kGW8n........eJl5a'
## Nome de domínio DNS
$Domain = 'lazyexchangeadmin.cyou'
## Registro DNS a ser atualizado
$Record = 'demo.lazyexchangeadmin.cyou'

# Criar o objeto de ação da tarefa agendada
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Criando o Desencadeador da Tarefa Agendada

Depois de definir o que a tarefa fará, você deve criar um desencadeador ou agenda para a tarefa executando o cmdlet New-ScheduledTaskTrigger. Copie o código abaixo e execute-o no PowerShell para criar um novo desencadeador de tarefa que é executado a cada cinco minutos dentro de uma duração de dez anos.

# Criar um novo cronograma de gatilho de tarefa agendada
## Gatilho = a cada 5 minutos por 10 anos.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Registrando a Nova Tarefa Agendada no Sistema

Finalmente, você está pronto para registrar a nova tarefa agendada no computador. Para fazer isso, você precisará executar o cmdlet Register-ScheduledTask, igual ao código abaixo. Copie o código abaixo e execute-o no PowerShell para registrar a tarefa agendada.

A tarefa agendada resultante será executada sob a conta do sistema local. Sinta-se à vontade para atribuir uma conta de usuário diferente para executar a tarefa agendada conforme necessário.

# Registrar a tarefa agendada no sistema.
## Nome da Tarefa Agendada
$TaskName = 'Update Cloudflare Dynamic DNS'
## Descrição da Tarefa Agendada
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Criar a tarefa agendada
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Como você pode ver abaixo, o comando criou a tarefa agendada e o status está pronto. A partir deste ponto, o script será executado a cada intervalo de cinco minutos.

Registering the New Scheduled Task

Conclusão

Manter os registros DNS atualizados com as mudanças de endereço IP dinâmico não precisa ser um desafio. Você também não precisa pagar por um serviço de DNS dinâmico! Ao gerenciar suas zonas DNS no Cloudflare, você pode aproveitar sua API, permitindo que você atualize seus registros DNS de forma programática.

Neste tutorial, você aprendeu como atualizar um registro DNS dinâmico do Cloudflare usando uma combinação de chamadas de API, PowerShell 7 e tarefas agendadas. Tudo isso permite que você configure seu mecanismo de atualização de DNS dinâmico do Cloudflare uma vez e mantenha a atualização em execução em intervalos sem supervisão.

Você consideraria gerenciar suas zonas DNS com o Cloudflare para aproveitar os benefícios de sua API? Ou existe uma maneira mais conveniente e acessível que você conhece?

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