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.
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.
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.
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.
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.
@linkmoises
[…] intenté escribir una entrada usando Namecheap, su servicio DDNS y algunas herramientas. Todos los scripts funcionan perfecto excepto porque en tres días explorando opciones no había […]