DNS Dinámico con Cloudflare
Si quieres montar un website, un NAS, una radio, o cualquier otro servicio en tu hogar(con una rpi, por ej) y que sea accesible desde la WAN por DNS, probablemente ya has probado herramientas legendarias para esto, tales como: DynDNS, No-IP, DuckDNS y muchos otros. El problema con algunos de estos servicios gratuitos es que no son 100% fiables o tienen demasiada latencia, y más importante aún si quieres montar algo medianamente profesional, no te permiten personalización del nombre del dominio ni tener subdominios, por lo que en el siguiente artículo te cuento como puedes hacerlo con Cloudflare(si no lo conoces, te dejo la tarea de ir a buscarlo).
No es gratis, pero puedes encontrar dominios desde 5 USD al año, que para los beneficios que tiene versus un DNS gratuito, creo que es un tradeoff que merece la pena.
PASO 1: Registrar un DNS en Cloudflare⌗
Lo primero, evidentemente, es registrarse en Cloudflare en el siguiente link: https://dash.cloudflare.com, tras lo cual deberás registrar tu DNS.
-
A) Ve al menú lateral, pincha en “Registrar”->“Register domains”, luego en input “Enter a domain name” ingresa el dominio que quieres registrar. Para este ejemplo usaremos “dominio-menos-pobre.com” (si está ocupado, nada que hacer, tendrás que pensar en otro)
-
B) Busca el dominio que prefieras, porque aunque indiques uno, Cloudflare te sugerirá varios. Una vez escogido, tendrás que ingresar el método de pago y si es exitoso, pues ya está! ya tienes tu dominio comprado!.
PASO 2: Configuración de registros DNS⌗
Si nunca has hecho esto antes, te cuento rápidamente y muy superficialmente cuáles son los tipos de registros DNS más comunes.
¿Qué son los registros DNS?
Básicamente determinan qué mostrar cuando consultas por una dirección y dónde deben ser entregados los mails. Los más comunes son:
- Type A: Registro de host. Vincula un dominio con una dirección IP. Ejemplo: dominio-menos-pobre.com
- Type CNAME: Registro de nombre canónico. Vincula un nombre alias con otro dominio canónico o principal. Ejemplo: www.dominio-menos-pobre.com o subdominio.dominio-menos-pobre.com
- Type MX: Registro de intercambio de correo. Dirigen el correo de un dominio al servidor que aloja la cuenta de usuario del dominio.
- Type NS: Registro de servidor de nombres. Usualmente, hay 2, principal y secundario. Son los servidores que comunicarán la información del DNS de un dominio. Esto lo asigna el proveedor, así que no tienes que preocuparte por esto.
Una vez comprendido lo anterior, sólo falta configurar los registros DNS en Cloudflare, pero por si no te quedó claro, te dejó un ejemplo de configuración básica:
Type | Name | Content | Proxy status | TTL |
---|---|---|---|---|
A | dominio-menos-pobre.com | <TU_IP_DINAMICA> | DNS only | Auto |
CNAME | www | dominio-menos-pobre.com | DNS only | Auto |
MX | dominio-menos-pobre.com | route3.mx.cloudflare.net [30] | DNS only | Auto |
MX | dominio-menos-pobre.com | route2.mx.cloudflare.net [20] | DNS only | Auto |
MX | dominio-menos-pobre.com | route1.mx.cloudflare.net [10] | DNS only | Auto |
Aún te faltarán los registros TXT, pero esos te los entrega Cloudflare, al igual que los registros MX y NS (explicados más arriba).
Finalizado este paso, ahora corresponde pasar a la actualización automática de registro Type A con tu IP cada X tiempo.
PASO 3: Script y Cron para actualización de registro⌗
Para esto primero debes:
-
Obtener tu API Token desde el sitio de Cloudflare https://dash.cloudflare.com/profile/api-tokens
-
Pinchar en “Create Token”->“Create Custom Token”->“Get Started”
-
En “Token name” puedes poner el nombre que quieras
-
En “Permissions” debes agregar los siguientes ítems:
4.1. Zone -> Zone Settings -> Read
4.2. Zone -> Zone -> Read
4.3. Zone -> DNS -> Edit
-
En “Zone Resources”:
5.1. Include -> All zones from an account -> <TU_CUENTA>
-
Pinchar en “Continue to summary”
-
Luego pinchar en “Create Token”, esto te devolverá un Token, pincha en “Copy” y guárdalo porque en los pasos siguientes lo usaremos.
Si no tienes tiempo o no te interesa saber cómo scrapear la API manualmente, salta directamente al punto 10, donde te dejo un script para que saques todo lo necesario rápidamente. Otra opción es obtener esta información desde la misma interfaz web, pero para mí es más sencillo y rápido hacerlo con llamados directos a la API.
-
Obtener la zona:
curl -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <TU_TOKEN>" | jq '.result[] | .id, .name'
-
Obtener el ID del registro DNS:
curl -X GET "https://api.cloudflare.com/client/v4/zones/<TU_ZONA>/dns_records" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <TU_TOKEN>" | jq '.result[] | select(.type == "A") | .id, .name'
-
Script para obtener ZONA e ID(necesarios para el script final). Guarda este script, dale permisos de ejecución(“chmod +x TU_SCRIPT.sh”) y ejecútalo con los siguientes parámetros: ./TU_SCRIPT.sh “TU_TOKEN” “TU_DNS_TIPO_A”. Ejemplo: ./script.sh “nZ$9Z$k8FUyI2GOvC3U1v9ha5MgxQorxo9gfES8a” “dominio-menos-pobre.com”
#!/bin/bash TOKEN=$1 TYPEA=$2 ZONE=$(curl -X GET "https://api.cloudflare.com/client/v4/zones" -H "Content-Type: application/json" -H "Authorization: Bearer Sn_1Zk_8FUiI1GOvU2v9H5mxQxo9agorTB2RLA9I" | jq ".result[] | select(.name == \"$TYPEA\") | .id" | sed 's/"//g') ID=$(curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE/dns_records" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq '.result[] | select(.type == "A") | .id' | sed 's/"//g') printf "ZONA: $ZONE\nID: $ID\n"
-
Ya tenemos toda la información necesaria para la creación de nuestro script. En el script ZONE y ID son “arrays”, así que puedes poner tantas zonas como desees, siempre con el cuidado de mantener el orden como puedes ver en el script(TU_ZONA1 y TU_ID1 son el primer elemento del array, y para TU_ZONA2 y TU_ID2 son el segundo elemento del array)
#!/bin/bash TOKEN="<TU_TOKEN>" ZONE=("<TU_ZONA1>" "<TU_ZONA2>") ID=("<TU_ID1>" "<TU_ID2>") # ifconfig.me es un servicio web para obtener tu dirección IP pública, hay otros servicios iguales, usa el de tu preferencia IP=$(curl ifconfig.me) for i in "${!ZONE[@]}"; do curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE[$i]}/dns_records/${ID[$i]}" \ -H "Content-Type:application/json" \ -H "Authorization: Bearer $TOKEN" \ -d "{\"content\":\"$IP\"}" done
-
Y ya casi terminamos, sólo falta crear el cron que verificará tu dirección IP pública y la actualizará cada <X_MINUTOS> en Cloudflare(te recomiendo un valor no menor a 5). No olvides darle permisos de ejecución al script.
(crontab -l && echo "*/<X_MINUTOS> * * * * /RUTA/A/TU/SCRIPT/updateIP.sh > /dev/null 2>&1") | crontab -
Conclusión⌗
Como acabas de ver, es bastante simple y no es gratis, pero bastante económico y tendrás a disposición un dominio a tu gusto y con la posibilidad de agregar subdominios.
That’s all folks!