Redes y seguridad
AdGuard Home en Docker: sin publicidad en toda la casa y tus subdominios en local
8 min de lectura
Puntos clave
- AdGuard Home en Docker con red de host y el panel en el puerto 3100.
- Pocas listas de bloqueo bien elegidas: más listas significa más falsos positivos.
- DNS de subida cifrado (DoH/DoT) y caché para que la navegación vaya más rápida.
- Una reescritura comodín resuelve tus subdominios hacia el NAS y evita el problema del hairpin NAT.
- Ojo con Firefox y su DNS over HTTPS propio: se salta AdGuard si no lo desactivas.
Durante un tiempo usé Pi-hole para quitar la publicidad de la red de casa. Funcionaba, pero cuando empecé a publicar servicios con mi propio dominio necesitaba algo más: DNS cifrado hacia fuera y una forma sencilla de resolver mis subdominios dentro de casa. AdGuard Home trae las dos cosas de serie, así que lo sustituí.
Lo mejor no fue el bloqueo de anuncios. Fue que, gracias a una sola regla, mis subdominios empezaron a funcionar dentro de casa igual que desde fuera. Te cuento cómo.
Qué vas a montar
- AdGuard Home en Docker, como servidor DNS de toda la casa.
- Listas de bloqueo, DNS de subida cifrado y caché.
- Una reescritura DNS comodín para que tus subdominios apunten al NAS.
- El panel de administración solo accesible desde casa o la VPN, detrás de Caddy.
Requisitos
- Docker y Docker Compose en el NAS.
- El puerto 53 libre en el NAS (es el puerto del DNS).
- Acceso a la configuración DHCP de tu router.
En los ejemplos, 192.168.1.10 es la IP de tu NAS. Es un valor de ejemplo: usa la tuya. Y dale al NAS una IP fija (reserva DHCP en el router): si cambia, toda la casa se queda sin DNS.
Paso 1: el docker-compose.yml
Crea una carpeta para AdGuard Home y dentro este archivo:
services:
adguardhome:
image: adguard/adguardhome:v0.107.52 # fija una versión v0.107.x concreta
container_name: adguardhome
network_mode: host # ve las IP reales de cada dispositivo
command:
- "--no-check-update" # las actualizaciones, cambiando la imagen
- "-c"
- "/opt/adguardhome/conf/AdGuardHome.yaml"
- "-w"
- "/opt/adguardhome/work"
- "--web-addr"
- "0.0.0.0:3100" # el 3000 suele estar ocupado
volumes:
- ./work:/opt/adguardhome/work # estadísticas y registro de consultas
- ./conf:/opt/adguardhome/conf # configuración (AdGuardHome.yaml)
restart: unless-stopped
Por qué así:
network_mode: host. El DNS usa el puerto 53 por UDP y TCP. Con red de host no hay que publicar puertos y, además, AdGuard ve la IP real de cada dispositivo. Así las estadísticas dicen “el móvil” y no “el contenedor”.--web-addr 0.0.0.0:3100. El panel usa por defecto el 3000, que en mi NAS ya estaba ocupado. Lo muevo al 3100.- Repito
-cy-w. Al definircommandsustituyes los argumentos por defecto de la imagen. Si solo pones--web-addr, la configuración se guardaría fuera de los volúmenes y la perderías al recrear el contenedor.
Arranca el contenedor:
docker compose up -d
docker logs --tail 20 adguardhome
Paso 2: el asistente inicial
Abre http://192.168.1.10:3100 en el navegador. La primera vez aparece un asistente de pocos pasos:
- Interfaces y puertos. Deja el panel en el puerto 3100 y el DNS en el 53, escuchando en todas las interfaces.
- Usuario y contraseña del panel. Usa una contraseña fuerte y única.
- Configurar dispositivos. Te enseña cómo apuntar los equipos al nuevo DNS. Lo haremos para toda la casa en el paso 4.
- Termina y entra al panel.
Paso 3: listas, DNS cifrado y caché
Listas de bloqueo
La lista AdGuard DNS filter viene activada y cubre lo principal. Yo añado una o dos más desde la lista integrada de la sección de filtros (por ejemplo, una de las de HaGeZi u OISD). No te pases: cada lista extra añade falsos positivos, y acabarás con webs de bancos o tiendas que no cargan sin saber por qué.
DNS de subida cifrado
AdGuard necesita preguntar a otro servidor lo que no sabe. Por defecto lo hace sin cifrar, y tu proveedor de Internet puede ver cada dominio que visitas. En la configuración DNS, en los servidores de subida, uso DNS over HTTPS (DoH) o DNS over TLS (DoT):
https://dns.quad9.net/dns-query
tls://dns.quad9.net
https://cloudflare-dns.com/dns-query
Con eso, desde tu casa hacia fuera todas las consultas DNS van cifradas.
Caché
En la misma pantalla está la caché de DNS. Actívala (viene activa) y dale un tamaño razonable. Las respuestas repetidas salen del NAS en milisegundos, sin volver a preguntar fuera.
Paso 4: que lo use toda la casa
Hay dos formas:
- Toda la red (recomendado). En el router, en la configuración DHCP, pon la IP del NAS (
192.168.1.10) como servidor DNS. Cada dispositivo que se conecte recibirá ese DNS sin configurar nada. Puede que tengas que reconectar los equipos para que lo cojan. - Por dispositivo. Cambias el DNS a mano en cada equipo. Útil para probar antes de aplicarlo a todos.
El compromiso del DNS secundario
Si el NAS se apaga, la red se queda sin DNS: nada carga. La tentación es poner un DNS secundario público en el router. Pero los dispositivos no usan el secundario solo como reserva: muchos reparten las consultas entre los dos. Parte del tráfico se saltará el bloqueo.
Mis opciones: aceptar ese compromiso (menos bloqueo, más tolerancia a fallos) o montar una segunda instancia de AdGuard Home en otro equipo y poner las dos.
El truco que me arregló los subdominios: reescrituras DNS
Este es el problema que me costó tiempo. Desde fuera de casa, app.example.com funcionaba. Desde dentro, no cargaba.
La causa es el hairpin NAT: el dominio apunta a tu IP pública, y muchos routers no permiten que un dispositivo de dentro salga hacia la IP pública y vuelva a entrar a la propia red.
La solución fue una sola regla en AdGuard. En la sección Reescrituras DNS añado:
| Dominio | Respuesta |
|---|---|
*.example.com |
192.168.1.10 |
example.com |
192.168.1.10 |
El comodín cubre todos los subdominios; el dominio raíz necesita su propia línea. Desde ese momento, dentro de casa y por la VPN (si tu VPN usa AdGuard como DNS), los subdominios resuelven directamente a la IP del NAS y llegan al proxy sin salir a Internet. Más rápido y sin depender del router.
Ojo: para que funcione, el proxy tiene que responder en el puerto 443 de esa IP. Si tu proxy escucha en otro puerto (como el 8443 del capítulo anterior), revisa cómo llega el tráfico interno a él.
Trampas que conviene conocer
Firefox se salta AdGuard
Firefox puede usar su propio DNS over HTTPS, directamente contra un proveedor externo. Si lo tiene activo, ni ve tus bloqueos ni tus reescrituras. Para desactivarlo, escribe about:config en la barra de direcciones y cambia:
network.trr.mode = 5
El valor 5 significa “DoH desactivado por decisión del usuario”. Otros navegadores y algunos dispositivos tienen una opción parecida de “DNS seguro”: revísala si un equipo se salta el bloqueo.
El panel, solo desde casa
El panel de AdGuard controla el DNS de toda tu red: no debe estar en Internet. Lo publico detrás de Caddy con el snippet internal_only del capítulo anterior:
adguard.example.com {
import internal_only
import security_headers
reverse_proxy localhost:3100
}
Dos cosas más: cambia la contraseña si usaste una débil en el asistente, y no subas AdGuardHome.yaml a un repositorio público. Contiene el hash de tu contraseña.
Cómo comprobar que funciona
Desde cualquier ordenador de casa, pregunta por un dominio de publicidad conocido:
nslookup doubleclick.net 192.168.1.10
Si la respuesta es 0.0.0.0, AdGuard lo está bloqueando. Prueba también uno de tus subdominios:
nslookup app.example.com 192.168.1.10
Debe devolver la IP del NAS. Después, en el panel:
- El registro de consultas muestra cada petición, qué dispositivo la hizo y si se bloqueó.
- La pantalla principal muestra el porcentaje de consultas bloqueadas. En una casa normal es fácil ver un porcentaje de dos cifras.
El compose completo
services:
adguardhome:
image: adguard/adguardhome:v0.107.52
container_name: adguardhome
network_mode: host
command:
- "--no-check-update"
- "-c"
- "/opt/adguardhome/conf/AdGuardHome.yaml"
- "-w"
- "/opt/adguardhome/work"
- "--web-addr"
- "0.0.0.0:3100"
volumes:
- ./work:/opt/adguardhome/work
- ./conf:/opt/adguardhome/conf
restart: unless-stopped
Problemas frecuentes
| Síntoma | Causa probable | Solución |
|---|---|---|
| El contenedor no arranca: puerto 53 en uso | Otro servicio DNS en el NAS | Detén ese servicio o cambia su puerto |
| El panel no abre en el 3100 | command sin --web-addr o puerto ocupado |
Revisa docker logs adguardhome |
| La configuración se pierde al recrear | command sin -c ni -w |
Usa el command completo del compose |
| Un equipo sigue viendo anuncios | DNS propio del navegador o del dispositivo | network.trr.mode = 5 en Firefox; revisa el “DNS seguro” |
| Una web legítima no carga | Falso positivo de una lista | Registro de consultas → desbloquear ese dominio |
| Mis subdominios no cargan dentro de casa | Hairpin NAT | Reescritura *.example.com → IP del NAS |
Conclusión
AdGuard Home es de lo que más se nota en casa: menos anuncios, menos rastreo y DNS cifrado hacia fuera. Pero lo que más me ha servido es la reescritura comodín: con una regla, todos mis servicios funcionan igual dentro y fuera de casa.
En el próximo capítulo monto Uptime Kuma para vigilar que todo esto sigue en pie y enseñar su estado en tiempo real en mi portfolio.
Preguntas frecuentes
¿AdGuard Home o Pi-hole?
Los dos cumplen. Yo cambié a AdGuard Home porque trae DNS cifrado de subida, reescrituras DNS y una interfaz cómoda sin instalar nada más.
¿Qué pasa si se apaga el NAS?
Si AdGuard es el único DNS, la red se queda sin resolver nombres. Puedes poner un DNS secundario en el router, sabiendo que parte del tráfico se saltará el bloqueo, o montar una segunda instancia.
¿Bloquea la publicidad de YouTube?
No de forma fiable. YouTube sirve los anuncios desde los mismos dominios que los vídeos, así que un bloqueador DNS no puede separarlos.
Fuentes
Proyecto relacionado
Infraestructura Pesoz
Homelab self-hosted en producción 24/7: un NAS Synology con ~30 servicios en Docker tras Caddy + CrowdSec y un portátil con GPU como servidor de IA y observabilidad en k3s. VPN WireGuard, GitOps con Forgejo y estado en vivo con Uptime Kuma.




