Namecheap DDNS

Continuando con la remodelación y reingeniería de mi homelab, he decidido trasladar algunos de mis sitios web personales y familiares a mi red local y servirlos desde mi casa. Como la IP que me ofrece mi proveedor principal, MasMóvil, es dinámica esto se vuelve un problema para los sitios web que deben estar en un servidor con IP fija.

Esto me lleva a utilizar un servicio de DDNS (Dynamic domain name system), donde se actualiza de manera regular en los registros A de un nombre de dominio la IP dinámica asignada por mi proveedor.

Mi proveedor de dominios principal es Namecheap (no, no me pagan publicidad por este post ni nada parecido ni mucho menos estoy en un programa de referidos). Entre las opciones de un dominio dentro de su plataforma, esta la opción de DDNS que permite actualizar una IP dinámica en su plataforma por medio de llamadas a una API. Para este tutorial me basé en uno diseñado para Docker.

Configuración en Namecheap

Una vez compramos o transferimos un dominio a Namecheap, desde el panel de control del dominio, vamos a la opción Domain > Nameservers y seleccionamos Namecheap BasicDNS. Esto activará las opciones de Namecheap para el servicio de DDNS.

Pestaña Domain

Una vez hecho y guardado este cambio, vamos a la pestaña Advanced DNS. En la sección Dynamic DNS están las opciones importantes que debemos editar para hacer que todo funcione.

En la sección Dynamic DNS, activamos el servicio haciendo click sobre el botón deslizable y luego copiamos la clave que nos muestra, esta es importante ya que por medio de ella se realiza la autenticación para modificar el registro DNS con el cliente.

En la sección Host Records dentro de Dynamic DNS activamos el registro A + Dynamic DNS Record, escribimos el subdominio que deseamos y ponemos una IP. En mi caso pongo 127.0.0.1 para verificar que se realiza el cambio una vez activo el cliente.

Si queremos añadir otros registros con IP fija o hosteados en otros sitios podemos hacerlo sin problemas en la sección Host Records que aparece de primera. Veremos también que a medida que añadamos registros dinámicos se actualizan en esta sección.

Pestaña Advanced DNS

Creando contenedores y los scripts para automatizar

Ahora ejecutaremos el contenedor podman con el servicio necesario para mantener actualizados los registros DNS dinámicos.

En mi servidor bastión, hobbiton, ejecuto el comando:

1
podman run --name serrano.red -d -e NC_HOST='www' -e NC_DOMAIN='serrano.red' -e NC_PASS='6bec692443ad159e5b9e2bec184e8a03' linuxshots/namecheap-ddns

Una vez ejecutado, veremos en Namecheap que el registro creado paso de 127.0.0.1 a la IP actual, en mi caso 201.227.63.233, como se puede ver en los screenshots. Podemos confirmar nuestra IP usando esta web.

Podman quedo funcionando toda la noche, pero por alguna razón el contenedor finalizó a eso de las 4:45 AM. En docker tenemos la opción, --restart unless-stopped que vuelve a levantar el contenedor pero esta no es funcional con podman por su naturaleza daemonless. Toca ahora crear una unidad de systemd para lograr el funcionamiento continuo.

Nota importante: a pesar que los pasos detallados a continuación me parecen coherentes y los scripts bash también, systemd falla al tratar de levantar los pods. Los scripts detallados aquí funcionan individualmente bien.

Como mantendré varios subdominios y el pod no acepta varios parámetros de host, toca crear manualmente un pod por cada subdominio a utilizar, así que automatizaré un poco las cosas con la ayuda de bash.

Antes de continuar, hay que detener y eliminar el pod que cree de ejemplo.

1
2
podman stop -t 2 www.serrano.red
podman rm www.serrano.red -f

En mi /home creo un directorio de trabajo llamado ddns. Dentro tendré un archivo donde almacenaré los registros y dominios junto a su clave de Namecheap (ddns-registros.txt)y sendos scripts bash para iniciar (ddns-start.sh), detener y eliminar (ddns-stop.sh) y los pods creados.

En el archivo ddns-registros.txt mantendré los registros por línea según el siguiente formato host,dominio,clave-namecheap. Cada entrada sin espacios y valores separados por coma.

1
2
3
www,serrano.red,6bec692443ad159e5b9e2bec184e8a03
cloud,serrano.red,6bec692443ad159e5b9e2bec184e8a03
demo,serrano.red,6bec692443ad159e5b9e2bec184e8a03

Los demás archivos ddns-start.sh y ddns-stop.sh leerán este archivo y harán su respectiva función.

Este es el contenido de ddns-start.sh:

1
2
3
4
5
6
#!/bin/bash

while IFS=, read -r host domain key; do
        /usr/bin/podman run --name $host.$domain -d -e NC_HOST=$host -e NC_DOMAIN=$
domain -e NC_PASS=$key linuxshots/namecheap-ddns
done < /home/linkmoises/ddns/ddns-registros.txt

Este es el contenido de ddns-stop.sh:

1
2
3
4
5
6
#!/bin/bash

while IFS=, read -r host domain key; do
        /usr/bin/podman stop -t 2 $host.$domain
        /usr/bin/podman rm $host.$domain -f
done < /home/linkmoises/ddns/ddns-registros.txt

Recordar hacer los ajustes según su área de trabajo y asignar permisos usando chmod +x ddns-(script).sh y podemos ejecutarlos individualmente para verificar su funcionamiento.

Creando la unidad de systemd

Nota importante: esta es la parte del tutorial que no funciona.

Una vez comprobado que todos los scripts funcionan, pasamos a crear la unidad de systemd, en /etc/systemd/system/namecheap-ddns.service con nuestro editor de texto favorito con este contenido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=DDNS Podman Container
Wants=network-online.target
After=network-online.target

[Service]
Restart=on-failure
ExecStart=/bin/bash /home/linkmoises/ddns/ddns-start.sh
ExecStop=/bin/bash /home/linkmoises/ddns/ddns-stop.sh
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target

En el supuesto, que la unidad anterior lograra funcionar, como superusuario, actualizamos las unidades de systemd y luego la activamos e iniciamos.

1
2
3
systemctl daemon-reload
systemctl enable namecheap-ddns.service
systemctl start namecheap-ddns.service

Inicialmente la unidad de systemd era más simple, pero trate de generar una con podman generate systemd y modificarla añadiendo algunos de los parámetros de ahí, pero aún así el error consistentemente es el mismo.

1
2
3
ago 02 10:43:59 hobbiton systemd[1]: namecheap-ddns.service: Start request repeated too quickly.
ago 02 10:43:59 hobbiton systemd[1]: namecheap-ddns.service: Failed with result 'protocol'.
ago 02 10:43:59 hobbiton systemd[1]: Failed to start DDNS Podman Container.

Hasta aquí este tutorial, quizás lo retome en algún tiempo buscando algún workaround para ver donde falla systemd ya que me parece que es una solución simple y nítida para gestionar automáticamente registros con DNS dinámicos en un dominio. En su lugar, estaré utilizando el servicio de DDNS de Cloudflare.


Moisés Serrano Samudio Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud. Médico, apasionado del EdTech/eHealth y diseñador/desarrollador de sitios web de salud.
Moisés Serrano Samudio

@linkmoises

Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth.

Entradas relacionadas

Comentarios

Deja una respuesta

Su email no será publicado. Required fields are marked *