DDNS: Mantén tu red siempre localizada aunque tu IP cambie

Cuando tenemos montado un ecosistema en nuestra red local (impresoras, NAS, una raspberry pi...) nos es de utilidad mientras estamos conectados a dicha red, pero en ocasiones nos gustaría poder acceder desde cualquier punto exterior. La manera más recomendada para ello es hacer uso de una VPN, como vimos en el anterior artículo. Pero, como la mayoría de los mortales, nuestra conexión doméstica hace uso de una IP dinámica que cambiará cada X tiempo (cada hora, cada día, cada semana... depende de nuestro ISP), con lo que no podemos tener un nombre de dominio apuntando a la IP que tengamos en un momento determinado si no poseemos de un mecanismo que se encarge de mantenerla actualizada. ¿Y cómo podemos hacer esto? Gracias a los servicios de DDNS.

DDNS (Dynamic Domain Name System), o en español, Sistema dinámico de nombres de dominio, es un servicio que permite la actualización en tiempo real de la información sobre nombres de dominio situada en un servidor de nombres.

NOTA: Debemos asegurarnos que la conexión que nos ofrece nuestro ISP no funciona a través de CG-NAT, o de lo contrario no podremos acceder a nuestra red local desde el exterior de ninguna manera.

Dentro de los servicios DDNS podemos encontrar algunos públicos y otros privados. Así mismo, ciertos servicios como OVH nos permiten crear un sistema de DNS dinámico sobre un subdominio sin coste adicional al que ya estemos pagando por nuestro dominio.

En este artículo hablaremos del servicio de DDNS que nos ofrece Duck DNS. Se trata de un servicio completamente gratuito bajo su dominio duckdns.org. Duck DNS nos ofrece un servicio para mantener actualizada nuestra IP en relación a los nombres de dominio que especifiquemos. Podemos definir la tasa de refresco/chequeo de la misma, aunque por defecto nos recomiendan un intervalo de 5 minutos. Esto quiere decir que, en el caso de que hagamos una comprobación y justo después cambie nuestra IP, nuestra red local estará inaccesible durante 5 minutos como máximo.

Qué necesitamos

Lo primero que necesitaremos será registrarnos en el servicio. Para ello, accedemos a su web (duckdns.org) y nos registraremos a través de alguno de los servicios que nos ofrecen (en el momento de escribir este artículo esto lo podremos hacer a través de Persona, Twitter, GitHub, Reddit o Google).

Una vez registrados, veremos que, en la información de nuestra cuenta, figuran algunos datos, donde destaca el token, el cual será necesario para registrar nuestros dominios. Con la cuenta gratuita podremos registrar un máximo de 5 subdominios. Los escribiremos y añadiremos, y los recordaremos para el siguiente paso (si no están ya cogidos, claro...).

Crear nuestros subdominios

Una vez tenemos dados de alta los subdominios que queramos, tendremos una lista del estilo como el de la imagen (las IP las he cambiado adrede para no tener una real en el ejemplo):

Subdominios creados para nuestro usuario

Tras dar de alta nuestros subdominios ejemplo2020 y ejemplo0202, usaremos el primero para que apunte a nuestra red local (el segundo lo hemos dado de alta para reservarlo para otra red local que tengamos en casa de algún pariente, por ejemplo), de manera que, si accedemos a http://ejemplo2020.duckdns.org nos redirija a nuestra red local.

Crear el script de actualización de nuestra IP

Una vez hemos dado de alta nuestros subdominios, si accedemos en el menú superior a la opción install veremos que hay un gran número de opciones donde podemos instalar el script que se encargará de mantener nuestra recién creada dirección web con la IP que le corresponde.

Para este ejemplo, y como tenemos nuestro servidor VPN instalado en una raspberry pi y es el objetivo principal por el que hacemos esto, seleccionaremos el sistema operativo pi, el dominio ejemplo2020 y veremos cómo nos aparece un listado de pasos que ejecutar. Se entienden muy bien, pero los resumo y castellanizo aquí de todas formas:

  • Nos conectamos a nuestra raspberry pi por SSH con el usuario que queramos usar y, en la carpeta home del mismo, creamos una carpeta llamada duckdns y un fichero en su interior llamado duck.sh.
  • Editamos el archivo duck.sh con el siguiente contenido:
echo url="https://www.duckdns.org/update?domains=ejemplo2020&token=MI_TOKEN_ULTRA_SECRETO&ip=" | curl -k -o ~/duckdns/duck.log -K -

En el texto anterior hay que destacar 2 cosas: tras domains deberemos añadir nuestro nuevo subdominio, sin la parte duckdns.org y, en caso de querer actualizar más de uno a la vez con la misma IP, todos ellos seguidos separados por comas: domains=ejemplo2020,ejemplo0202. Si hacemos esto, ambos subdominios apuntarán a la misma IP, con lo que sólo lo haremos si mantenemos más de un subdominio a la misma red local.

Otro campo importante es MI_TOKEN_ULTRA_SECRETO, que deberemos sustituir por el TOKEN que nos generó Duck DNS cuando nos registramos y que tenemos en la página principal.

  • Salvamos el contenido del fichero y lo dotamos de permisos de ejecución con la orden chmod 700 duck.sh.
  • Abrimos el editor de cron con la orden crontab -e y añadimos la siguiente línea al final del mismo:
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1
Línea que añadiremos al fichero de crontab

El significado de la línea es el siguiente: Cada 5 minutos, el sistema invocará al script duck.sh y redirigirá su salida estándar y de errores a /dev/null, con lo que cada 5 minutos se actualizará nuestra actual IP en Duck DNS.

¡Salvamos y listo! Para probar que el script funciona ejecutamos ./duck.sh y veremos que ha aparecido un fichero llamado duck.log que contendrá el resultado de la operación (OK si todo ha ido bien y KO si no ha ido bien).

Desde este momento, ya podremos acceder a nuestra red local accediendo a ejemplo2020.duckdns.org.

Deberemos configurar nuestro servidor VPN para que use esa dirección web y no directamente la IP si queremos usarlo como se cuenta en el artículo PiVPN: Tu propia VPN sin dolor.

Y con esto ya puede cambiar nuestra IP las veces que quiera que, como mucho, nos hará esperar 5 minutos hasta poder saber de nuevo cuál es 😎.