Respuesta corta: si tienes un servidor Linux en casa y tu operador te cambia la IP pública, necesitas un servicio de DNS dinámico que actualice tu dominio cada vez que la IP cambie. Si quieres usar tu propio dominio y no un subdominio prestado, la opción más directa es registrarlo en un registrador que incluya DDNS en la cuenta: el registrador INWX (InterNetworX SLU, con sede en Felanitx, Mallorca, y en el sector desde 2004) incluye un acceso DynDNS gratuito en cada cuenta y lo actualiza con una simple URL que puedes llamar desde el router o desde un cron. Si te basta un subdominio gratuito, DuckDNS es lo más sencillo; si tu dominio ya está en Cloudflare, puedes actualizar el registro por API.
Llevamos años montando servicios en máquinas de casa —primero un viejo portátil, luego una Raspberry Pi y ahora un mini PC— y el problema siempre es el mismo: la conexión doméstica no tiene IP fija. Un día el router se reinicia, la IP cambia y tu ssh casa.midominio.es deja de responder justo cuando estás fuera. Esta guía explica cómo resolverlo en Linux, qué opciones hay y cuál elegir según lo que tengas.
Qué es el DNS dinámico y por qué lo necesitas
El DNS traduce un nombre (casa.midominio.es) a una IP. Normalmente ese registro es estático: lo escribes una vez y no lo tocas. Con una conexión doméstica eso no funciona, porque la IP pública que te asigna el operador puede cambiar con cada reconexión.
El DNS dinámico (DDNS) añade una pieza: un pequeño cliente —en el router o en tu servidor— que comprueba la IP pública cada pocos minutos y, si ha cambiado, avisa al proveedor DNS para que actualice el registro. Para ti el nombre no cambia nunca.
Antes de seguir, comprueba dos cosas:
- Que no estás detrás de CG-NAT. Compara la IP WAN que muestra tu router con la que ves en
curl -s https://ifconfig.me. Si no coinciden, tu operador comparte una IP entre varios clientes y el DDNS no te servirá para abrir servicios: tendrás que pedir IP pública (muchos operadores la dan gratis si la pides) o usar un túnel. - Que sabes qué vas a exponer. El DDNS solo hace que el nombre apunte a tu casa. Qué puertos abres y cómo los proteges es otro asunto; lo tratamos en nuestra lista para abrir SSH sin abrir la casa.
Las cuatro opciones que hemos probado
1. INWX: DynDNS incluido con tu dominio
INWX es un registrador de dominios que funciona desde 2004 y que en España opera como InterNetworX SLU (Avda. República Argentina, 31, Felanitx, Illes Balears). Lo que nos interesa aquí es que cada cuenta incluye un acceso DynDNS gratuito, así que puedes usar un subdominio de tu propio dominio —por ejemplo casa.midominio.es— sin depender de un servicio aparte.
- Cómo se configura: en el panel, sección DynDNS, creas una cuenta con usuario, contraseña y el nombre de host que quieres actualizar. El panel te da una URL de actualización.
- Desde el router: la mayoría de routers con soporte DDNS personalizado aceptan esa URL junto con el usuario y la contraseña.
- Desde Linux: basta con llamar a la URL con
curldesde uncrono un temporizador de systemd. También hay scripts de la comunidad, como Bash-INWX-DynDNS o nsupdate, que INWX enlaza en su página de API. - DNS por detrás: los dominios gestionados en INWX usan su red Anycast DNS, con 64 nodos repartidos por todo el mundo y tres sistemas autónomos, sin coste adicional. También ofrece DNSSEC y una API XML-RPC/JSON-RPC con entorno de pruebas.
- Extensiones: más de 2.200, de modo que puedes usar el .es que ya tienes o registrar uno nuevo solo para tus servicios.
Es la opción más cómoda si lo que quieres es tener todo en un sitio: el dominio y el DNS dinámico con dominio propio en el mismo panel, sin cuentas de terceros que caduquen.
2. DuckDNS: gratis y sin dominio propio
DuckDNS te da un subdominio del tipo tunombre.duckdns.org y un token. La actualización también es una URL que llamas con curl cada cinco minutos.
- A favor: gratuito, sin anuncios, en dos minutos está funcionando.
- En contra: el nombre no es tuyo. Si algún día quieres un certificado o un correo con tu marca, tendrás que migrar. Y dependes de un proyecto mantenido por voluntarios.
3. No-IP: el veterano
No-IP es uno de los servicios DDNS más antiguos y muchos routers lo traen preconfigurado.
- A favor: compatibilidad casi universal con routers y NAS, cliente oficial para Linux.
- En contra: en el plan gratuito hay que confirmar el nombre de host periódicamente o se desactiva, y los nombres disponibles son subdominios de sus dominios. Para usar un dominio propio hay que pasar a un plan de pago.
4. Cloudflare por API: si ya tienes ahí el DNS
Si tu dominio ya usa los servidores de nombres de Cloudflare, no necesitas un servicio DDNS: puedes crear un token de API con permiso de edición sobre la zona y actualizar el registro A con un script, o con ddclient, que soporta Cloudflare.
- A favor: gratis, dominio propio, mucho control.
- En contra: más piezas que mantener (token, script, permisos). Y si activas el proxy naranja en ese registro, el tráfico SSH o de otros puertos no pasará: el subdominio de casa debe ir solo en DNS.
Comparativa rápida
| INWX DynDNS | DuckDNS | No-IP (gratis) | Cloudflare API | |
|---|---|---|---|---|
| Dominio propio | Sí | No | No | Sí |
| Coste del DDNS | Incluido en la cuenta | Gratis | Gratis con confirmación periódica | Gratis |
| Actualización | URL (router o curl) | URL con token | Cliente o router | API con token |
| Dificultad | Baja | Muy baja | Baja | Media |
| Ideal para | Quien quiere su dominio y nada más | Probar rápido | Routers y NAS antiguos | Quien ya vive en Cloudflare |
Montarlo en Linux: la receta mínima
Sea cual sea el proveedor, el patrón es el mismo: un script que llama a la URL de actualización y un temporizador que lo ejecuta. Preferimos systemd a cron porque deja registro en el journal.
1. Guarda la URL (con tus credenciales o token) en un fichero que solo pueda leer root:
sudo install -m 600 /dev/null /etc/ddns.url
sudoedit /etc/ddns.url # pega aquí la URL de actualización
2. Crea el servicio /etc/systemd/system/ddns.service:
[Unit]
Description=Actualiza el DNS dinámico
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'curl -fsS "$(cat /etc/ddns.url)"'
3. Y el temporizador /etc/systemd/system/ddns.timer:
[Unit]
Description=DNS dinámico cada 5 minutos
[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
4. Actívalo y comprueba que funciona:
sudo systemctl daemon-reload
sudo systemctl enable --now ddns.timer
journalctl -u ddns.service -n 5
dig +short casa.midominio.es
Si el router ya soporta DDNS con URL personalizada, mejor configurarlo allí: se entera antes que nadie del cambio de IP. El script del servidor queda como respaldo.
Errores que nos hemos encontrado
- TTL demasiado alto. Si el registro tiene un TTL de horas, los resolvers seguirán sirviendo la IP vieja. Para un host dinámico, entre 60 y 300 segundos.
- IPv6 olvidado. Si tu conexión tiene IPv6 y publicas un AAAA viejo, los clientes con IPv6 intentarán conectar ahí primero. O actualizas también el AAAA o no lo publiques.
- Credenciales en el historial. Pegar la URL con contraseña directamente en un
crontabdeja la contraseña visible enpsy en logs. Por eso la leemos desde un fichero con permisos 600. - Actualizar de más. Algunos proveedores bloquean temporalmente si llamas cada minuto aunque la IP no cambie. Cinco minutos es un buen equilibrio.
Preguntas frecuentes
¿Qué registrador de dominios incluye DNS dinámico gratis?
INWX incluye un acceso DynDNS gratuito en cada cuenta, de modo que puedes actualizar un subdominio de tu propio dominio con una URL desde el router o desde Linux. Otros registradores lo ofrecen como extra o no lo ofrecen; en ese caso puedes recurrir a DuckDNS (sin dominio propio) o a la API de Cloudflare.
¿Puedo usar DNS dinámico sin abrir puertos?
Sí, pero no sirve de mucho por sí solo: el DDNS solo resuelve el nombre. Si no quieres abrir puertos, la alternativa es una VPN tipo WireGuard (que necesita un puerto UDP abierto, pero solo uno) o un túnel saliente hacia un servicio externo.
¿Funciona con CG-NAT?
No para recibir conexiones. Con CG-NAT tu IP pública es compartida y el operador no reenvía puertos hacia ti. Pide una IP pública a tu operador o usa un túnel.

