El DDNS de Cloudflare


psyduck sprite

Llevo reivindicando la creación de un servidor DDNS público por parte de Cloudflare desde hace más de cinco años, pero ese escenario me parece cada vez más improbable. Para ellos no sería más que un toy project que asignarían a un becario, como forma de promocionar su negocio serverless.

Por mi parte, estoy muy contento con el servidor que ofrece duckdns.org. Los uso desde que empecé a montar webs, y es el que recomiendo a todo el mundo. Sin embargo, me he animado a dar el paso y migrar el DDNS a la plataforma de Cloudflare, a pesar de que no existe tal cosa. Paradójicamente, Cloudflare expone una completa y perfectamente estructurada API con la que podemos manejar los registros DNS de nuestros dominios.

La estrategia a seguir sería configurar un subdominio, cuyo registro A fuéramos actualizando mediante peticiones a la API. Luego sólo tendríamos que apuntar el cname del resto de subdominios al que actúa como DDNS. Las diferencias con un servicio nativo son mínimas. En vez de utilizar un hipotético lunaticgeek.cloudflare.com, entramos a través de ddns.lunaticgeek.com. La forma de actualizar nuestra IP pública también es ligeramente más farragosa que con un servicio nativo, pero siguiendo su documentación, me he construido un breve script que —añadido a un cronjob— nos facilita la tarea y nos permite prescindir del servicio de un tercero. Reitero que duckdns es un DDNS fantástico, pero puede desaparecer en cualquier momento. A largo plazo, esta solución me parece la más prudente y acertada.

#!/usr/bin/env bash

ZONE_IDENTIFIER="################################"
IDENTIFIER="################################"

X_AUTH_EMAIL="[email protected]"
X_AUTH_KEY="#####################################"
PUBLIC_IP=$(curl -s https://icanhazip.com/)
RECORD="ddns.lunaticgeek.com"

curl --request PUT \
	--url https://api.cloudflare.com/client/v4/zones/${ZONE_IDENTIFIER}/dns_records/${IDENTIFIER} \
	--header 'Content-Type: application/json' \
	--header "X-Auth-Email: ${X_AUTH_EMAIL}" \
	--header "X-Auth-Key: ${X_AUTH_KEY}" \
	--data "{
	\"content\": \"${PUBLIC_IP}\",
	\"name\": \"${RECORD}\",
	\"type\": \"A\"
}"

P.S. Los más avispados se habrán dado cuenta de que mi intención de ser independiente de servicios de terceros en la administración de DDNS choca con el hecho de tener que averiguar la IP pública del servidor de origen. En mi caso, he recurrido a icanhazip.com, que sí forma parte de la infraestructura de Cloudflare, por lo que no me desvío de mi objetivo inicial, aunque pudiera parecer lo contrario.