Cómo Configurar Cloudflare Dynamic DNS

Supongamos que publicaste un sitio web desde tu red doméstica y creaste un registro DNS que apunta a la dirección IP pública de tu enrutador. ¿Cómo mantienes actualizado tu registro DNS cuando cambia tu dirección IP pública? Tal vez deberías considerar configurar un DNS dinámico de Cloudflare.

Los proveedores de servicios de Internet (ISP) suelen asignar direcciones IP dinámicas a sus suscriptores, las cuales pueden cambiar en cualquier momento. Como resultado, tu registro DNS sigue apuntando a una dirección IP que ya no es tuya y tu sitio web se vuelve inaccesible.

Sigue leyendo porque este tutorial te ayudará a mantener actualizado tu registro DNS utilizando la interfaz de programación de aplicaciones (API) de Cloudflare y PowerShell. ¡Comencemos!

Prerrequisitos

Si planeas seguir este tutorial práctico, a continuación se detallan los requisitos que necesitas.

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

Los dominios de nivel superior (TLD) gratuitos, como .ml, .ga, .tk, .cf y .gq, no son aplicables para la automatización del DNS dinámico de Cloudflare y no funcionarán con este tutorial.

Sample DNS A record in Cloudflare

¿Qué es Cloudflare Dynamic DNS?

Los registros DNS son inherentemente estáticos, y no funcionan bien con direcciones IP dinámicas. Ahora, para resolver ese problema, necesitará configurar un DNS dinámico. Afortunadamente, Cloudflare proporciona una API que le permite administrar registros DNS de forma programática.

Para configurar un DNS dinámico de Cloudflare, deberá ejecutar un proceso en un cliente dentro de su red que realice dos acciones principales: obtener la dirección IP pública actual de su red y actualizar automáticamente el registro DNS correspondiente.

La imagen a continuación muestra el diagrama de alto nivel de cómo ocurre el flujo de actualización dinámica de DNS de Cloudflare.

Cloudflare Dynamic DNS update flow

Existen muchos clientes de DNS dinámico disponibles para instalar, principalmente para sistemas Linux, como en un servidor Ubuntu o Raspberry PI. También existen servicios de DNS dinámico de terceros que pueden ser de pago o gratuitos. Pero en este tutorial, desplegarás un script actualizador de DNS que se ejecuta en PowerShell 7.1.

Obteniendo un Token de API de Cloudflare

Cuando actualizas el registro de DNS dinámico de Cloudflare de forma programática, tu script debe autenticarse ante la API de Cloudflare. Solo entonces Cloudflare te permitirá realizar cambios en los registros de DNS de tu cuenta.

Cloudflare te permite crear tokens de API con suficientes permisos para su propósito. A su vez, puedes utilizar el nombre de usuario de tu cuenta de Cloudflare y el token de API resultante para autenticarte con la API de Cloudflare.

Para crear un Token de API de Cloudflare, sigue estos pasos.

1. Abre tu navegador, ve a https://dash.cloudflare.com/login/ e inicia sesión en tu cuenta de Cloudflare.

2. Después de iniciar sesión en el panel de control de Cloudflare, haz clic en el botón de perfil en la esquina superior derecha y selecciona Mi Perfil.

Opening your Cloudflare profile page

3. A continuación, haz clic en el enlace de la pestaña API Tokens. Bajo la sección API Tokens, haz clic en el botón Crear Token. El ejemplo a continuación asume que aún no has creado ningún token de API.

Clicking Create Token

4. En la lista de plantillas de tokens de API (API token templates), haz clic en la plantilla Editar zona DNS para utilizarla. Esta plantilla te permite crear un token de API con permisos de edición para todas o algunas zonas DNS seleccionadas en tu cuenta.

Selecting the Edit zone DNS API token template

5. En la sección de Recursos de Zona en la página de Crear Token, haz clic en la caja desplegable más a la derecha y selecciona la zona DNS que deseas incluir en el acceso de este token de API. Después de elegir la zona DNS, haz clic en Continuar con el resumen.

Opcionalmente, para limitar el período de validez del token de API, completa las fechas de inicio (Start Date) y fin (End Date) en la sección de TTL. Si se deja en blanco, el token de API no tendrá fecha de vencimiento.

Selecting the DNS Zone

6. Revisa el resumen y asegúrate de que la API tenga permisos de DNS:Edit para la zona DNS seleccionada anteriormente. Finalmente, haz clic en Crear Token para crear el token de API.

Reviewing the API token permission

7. Después de crear el token de API, copia el valor del token y asegúrate de almacenarlo de manera segura. Trata el token de API como tratarías una contraseña.

Copying the API Token

8. Regresa a la pestaña de API Tokens y confirma la existencia del token de API que creaste.

Verifying the API Token

Configuración del Script de Actualización Dinámica de DNS de Cloudflare

Ahora tienes la cuenta de Cloudflare y el token de API de Cloudflare con permisos para editar una zona DNS. ¿Qué sigue? Deberás poner en práctica el token de API e integrarlo con un script que actualice de manera programática el registro de DNS dinámico de Cloudflare.

Este tutorial te proporciona un script de PowerShell funcional específicamente para actualizar un registro DNS en Cloudflare.

Guardar el script

Sigue los pasos a continuación para guardar el script de PowerShell dinámico de Cloudflare en tu computadora cliente.

1. Decide en qué carpeta guardar el script y crea esa carpeta si aún no existe. En este ejemplo, la ubicación del script es en C:\CloudflareDDNS.

2. Abre tu editor de código, como VSCode, y crea un nuevo archivo de script de PowerShell llamado Update-CloudflareDDNS.ps1. Guarda el script dentro de la carpeta C:\CloudflareDDNS.

3. Copia el siguiente script, pégalo en tu editor de código y guarda el archivo. Consulta los comentarios en línea para entender qué hace el script.

#requiere -Versión 7.1

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

# Construye las cabeceras de solicitud una vez. Estas cabeceras se utilizarán en todo el script.
$headers = @{
    "X-Auth-Email"  = $($Email)
    "Authorization" = "Bearer $($Token)"
    "Content-Type"  = "application/json"
}

#Región Prueba de Token
## Este bloque verifica que tu clave de API sea válida.
## Si no lo es, el script se terminará.

$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."
    # Salir del script
    return
}
Write-Output "API token validation [$($Token)] success. $($auth_result.messages.message)."
#FinRegión

#Región Obtener ID de Zona
## Recupera el identificador de zona del dominio en función del nombre de la zona. Si no se encuentra el identificador, el script se terminará.
$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."
    # Salir del script
    return
}
## Almacenar el ID de zona DNS
$zone_id = $DnsZone.result.id
Write-Output "Domain zone [$($Domain)]: ID=$($zone_id)"
#FinRegión

#Región Obtener Registro DNS
## Recupera los detalles del registro DNS existente de 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."
    # Salir del script
    return
}
## Almacenar la dirección IP actual en el registro DNS
$old_ip = $DnsRecord.result.content
## Almacenar el valor del tipo de registro DNS
$record_type = $DnsRecord.result.type
## Almacenar el valor del ID de registro DNS
$record_id = $DnsRecord.result.id
## Almacenar el valor del TTL de registro DNS
$record_ttl = $DnsRecord.result.ttl
## Almacenar el valor de proximidad del registro DNS
$record_proxied = $DnsRecord.result.proxied
Write-Output "DNS record [$($Record)]: Type=$($record_type), IP=$($old_ip)"
#FinRegión

#Región Obtener Dirección IP Pública Actual
$new_ip = Invoke-RestMethod -Uri 'https://v4.ident.me'
Write-Output "Public IP Address: OLD=$($old_ip), NEW=$($new_ip)"
#FinRegión

#Región Actualizar Registro de DNS Dinámico
## Compara la dirección IP actual con el registro DNS
## Si la dirección IP actual no coincide con la dirección IP del registro DNS, actualiza el 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."
    ## Actualiza el registro DNS con la nueva dirección 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)"
        ## Salir del 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."
}
#FinRegión

Ejecutando el Script

Ahora que has guardado el script de actualización dinámica de DNS de Cloudflare, ¿qué sigue? Antes de implementar el script, es esencial probar si su funcionalidad funciona. Para ejecutar el script con éxito, se necesitan cuatro detalles, y son los siguientes:

  • Email – que es la dirección de correo electrónico de tu cuenta de Cloudflare.
  • Token – el token de API que creaste previamente desde tu cuenta de Cloudflare.
  • Domain – el nombre de dominio DNS que contiene el registro DNS que deseas actualizar. (por ejemplo, lazyexchangeadmin.cyou).
  • Record – el registro DNS que deseas actualizar. (por ejemplo, demo.lazyexchangeadmin.cyou).

Para ejecutar el script, sigue estos pasos.

1. Primero, abre una sesión de PowerShell. O, si estás usando VSCode, utiliza el terminal de PowerShell de VSCode en su lugar.

2. A continuación, realiza una búsqueda de registro DNS para confirmar la dirección IP actual del registro DNS. Para hacerlo, ejecuta el cmdlet Resolve-DnsName, como puedes ver a continuación. Asegúrate de proporcionar el nombre de dominio completamente calificado (FQDN) con el parámetro -Name.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

El comando debería devolver el registro DNS que buscaste, incluida su dirección IP.

Looking up a DNS record before the Cloudflare dynamic DNS update

3. Ahora, invoca el script Update-CloudflareDDNS.ps1 para actualizar el registro DNS en Cloudflare ejecutando el siguiente comando. Asegúrate de cambiar el Email, Token, Domain, y Record. El comando asume que tu script está en C:\CloudflareDDNS\Update-CloudflareDDNS.ps1.

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

El script realiza las siguientes acciones, como se muestra en la captura de pantalla a continuación.

  1. Valida el token de la API.
  2. Encuentra el dominio que contiene el registro DNS a actualizar.
  3. Encuentra el registro DNS a actualizar.
  4. Compara la dirección IP del registro DNS con la dirección IP externa o pública real.
  5. Actualiza la dirección IP del registro DNS en Cloudflare.
  6. Muestra el resultado de la actualización dinámica de DNS.
Running the Cloudflare dynamic DNS update script

4. Regresa a tu panel de control de Cloudflare y verifica que el registro DNS refleje la nueva dirección IP. La captura de pantalla a continuación muestra que la dirección IP ha cambiado al valor de la IP externa después de ejecutar el script de actualización.

Verifying the DNS record in Cloudflare

5. Finalmente, realiza otra búsqueda de registro DNS como lo hiciste en el paso 2 para confirmar si la nueva dirección IP ya se propagó públicamente.

Resolve-DnsName -Name demo.lazyexchangeadmin.cyou

La propagación del registro DNS puede llevar varios minutos, horas o incluso días. En este ejemplo, la propagación en Cloudflare solo tomó menos de un minuto.

Looking up a DNS record after the Cloudflare dynamic DNS update

Programación de la Tarea de Actualización Dinámica de DNS de Cloudflare

En este punto, ahora tienes un script funcional que actualiza el registro DNS dinámico de Cloudflare. Pero ejecutar el script manualmente cada vez no es el objetivo. Debes asegurarte de que la actualización del DNS dinámico se ejecute automáticamente según sea necesario.

Dependiendo del sistema operativo que estés utilizando, la forma en que programes la ejecución del script varía, como un trabajo cron en Linux. Este tutorial creará una tarea programada en Windows que ejecutará el script de actualización del DNS dinámico de Cloudflare cada cinco minutos.

Definición de la acción de la tarea programada

Tu tarea programada debe tener una acción, que puedes crear ejecutando el cmdlet New-ScheduledTaskAction . En este ejemplo, la acción es ejecutar el script Update-CloudflareDDNS.ps1 utilizando el archivo ejecutable de PowerShell pwsh.exe.

Para hacerlo, abre una nueva ventana de PowerShell como administrador. Luego, copia y ejecuta el código a continuación en PowerShell. Asegúrate de cambiar las variables $scriptPath, $Email, $Token, $Domain, y $Record.

# Definir las propiedades de la acción de la tarea programada
## Ingrese la ruta del script de PowerShell
$scriptPath = 'C:\CloudflareDDNS\Update-CloudflareDDNS.ps1'
## Dirección de correo electrónico de la cuenta de Cloudflare
$Email = '[email protected]'
## Token de API de Cloudflare
$Token = 'kGW8n........eJl5a'
## Nombre de dominio DNS
$Domain = 'lazyexchangeadmin.cyou'
## Registro DNS a actualizar
$Record = 'demo.lazyexchangeadmin.cyou'

# Crear el objeto de acción de la tarea programada
$taskAction = New-ScheduledTaskAction `
    -Execute "pwsh.exe" `
    -Argument "-File $scriptPath -Email $Email -Token $Token -Domain $Domain -Record $Record"

Creación del Desencadenador de la Tarea Programada

Después de haber definido lo que hará la tarea, debe crear un desencadenador o programación para la tarea ejecutando el cmdlet New-ScheduledTaskTrigger. Copie el código a continuación y ejecútelo en PowerShell para crear un nuevo desencadenador de tarea que se ejecute cada cinco minutos durante un período de diez años.

# Crear un nuevo desencadenador de tarea programada
## Desencadenador = cada 5 minutos durante 10 años.
$taskTrigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date -Minute 0 -Second 0) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days 3650)

Registrando la Nueva Tarea Programada en el Sistema

Finalmente, estás listo para registrar la nueva tarea programada en la computadora. Para hacerlo, necesitarás ejecutar el cmdlet Register-ScheduledTask, igual que el código a continuación. Copia el código siguiente y ejecútalo en PowerShell para registrar la tarea programada.

La tarea programada resultante se ejecutará bajo la cuenta SISTEMA local. Si lo prefieres, puedes asignar una cuenta de usuario diferente para ejecutar la tarea programada según sea necesario.

# Registrar la tarea programada en el sistema.
## Nombre de la tarea programada
$TaskName = 'Update Cloudflare Dynamic DNS'
## Descripción de la tarea programada
$Description = 'Update Cloudflare DDNS Entry every 5 minutes'
## Crear la tarea programada
Register-ScheduledTask `
-TaskName $TaskName `
-Description $Description `
-Action $taskAction `
-Trigger $taskTrigger `
-User 'NT AUTHORITY\SYSTEM'

Como puedes ver a continuación, el comando ha creado la tarea programada y el estado es listo. A partir de este punto, el script se ejecutará con un intervalo de cinco minutos.

Registering the New Scheduled Task

Conclusión

mantener actualizados los registros dns con cambios de direcciones ip dinámicas no tiene por qué ser un desafío. ¡tampoco necesitas pagar por un servicio de dns dinámico! al administrar tus zonas dns en cloudflare, puedes aprovechar su api, lo que te permite actualizar tus registros dns de forma programática.

en este tutorial, aprendiste cómo actualizar un registro dns dinámico de cloudflare mediante una combinación de llamadas a la api, powershell 7 y tareas programadas. todo esto te permite configurar tu mecanismo de actualización dinámica de dns de cloudflare una vez y mantener la actualización en funcionamiento en un intervalo sin supervisión.

¿considerarías gestionar tus zonas dns con cloudflare para aprovechar los beneficios de su api? ¿o conoces alguna forma más conveniente y accesible?

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