Cómo instalar AdGuard Home con Docker
Índice de contenidos
- Puntos clave
- ¿Qué es AdGuard Home y cómo bloquea anuncios por DNS?
- ¿Cómo es el docker-compose.yml de AdGuard Home?
- ¿Cómo liberar el puerto 53 ocupado por systemd-resolved?
- ¿Qué hace el asistente de configuración inicial?
- ¿Cómo activar DNS cifrado (DoH, DoT) y reescrituras de dominios?
- ¿AdGuard Home o Pi-hole: cuál elegir?
- Preguntas frecuentes
- ¿Puedo usar AdGuard Home sin cambiar el DNS del router?
- ¿Qué pasa con AdGuard Home si el contenedor se cae?
- ¿Bloquea AdGuard Home los anuncios de YouTube?
- Conclusión
- Fuentes
AdGuard Home es un servidor DNS gratuito y de código abierto que bloquea anuncios y rastreadores en toda tu red desde un único contenedor. Esta guía lo levanta con Docker Compose, resuelve el conflicto del puerto 53, recorre el asistente inicial y activa DNS cifrado y reescrituras de dominios.
Los anuncios y los rastreadores no viven solo en el navegador: están también en el móvil, en la tele y en cada aplicación que se conecta a Internet. AdGuard Home los bloquea de raíz porque actúa como el servidor DNS de toda tu red: cuando un dispositivo pregunta por el dominio de una red publicitaria, AdGuard Home responde que no existe y el anuncio nunca llega a cargarse. En esta guía levantas AdGuard Home con Docker Compose, resuelves el clásico conflicto del puerto 53 en Ubuntu, recorres el asistente de configuración inicial, activas DNS cifrado y reescrituras de dominios, y lo comparas con Pi-hole para decidir cuál te conviene. La misma explicación está disponible en inglés.
Puntos clave
- AdGuard Home es un servidor DNS gratuito y de código abierto con licencia GPL-3.0 que bloquea anuncios y rastreadores en toda la red; su núcleo está escrito en Go y la interfaz web en TypeScript, con unas 35.500 estrellas en GitHub.
- Se despliega con un único contenedor: la imagen oficial
adguard/adguardhomesupera los 100 millones de descargas en Docker Hub, y la última versión estable es la v0.107.78, publicada el 13 de julio de 2026. - El servicio DNS escucha en el puerto 53 (TCP y UDP); el asistente inicial se abre en el puerto 3000 solo la primera vez, y tras la configuración el panel queda en el puerto 80.
- En Ubuntu y Debian el puerto 53 lo ocupa
systemd-resolved, así que hay que liberarlo antes de arrancar el contenedor o el DNS no levantará. - A diferencia de Pi-hole, AdGuard Home es un solo binario en Go que ya trae DNS cifrado (DoH, DoT y DoQ), reescrituras de dominios, control parental y servidor DHCP integrados, sin depender de dnsmasq ni de un servidor web aparte.
¿Qué es AdGuard Home y cómo bloquea anuncios por DNS?
AdGuard Home es, en palabras de su repositorio oficial, "un software para toda la red que bloquea anuncios y rastreo". No es una extensión del navegador ni un programa que instales en cada equipo: es un servidor DNS que colocas en tu red y al que apuntan todos los dispositivos. El DNS es la agenda de Internet, el sistema que traduce un nombre como ejemplo.com en la dirección IP del servidor. AdGuard Home se pone en medio de esa consulta: mantiene listas de dominios de publicidad y rastreo, y cuando un dispositivo pregunta por uno de ellos, responde con una dirección vacía en lugar de la real. El resultado es que el anuncio, el pixel de seguimiento o el dominio de telemetría nunca llegan a descargarse.
La gran ventaja de bloquear por DNS es que protege a toda la red a la vez: el portátil, el móvil, la tableta, la televisión inteligente y los electrodomésticos conectados, sin instalar nada en cada uno. Basta con que el router entregue la IP de AdGuard Home como servidor DNS. Es el mismo principio en el que se basa Pi-hole, su alternativa más conocida. Frente a él, AdGuard Home destaca por integrar en un solo binario funciones que en Pi-hole requieren piezas o plugins adicionales: DNS cifrado, un panel de estadísticas moderno, control parental, navegación segura y reescrituras de dominios.
¿Cómo es el docker-compose.yml de AdGuard Home?
AdGuard Home no necesita base de datos externa: guarda toda su configuración en un fichero YAML y sus estadísticas en dos volúmenes. Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Se fija la versión v0.107.78 en lugar de :latest, porque una etiqueta flotante puede cambiar de versión en un simple reinicio y dejarte sin control sobre lo que ejecutas:
services:
adguardhome:
image: adguard/adguardhome:v0.107.78
container_name: adguardhome
restart: unless-stopped
volumes:
- adguard_work:/opt/adguardhome/work
- adguard_conf:/opt/adguardhome/conf
ports:
- "53:53/tcp"
- "53:53/udp"
- "3000:3000/tcp"
- "80:80/tcp"
- "443:443/tcp"
- "853:853/tcp"
volumes:
adguard_work:
adguard_conf:
Los dos volúmenes son la clave de la persistencia: /opt/adguardhome/conf guarda el fichero AdGuardHome.yaml con toda la configuración, y /opt/adguardhome/work almacena las estadísticas, el registro de consultas y las listas de bloqueo descargadas. Los puertos cumplen cada uno su función: el 53 es el DNS (lo esencial), el 3000 es el asistente de la primera vez, el 80 es el panel una vez configurado, y el 443 y el 853 solo hacen falta si vas a ofrecer DNS cifrado (DoH y DoT), que veremos más abajo. Si no piensas usar DNS cifrado ni el servidor DHCP, puedes quitar las líneas del 443 y el 853 para reducir la superficie expuesta.
La imagen oficial se distribuye como un binario mínimo sin intérprete de comandos, así que no incluye un healthcheck integrado ni admite comprobaciones del tipo CMD-SHELL. Para vigilarlo desde fuera, AdGuard Home reserva el dominio especial healthcheck.adguardhome.test, que devuelve una respuesta NODATA cuando el servidor DNS está sano; puedes consultarlo desde un monitor externo. Antes de arrancar, sin embargo, hay que resolver un conflicto muy habitual con el puerto 53.
¿Cómo liberar el puerto 53 ocupado por systemd-resolved?
En Ubuntu y Debian modernos, el servicio systemd-resolved ya escucha en el puerto 53 para gestionar el DNS del sistema. Si arrancas el contenedor sin más, Docker fallará con un error del estilo address already in use. La solución es desactivar solo el "escuchador" local de systemd-resolved, sin romper la resolución de nombres del propio servidor. Edita (o crea) el fichero /etc/systemd/resolved.conf, deja estas dos líneas y reinicia el servicio:
sudo mkdir -p /etc/systemd/resolved.conf.d
echo -e "[Resolve]\nDNSStubListener=no" | sudo tee /etc/systemd/resolved.conf.d/adguard.conf
sudo rm -f /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved
Con DNSStubListener=no liberas el puerto 53 y con el enlace simbólico haces que el sistema siga resolviendo nombres a través de systemd-resolved por su socket interno. Comprueba que el puerto está libre con sudo ss -tulpn | grep :53 (no debería devolver nada) y arranca el contenedor:
mkdir -p adguardhome && cd adguardhome
docker compose up -d
docker compose ps
docker compose logs -f adguardhome
Si el contenedor se queda reiniciándose, casi siempre es porque el 53 sigue ocupado; revisa de nuevo la salida de ss. Si necesitas repasar la instalación del motor, tienes la guía de cómo instalar Docker en Ubuntu 24.04; y si quieres entender por qué el contenedor publica sus puertos en el host, te ayudará la guía de redes en Docker: bridge, host y redes personalizadas.
¿Qué hace el asistente de configuración inicial?
Con el contenedor en marcha, abre http://IP-DEL-SERVIDOR:3000 en el navegador. La primera vez aparece un asistente de tres pasos. En el primero eliges las interfaces y los puertos: deja el panel de administración en el puerto 80 y el servidor DNS en el 53. En el segundo creas el usuario administrador con su contraseña. El tercero te muestra cómo configurar los dispositivos, y al terminar el asistente el puerto 3000 deja de usarse: a partir de ahí entras al panel por http://IP-DEL-SERVIDOR (puerto 80).
Dentro del panel tienes un cuadro de mando con el porcentaje de consultas bloqueadas, las estadísticas por dominio y por cliente, y el registro de consultas en tiempo real. En Ajustes → Listas de bloqueo puedes añadir listas adicionales; AdGuard Home viene con su propia lista de filtros base, pero puedes sumar otras muy conocidas para ampliar la cobertura. El paso final, y el más importante, es decirle a tu red que use AdGuard Home: en la configuración DNS de tu router, sustituye el servidor DNS por la IP de la máquina donde se ejecuta el contenedor. Así, cada dispositivo que se conecte por DHCP recibirá AdGuard Home como resolutor sin tocar nada en él.
¿Cómo activar DNS cifrado (DoH, DoT) y reescrituras de dominios?
Por defecto, las consultas DNS viajan en texto claro por el puerto 53, de modo que tu operador puede verlas. AdGuard Home puede además actuar como servidor de DNS cifrado para tus propios dispositivos: DNS sobre HTTPS (DoH, puerto 443), DNS sobre TLS (DoT, puerto 853) y DNS sobre QUIC (DoQ, puerto 853/UDP). Para activarlo necesitas un certificado TLS válido para tu dominio; lo habitual es ponerlo detrás de un proxy inverso que gestione los certificados, como Nginx Proxy Manager para el panel, y abrir los puertos 443 y 853 (ya incluidos en el docker-compose.yml) para el tráfico DNS cifrado. En Ajustes → Configuración de cifrado subes el certificado y la clave y activas los protocolos que quieras.
Aparte del cifrado, una función muy práctica son las reescrituras de DNS (DNS rewrites). Te permiten responder con una IP concreta a los dominios que tú decidas, sin montar un servidor DNS aparte. Es ideal para dar nombres bonitos a tus servicios internos: puedes hacer que nas.midominio.local apunte a la IP de tu servidor, o que todos los subdominios de *.casa.midominio.com resuelvan a la IP de tu proxy inverso. Se configuran en Filtros → Reescrituras de DNS y evitan tener que editar el fichero hosts de cada equipo.
¿AdGuard Home o Pi-hole: cuál elegir?
Ambos bloquean anuncios por DNS y ambos funcionan de maravilla en un contenedor, así que la elección depende de los detalles. AdGuard Home es un único binario en Go: el servidor DNS, el panel web y las estadísticas van juntos en la misma imagen, y toda la configuración vive en un solo fichero YAML. Pi-hole, en cambio, combina dnsmasq (el DNS), lighttpd (el servidor web) y PHP (el panel) dentro del contenedor. Esa diferencia de arquitectura explica por qué AdGuard Home trae de fábrica cosas que en Pi-hole requieren pasos extra: DNS cifrado (DoH, DoT, DoQ), control parental, navegación segura, listas por cliente y reescrituras de dominios, todo desde la propia interfaz.
Pi-hole, por su parte, tiene una comunidad enorme, más años de rodaje y un ecosistema muy amplio de listas y extensiones. Si vienes de Pi-hole y te sientes cómodo con él, no hay ninguna urgencia por cambiar. Si empiezas de cero y quieres DNS cifrado y una interfaz moderna sin instalar nada extra, AdGuard Home es la opción más completa. Como los dos usan el puerto 53, no pueden convivir en la misma máquina sin ajustes: elige uno. Puedes leer la guía equivalente de cómo instalar Pi-hole con Docker para comparar la instalación de ambos en detalle.
Preguntas frecuentes
¿Puedo usar AdGuard Home sin cambiar el DNS del router?
Sí, pero pierdes la mayor ventaja. Si no puedes tocar el router, configura AdGuard Home como DNS manualmente en cada dispositivo que quieras proteger (en los ajustes de red del móvil, el portátil o la televisión). El bloqueo funcionará igual, pero solo en los equipos que hayas configurado a mano. Lo ideal es cambiarlo una sola vez en el router para que todos los dispositivos que se conecten por DHCP hereden AdGuard Home automáticamente, sin configuración individual.
¿Qué pasa con AdGuard Home si el contenedor se cae?
Que tu red se queda sin DNS y deja de resolver nombres, es decir, sin Internet aparente. Por eso conviene dejar restart: unless-stopped en el docker-compose.yml, para que Docker vuelva a levantar el contenedor tras un fallo o un reinicio del servidor. Como red de seguridad, configura en tu router un segundo servidor DNS (por ejemplo 1.1.1.1 o 9.9.9.9): si AdGuard Home no responde, los dispositivos usarán el secundario y seguirás navegando, aunque sin bloqueo de anuncios mientras dure la caída.
¿Bloquea AdGuard Home los anuncios de YouTube?
En parte y con limitaciones. El bloqueo por DNS actúa sobre dominios completos, y YouTube sirve sus anuncios desde los mismos dominios que los vídeos, así que no puede distinguir unos de otros sin romper la reproducción. AdGuard Home bloquea bien los rastreadores y la publicidad de la mayoría de webs y aplicaciones, pero los anuncios integrados en el propio streaming de YouTube se le escapan. Para eso hacen falta soluciones dentro de cada dispositivo, como un bloqueador en el navegador.
Conclusión
AdGuard Home es la forma más completa de bloquear anuncios y rastreadores en toda tu red desde un único contenedor. Con un docker-compose.yml de un solo servicio, dos volúmenes y el puerto 53 liberado de systemd-resolved, levantas un servidor DNS con panel de estadísticas, DNS cifrado y reescrituras de dominios en cuestión de minutos. El paso decisivo es apuntar el DNS de tu router a la IP del contenedor: a partir de ahí, cada dispositivo de tu casa navega sin publicidad sin instalar nada. Si dudas entre esta herramienta y su alternativa clásica, compara la instalación con la de Pi-hole antes de decidir.
Fuentes
Código fuente
Accede a todo el código fuente de este artículo en GitHub.
Ver en GitHub