Como Configurar o DNS Dinâmico do Cloudflare

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

Os provedores de serviços de Internet (ISP) geralmente atribuem endereços IP dinâmicos aos seus assinantes, que podem mudar a qualquer momento. Como resultado, o 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 ajudará a manter o 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ê planeja seguir este tutorial prático, 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 inerentemente estáticos e não funcionam 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 gerenciar 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 da Cloudflare.

Cloudflare Dynamic DNS update flow

Muitos clientes de DNS dinâmico estão 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. No entanto, neste tutorial, você estará implantando um script atualizador de DNS que é executado no PowerShell 7.1.

Obtendo um Token da API da Cloudflare

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

A Cloudflare permite que você crie tokens da API com permissões suficientes para o seu propósito. Em seguida, você pode usar o nome de usuário de sua conta Cloudflare e o token de API resultante para se autenticar na API da Cloudflare.

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

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

2. Após fazer login no painel da 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 Token da API. Na seção Token da API, clique no botão Criar Token. O exemplo abaixo assume que você ainda não criou nenhum token da API.

Clicking Create Token

4. Na lista de modelos de token de API, clique no modelo Editar zona DNS para usá-lo. Este 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 Criar Token, clique na caixa de seleção mais à direita e selecione a zona DNS a ser incluída 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> sob a seção TTL. Se deixado em branco, o token de API não terá data de validade.

Selecting the DNS Zone

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

Reviewing the API token permission

7. Depois de 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 aba 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 Dinâmica de DNS 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á colocar o token de API em uso e integrá-lo com um script que atualize programaticamente o registro DNS dinâmico do Cloudflare.

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

Salvando o Script

Siga os passos abaixo para salvar o script PowerShell dinâmico do Cloudflare em seu computador cliente.

1. Decida em qual pasta deseja armazenar o script e crie essa pasta se 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 em 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 de 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
## Recuperar 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 proxied 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, atualizar 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."
    ## Atualizar 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 da Cloudflare, o que vem a seguir? Antes de implementar o script, testar se sua funcionalidade funciona é essencial. Para executar o script, são necessários quatro detalhes para ter sucesso, e esses são:

  • Email – que é o endereço de e-mail para sua conta Cloudflare.
  • Token – o token de API que você criou anteriormente em sua conta 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 mostrado 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 ao 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, realize outra consulta de registro DNS conforme feito 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 de DNS Dinâmico do Cloudflare

Neste ponto, você agora tem um script funcional que atualiza o seu registro de DNS dinâmico no Cloudflare. Mas executar o script manualmente a cada vez não é o objetivo. Você deve garantir que a atualização do DNS dinâmico 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 irá criar uma tarefa agendada no Windows que executa o script de atualização de DNS dinâmico do Cloudflare a cada cinco minutos.

Definindo a Ação da Tarefa Agendada

A tarefa agendada deve ter uma ação, que pode ser criada 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

Após definir o que a tarefa fará, você deve criar um desencadeador ou programação 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 uma nova programação de desencadeador de tarefa agendada
## Desencadeador = 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, está pronto para registrar a nova tarefa agendada no computador. Para fazer isso, você precisará executar o cmdlet Register-ScheduledTask, assim como o 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 local do SISTEMA. 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 em intervalos de cinco minutos.

Registering the New Scheduled Task

Conclusão

Mantendo os registros DNS atualizados com alterações de endereços IP dinâmicos 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 na Cloudflare, você pode aproveitar sua API, permitindo que você atualize seus registros DNS programaticamente.

Você aprendeu neste tutorial como atualizar um registro DNS dinâmico da Cloudflare usando uma combinação de chamadas de API, PowerShell 7 e tarefas programadas. Tudo isso permite que você configure seu mecanismo de atualização de DNS dinâmico da Cloudflare uma vez e mantenha a atualização em execução em um intervalo não assistido.

Você consideraria gerenciar suas zonas DNS com a 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/