Cloudflare DDNS en Windows 11 con PowerShell: Script y Tarea Programada

Cloudflare DDNS en Windows 11 con PowerShell: Script y Tarea Programada

Volver al Blog

Con la API de Cloudflare y unas pocas líneas de PowerShell puedes mantener un registro A apuntando a tu IP pública desde Windows 11, sin instalar nada más. Esta guía te da el script, cómo guardar el token cifrado y cómo programarlo con el Programador de tareas. Al final verás en qué se diferencia de usar un servicio de Windows como SyncMyIP, que es la otra forma de hacerlo: la tienes explicada en configurar Cloudflare DDNS en Windows 11 paso a paso.

Qué necesitas

  • Un dominio gestionado por Cloudflare y un registro A creado para el nombre que vas a usar, por ejemplo casa.tudominio.com.
  • Un token de API de Cloudflare con la plantilla Edit zone DNS, limitado a la zona de tu dominio (API Tokens en tu perfil de Cloudflare). Más sobre permisos mínimos en seguridad de la API de Cloudflare.
  • El Zone ID de tu dominio, que aparece en la página de resumen del dominio en Cloudflare.
  • Windows PowerShell 5.1, que ya viene con Windows 11. El script también vale en PowerShell 7.

Paso 1: guarda el token cifrado

En lugar de dejar el token en texto plano dentro del script, guárdalo cifrado con la protección de datos de Windows. Abre PowerShell con el usuario que va a ejecutar la tarea y escribe:

New-Item -ItemType Directory -Force C:\Scripts | Out-Null
Read-Host 'Token de Cloudflare' -AsSecureString | ConvertFrom-SecureString | Set-Content C:\Scripts\cf-token.txt

El fichero solo se puede descifrar con ese mismo usuario en ese mismo equipo.

Paso 2: el script

Guárdalo como C:\Scripts\cloudflare-ddns.ps1 y cambia el Zone ID y el nombre del registro:

$ErrorActionPreference = 'Stop'

$zoneId   = 'TU_ZONE_ID'
$registro = 'casa.tudominio.com'

$seguro = Get-Content 'C:\Scripts\cf-token.txt' | ConvertTo-SecureString
$token  = [System.Net.NetworkCredential]::new('', $seguro).Password
$cabeceras = @{ Authorization = "Bearer $token" }
$api = "https://api.cloudflare.com/client/v4/zones/$zoneId/dns_records"

# Tu IP pública actual (IPv4)
$ip = (Invoke-RestMethod -Uri 'https://api.ipify.org').Trim()

# El registro A tal como está ahora en Cloudflare
$respuesta = Invoke-RestMethod -Uri "${api}?type=A&name=$registro" -Headers $cabeceras
if (-not $respuesta.success -or $respuesta.result.Count -eq 0) {
    throw "No existe un registro A llamado $registro"
}
$actual = $respuesta.result[0]

if ($actual.content -eq $ip) { return }   # Nada que hacer

$cuerpo = @{
    type    = 'A'
    name    = $registro
    content = $ip
    ttl     = $actual.ttl
    proxied = $actual.proxied
} | ConvertTo-Json

Invoke-RestMethod -Method Put -Uri "$api/$($actual.id)" -Headers $cabeceras `
    -ContentType 'application/json' -Body $cuerpo | Out-Null

"$(Get-Date -Format s) Actualizado: $($actual.content) -> $ip"

El script solo escribe en Cloudflare cuando la IP ha cambiado y conserva el TTL y el estado del proxy que ya tenía el registro. Si algo falla (token sin permiso, registro inexistente, sin conexión), termina con un error en lugar de seguir.

Paso 3: prueba el script a mano

powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\cloudflare-ddns.ps1

Si el registro tenía otra IP, verás la línea «Actualizado»; si ya coincidía, no imprime nada. Con Resolve-DnsName casa.tudominio.com -Type A puedes comprobar lo que resuelve el nombre; si sigue saliendo la IP antigua, ejecuta ipconfig /flushdns.

Paso 4: prográmalo con el Programador de tareas

Desde un PowerShell normal, registra una tarea que lo lance cada 5 minutos:

$accion  = New-ScheduledTaskAction -Execute 'powershell.exe' `
    -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\cloudflare-ddns.ps1"'
$disparo = New-ScheduledTaskTrigger -Once -At (Get-Date) `
    -RepetitionInterval (New-TimeSpan -Minutes 5) `
    -RepetitionDuration (New-TimeSpan -Days 3650)
Register-ScheduledTask -TaskName 'Cloudflare DDNS' -Action $accion -Trigger $disparo

Puedes revisarla y lanzarla a mano desde Programador de tareas, o con Start-ScheduledTask -TaskName 'Cloudflare DDNS'.

Límites de hacerlo con un script

  • Registrada así, la tarea se ejecuta con tu usuario mientras tengas la sesión iniciada. Si el equipo se reinicia y nadie entra, el DNS no se actualiza hasta que lo hagas. Se puede configurar para que corra sin sesión, pero entonces hay que guardar la contraseña del usuario en la tarea.
  • El token cifrado está atado al usuario y al equipo: si cambias de usuario o reinstalas Windows, hay que volver a guardarlo.
  • Un script solo vigila la IP. Los avisos si tu web cae, los certificados o la página de estado son otra cosa que tendrías que montar aparte.
  • Si el registro tiene la nube naranja de Cloudflare activada, los servicios que no son web (escritorio remoto, VPN, Plex) no funcionan a través del proxy; para ellos deja el registro en «solo DNS».

Cuándo conviene un servicio en lugar de un script

SyncMyIP es un servicio de Windows: arranca con el sistema, funciona en segundo plano aunque nadie haya iniciado sesión, guarda las credenciales cifradas con DPAPI y solo llama al proveedor cuando tu IP ha cambiado. Funciona con Cloudflare, Hostinger y Namecheap y su versión gratuita incluye un dominio y 10 monitores de disponibilidad. Si prefieres no mantener scripts, mira la guía de configuración en Windows 11 o descárgalo gratis.

Si no consigues llegar desde fuera

Un DDNS al día no basta si el tráfico no entra en tu casa. Revisa que el router reenvía los puertos (cómo abrir puertos con IP dinámica), que tu operador no te pone detrás de CGNAT (cómo saberlo) y que expones solo lo necesario (seguridad en servidores caseros). Si lo tuyo es Linux, el mismo método en bash está en actualizar la IP dinámica en Cloudflare con un script bash.