Dos nodos de AdGuard Home sincronizados para asegurar DNS redundante y evitar caídas en la resolución de nombres.


A la hora de montar un DNS doméstico o de laboratorio con AdGuard Home, lo más habitual es empezar con un único nodo centralizado. Funciona bien… hasta que ese sistema se reinicia, se actualiza o simplemente falla. En ese momento, toda la red se queda sin resolución de nombres y, por extensión, sin acceso normal a Internet.

En este artículo veremos cómo añadir un segundo nodo de AdGuard Home que funcione de forma independiente, pero sincronizado con el nodo principal (master). La idea es sencilla y muy práctica: disponer de dos resolutores DNS activos, por ejemplo uno en el servidor principal y otro en una Raspberry Pi u otro equipo de bajo consumo, de forma que si el sistema principal cae, la red siga resolviendo DNS con normalidad.

Además de la alta disponibilidad, este enfoque permite:

  • Mantener las mismas listas, reglas y configuraciones en ambos nodos.
  • Evitar configuraciones manuales duplicadas.
  • Mejorar la resiliencia de la red frente a reinicios, mantenimientos o fallos inesperados.

El resultado es una arquitectura DNS más robusta, pensada tanto para entornos domésticos avanzados como para homelabs o pequeñas infraestructuras, donde la continuidad del servicio es clave incluso cuando algo falla.

Usar una Raspberry Pi

Para montar este segundo nodo no necesitamos nada especialmente potente. La idea es utilizar un equipo pequeño, económico y de bajo consumo, que pueda estar encendido 24/7 sin impacto apreciable en la factura eléctrica.

En este tutorial usaremos una Raspberry Pi, pero el proceso es exactamente el mismo si utilizas otro dispositivo similar: una Raspberry Pi 3, una Raspberry Pi Zero / Nano, una Orange Pi o cualquier SBC (Single Board Computer) equivalente.

Lo importante no es el modelo concreto, sino que sea un sistema independiente del nodo principal, capaz de ejecutar AdGuard Home de forma estable y sincronizar su configuración con el nodo master para actuar como DNS secundario en caso de fallo.

💡
En nuestro caso, utilizaremos una Raspberry Pi 4.

Instalar ISO del sistema operativo base

Como que utilizaremos una Raspberry Pi, lo más recomendable es utulizar Raspberry Pi Imager para grabar la ISO de instalación del sistema operativo.

Si esto lo haces desde tu distribución favorita de GNU/Linux:

# Debian y/o Ubuntu
apt install rpi-imager

# Flatpak
flatpak install flathub org.raspberrypi.rpi-imager
flatpak run org.raspberrypi.rpi-imager

Tras su instalación, iniciamos el programa:

Una vez abierto Raspberry Pi Imager, el proceso es muy sencillo. Vamos a repasar las opciones que aparecen y cómo configurarlas para este escenario.

  • Raspberry Pi Device: En Choose device seleccionamos el modelo de Raspberry Pi que vamos a utilizar. Esto permite que el imager aplique automáticamente las configuraciones y compatibilidades correctas para ese hardware.
  • Operating System: Seleccionamos en el desplegable la opción de Other y luego Raspberry Pi OS Lite (64-bit o 32-bit, sin entorno gráfico)
  • Storage: En Choose storage seleccionamos la microSD (o disco USB) donde se grabará el sistema.
⚠️
Asegúrate de elegir el dispositivo correcto, ya que se borrará completamente.

Antes de grabar, Raspberry Pi Imager te ofrecerá configurar algunos valores iniciales. Aquí puedes adaptarlos a tu entorno, pero recomiendo especialmente:

  • Habilitar SSH (muy importante) Para poder administrar la Raspberry Pi remotamente sin necesidad de teclado ni pantalla.
  • Configurar usuario y contraseña.
  • Zona horaria y distribución de teclado.

Iniciamos Raspberry Pi

A continuación lo que haremos será conectar la MicroSD a la Raspberry Pi y la conectamos a la red electrica junto con el cable de internet.

Como que ya usamos Adguard Home, esperaremos a que aparezca como dispositivo nuevo en la red. En un par de minutos veremos el dispositivo en la lista:

Aquí podremos asignarle una IP a través de DHCP (será necesario reiniciar) y un hostname si fuera necesario.

Una vez tengamos la IP configurada correctamente en nuestra Rapsberry Pi, actualizaremos repositorios:

apt update
apt upgrade

Instalación de Adguard Home

El siguiente paso será instalar Adguard Home en la Raspberry Pi. Este proceso es muy sencilla ya que sólo tenemos que ejecutar un comando:

curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

Esperamos a que finalice el proceso y cuando acabe veremos lo siguiente:

2025/11/20 17:37:30 [info] service: AdGuard Home, version v0.107.69
2025/11/20 17:37:30 [info] service: control action=install
2025/11/20 17:37:34 [info] service: started
2025/11/20 17:37:34 [info] service:  line_num=1 line="Almost ready!"
2025/11/20 17:37:34 [info] service:  line_num=2 line="AdGuard Home is successfully installed and will automatically start on boot."
2025/11/20 17:37:34 [info] service:  line_num=3 line="There are a few more things that must be configured before you can use it."
2025/11/20 17:37:34 [info] service:  line_num=4 line="Click on the link below and follow the Installation Wizard steps to finish setup."
2025/11/20 17:37:34 [info] service:  line_num=5 line="AdGuard Home is now available at the following addresses:"
2025/11/20 17:37:34 [info] go to http://127.0.0.1:3000
2025/11/20 17:37:34 [info] go to http://[::1]:3000
2025/11/20 17:37:34 [info] go to http://192.168.1.107:3000

En este punto ya podremos acceder a través del puerto 3000.

Accediendo a través de la interfaz web

Abrimos nuestro navegador y ponemos la IP y el puerto para acceder a Adguard Home:

Le damos a siguiente y configuramos las interfaces. Marcaremos todas las interfaces por el puerto 80:

Luego configuraremos un usuario y contraseña:

Finalmente saldrá las configuraciones que hay que hacer en los diferentes dispositivos, pero no es nuestro caso.

Listo! Ya tenemos acceso a la interfaz de siempre de AdGuard Home:

Configurar la sincronización de AdGuard Home

Para sincronizar el AdGuard Home principal con el secundario, tendremos que usar un contenedor de docker llamado AdGuardHome-Sync:

GitHub - bakito/adguardhome-sync: 🛡️ Synchronize AdGuard Home config to replicas
🛡️ Synchronize AdGuard Home config to replicas. Contribute to bakito/adguardhome-sync development by creating an account on GitHub.

Este servicio viene montado con Docker, por lo que necesitarás usar Docker para hacer la sincronización. Puedes montar este contenedor en una MV dentro de Proxmox (si ya tienes algo con Docker genial), o directamente en el NAS.

Usaremos el fichero compose que viene por defecto para levantarlo, en mi caso he usado Portainer que tengo instalado en mi NAS de Ugreen.

Primer contacto con UGREEN NASync DXP4800
El UGREEN NASync DXP4800 es un NAS versátil basado en Debian 12, con opción de instalar Proxmox y separar datos de tu infraestructura principal.

Para la instalación de Docker

Si necesitáis un tutorial sobre como instalar Docker en alguna distribución de GNU/Linux os dejo este tutorial:

Instalación de Docker en Debian 13
Docker es una aplicación que simplifica el proceso de gestión de los procesos de las aplicaciones en contenedores. Los contenedores le permiten ejecutar sus aplicaciones en procesos aislados de recursos.
💡
Recuerda que este tutorial es para Debian 13, pero dentro del mismo tutorial puedes cambiar las instrucciones para Ubuntu, AlmaLinux, RockyLinux, etc.

Para la instalación de Portainer

Si ya tenéis Docker instalado y queréis usar Portainer, os dejo este otro tutorial:

Instalar Portainer en Ubuntu 24.04
Portainer es una herramienta que ofrece una interfaz de usuario gráfica para facilitar la administración de contenedores, imágenes, redes y volúmenes en Docker, así como despliegues y administración de recursos en Kubernetes.

Configuración del Stack en Portainer

Para crear el stack en Portainer le añadiremos un nombre y usaremos esta configuración:

---
version: "2.1"
services:
  adguardhome-sync:
    image: ghcr.io/bakito/adguardhome-sync
    container_name: adguardhome-sync
    command: run
    environment:
      TZ: Europe/Madrid
      LOG_LEVEL: info
      ORIGIN_URL: http://192.168.1.10
      ORIGIN_USERNAME: t3rr0rz0n3
      ORIGIN_PASSWORD: PASS
      REPLICA1_URL: http://192.168.1.9
      REPLICA1_USERNAME: t3rr0rz0n3
      REPLICA1_PASSWORD: PASS
      CRON: 0 */10 * * *
      RUN_ON_START: "true"
      API_PORT: 8080
    ports:
      - 8080:8080
    restart: unless-stopped

De esta configuración tenemos que tener claro primero las variables que son del AdGuard Home principal:

  • ORIGIN_URL: La IP de acceso al AdGuard Home con HTTP.
  • ORIGIN_USERNAME: Usuario de acceso.
  • ORIGIN_PASSWORD: Contraseña del usuario.

Luego al añadir la replica, que será nuestro AdGuard Home secundario, tendremos que configurar estas otras variables:

  • REPLICA1_URL: La IP de acceso al AdGuard que hemos configurado en Raspberry PI.
  • REPLICA1_USERNAME: Usuario de acceso.
  • REPLICA1_PASSWORD: Contraseña de acceso.
💡
De esta manera podremos añadir varias replicas configuradas. Es decir si queremos tener una segunda replica configurada, deberemos de usar las variables REPLICA2_URL, REPLICA2_USERNAME y REPLICA2_PASSWORD.
💡
Si queréis cambiar el puerto de acceso, podéis hacerlo sin problema. Pero debéis de tener en cuenta que API_PORT y PORTS tienen que ser lo mismo.

Una vez hemos configurado todo, podremos iniciar los contenedores. Inmediatamente revisaremos los logs del contenedor para revisar si funciona correctamente la sincronización:

2025-11-20T18:49:16.158+0100	INFO	sync	sync/sync.go:41	AdGuardHome sync	{"version": "v0.8.2", "build": "2025-10-24T17:14:03Z", "os": "linux", "arch": "amd64"}
2025-11-20T18:49:16.159+0100	INFO	sync	types/features.go:61	Disabled features	{"features": ["TLSConfig"]}
2025-11-20T18:49:16.159+0100	INFO	sync	sync/sync.go:66	Setup cronjob	{"cron": "0 */10 * * *", "next-execution": "2025-11-20T20:00:00.000+0100"}
2025-11-20T18:49:16.159+0100	INFO	sync	sync/http.go:101	Starting API server	{"port": 8081}
2025-11-20T18:49:16.159+0100	INFO	sync	sync/sync.go:88	Running sync on startup
2025-11-20T18:49:16.215+0100	INFO	sync	sync/sync.go:183	Connected to origin	{"from": "192.168.1.10", "version": "v0.107.69"}
2025-11-20T18:49:16.942+0100	INFO	sync	sync/sync.go:291	Start sync	{"from": "192.168.1.10", "to": "192.168.1.9"}
2025-11-20T18:49:17.407+0100	INFO	sync	sync/sync.go:312	Connected to replica	{"from": "192.168.1.10", "to": "192.168.1.9", "version": "v0.107.69"}

AdGuardHome-sync dispone de una interfaz web propia, accesible por defecto a través del puerto 8080. Desde esta interfaz podemos consultar información detallada del estado de la sincronización entre nodos y, si lo necesitamos, forzar una sincronización manual de forma inmediata.

Es especialmente útil para verificar que el nodo secundario está recibiendo correctamente la configuración del principal y para realizar comprobaciones rápidas sin necesidad de usar la línea de comandos.

Si pulsamos sobre el botón Syncronize se iniciará la sincronización y podremos ver en los logs que se están copiando los datos del AdGuard Home principal al secundario:

2025-11-20T18:49:19.466+0100	INFO	client	client/client.go:417	Set dns config list	{"host": "192.168.1.9"}
2025-11-20T18:49:21.713+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "ssl.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:22.635+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "pulse.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:23.515+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "dash.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:24.388+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "ptm.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:25.282+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "frgt.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:26.189+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "mmch.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:27.084+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "dns.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:27.106+0100	INFO	sync	sync/http.go:26	Starting sync from API	{"remote-addr": "192.168.1.44:35684"}
2025-11-20T18:49:27.106+0100	INFO	sync	sync/sync.go:154	Sync already running
2025-11-20T18:49:28.014+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "dckr.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:28.899+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "trrnt.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:29.793+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "upload.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:30.671+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "box.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:31.568+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "s3.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:32.447+0100	INFO	client	client/client.go:205	Add DNS rewrite entry	{"host": "192.168.1.9", "domain": "console.dominio.com", "answer": "192.168.1.11"}
2025-11-20T18:49:33.810+0100	INFO	client	client/client.go:265	Add filter	{"host": "192.168.1.9", "url": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_24.txt", "whitelist": false, "enabled": false}
2025-11-20T18:49:36.180+0100	INFO	client	client/client.go:265	Add filter	{"host": "192.168.1.9", "url": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_70.txt", "whitelist": false, "enabled": false}
2025-11-20T18:49:45.635+0100	INFO	client	client/client.go:265	Add filter	{"host": "192.168.1.9", "url": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_4.txt", "whitelist": false, "enabled": false}

Una vez finalice la sincronización, podremos verificar que el proceso se ha completado correctamente, comprobando que la configuración, listas y reglas del nodo principal se han replicado en el nodo secundario sin errores.

2025-11-20T18:51:05.246+0100	INFO	sync	sync/sync.go:301	Sync done	{"from": "192.168.1.10", "to": "192.168.1.9", "duration": "4.95e-07s"}

Y si volvemos a la interfaz de Adguard Home del secundario podremos observar que tiene la misma configuración y datos que el principal.

Conclusión

Con esta configuración ya disponemos de dos servidores DNS con AdGuard Home, sincronizados entre sí y funcionando de manera independiente. El nodo secundario replica automáticamente la configuración del nodo principal, evitando duplicar tareas y asegurando que ambos mantengan las mismas reglas, listas y políticas.

El principal beneficio de este enfoque es la alta disponibilidad: si el nodo principal se reinicia, se actualiza o deja de funcionar por cualquier motivo, la resolución de nombres continuará sin interrupciones gracias al segundo servidor. De este modo, la red seguirá teniendo acceso a Internet con normalidad, sin cortes ni comportamientos extraños.

En definitiva, pasamos de un único punto de fallo a una infraestructura DNS más robusta y resiliente, ideal tanto para entornos domésticos avanzados como para homelabs, donde la estabilidad y la continuidad del servicio son clave.


Más sobre ./voidNull

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación