AdGuard Home es un servidor DNS de código abierto que bloquea publicidad, rastreadores y dominios maliciosos para todos los dispositivos que lo usen. Se distribuye como un único binario con panel web propio y soporta de serie DNS cifrado: puede consultar a sus servidores de origen por DNS-over-HTTPS y también servir DNS-over-HTTPS (DoH) y DNS-over-TLS (DoT) a tus dispositivos. En este tutorial lo instalarás en Ubuntu 24.04, lo protegerás para que solo lo usen tus clientes, configurarás filtros y activarás DoH y DoT con un certificado de Let's Encrypt.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS y una IP fija, por ejemplo un VPS de CubePath, con al menos 512 MB de RAM.
- Un usuario no root con privilegios
sudo. - La IP pública de tu casa u oficina, que en los ejemplos aparece como
your_home_ip. La del servidor aparece comoyour_server_ip. - Para la parte de DoH y DoT: un subdominio como
dns.your_domaincon un registro A que apunte ayour_server_ip.
Advertenciano dejes el puerto 53 abierto a todo Internet. Un resolvedor DNS abierto se usa para ataques de amplificación. En esta guía el DNS sin cifrar solo se permite desde
your_home_ip.
Paso 1: Instalar AdGuard Home
El método oficial es el script de instalación del proyecto, que descarga la última versión estable en /opt/AdGuardHome y crea el servicio de systemd. Descárgalo y revísalo antes de ejecutarlo:
curl -fsSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh -o install.sh
less install.sh
Ejecútalo con la opción -v para ver lo que hace. El script pide la contraseña de sudo cuando la necesita:
sh install.sh -v
Al terminar muestra la URL del asistente inicial en el puerto 3000. Todavía no lo abras: antes hay que liberar el puerto 53. Comprueba el servicio:
systemctl status AdGuardHome --no-pager
La salida debe indicar active (running).
Paso 2: Liberar el puerto 53
systemd-resolved ocupa el puerto 53 en 127.0.0.53, lo que impide a AdGuard Home escuchar en todas las interfaces. Desactiva su stub listener y haz que el propio servidor use AdGuard Home como DNS:
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/adguardhome.conf
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
Sustituye /etc/resolv.conf por el fichero que genera systemd-resolved con los servidores reales y reinicia el servicio:
sudo mv /etc/resolv.conf /etc/resolv.conf.backup
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl reload-or-restart systemd-resolved
Comprueba que ya no hay nada escuchando en el puerto 53:
sudo ss -lntup 'sport = :53'
El comando no debe devolver ningún socket. El servidor no podrá resolver nombres hasta que termines el asistente del paso 4 y AdGuard Home empiece a escuchar en el puerto 53.
Paso 3: Configurar el firewall
Permite SSH y el DNS sin cifrar solo desde tu IP. El panel web no se abre: lo usarás a través de un túnel SSH.
sudo ufw allow OpenSSH
sudo ufw allow from your_home_ip to any port 53
sudo ufw enable
sudo ufw status
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
53 ALLOW your_home_ip
Paso 4: Completar el asistente inicial
Desde tu equipo, abre un túnel SSH hacia el puerto 3000 del servidor:
ssh -L 3000:127.0.0.1:3000 your_user@your_server_ip
Con la sesión abierta, entra en http://localhost:3000 y sigue el asistente:
- Admin Web Interface: deja All interfaces y cambia el puerto a
8080. Así los puertos 80 y 443 quedan libres para el certificado y para DoH. - DNS server: All interfaces, puerto
53. - Crea el usuario administrador con una contraseña larga.
Cuando termine, el asistente se cierra y el panel pasa al puerto 8080. Cierra el túnel y abre uno nuevo:
ssh -L 8080:127.0.0.1:8080 your_user@your_server_ip
Entra en http://localhost:8080 con el usuario que has creado. La configuración queda guardada en /opt/AdGuardHome/AdGuardHome.yaml. Es preferible cambiarla desde el panel: si editas el YAML a mano, detén antes el servicio con sudo systemctl stop AdGuardHome.
Paso 5: Verificar el bloqueo
Desde un equipo de tu casa u oficina, consulta un dominio normal y otro de publicidad:
dig @your_server_ip cubepath.com +short
dig @your_server_ip doubleclick.net +short
<IP de cubepath.com>
0.0.0.0
AdGuard Home responde 0.0.0.0 a los dominios bloqueados. En el panel, Query Log muestra ambas consultas, con la segunda marcada como bloqueada por la lista AdGuard DNS filter, que viene activada por defecto.
Paso 6: Configurar los servidores de origen y el acceso
En Settings > DNS settings, sección Upstream DNS servers, define a quién reenvía AdGuard Home las consultas que no bloquea. Usar DoH hacia el origen cifra también ese tramo:
https://dns.quad9.net/dns-query
https://cloudflare-dns.com/dns-query
En Bootstrap DNS servers pon resolvedores con IP, que AdGuard Home usa solo para resolver los nombres de los servidores DoH anteriores:
9.9.9.9
1.1.1.1
Pulsa Test upstreams y después Apply.
En la misma página, Access settings > Allowed clients limita quién puede usar el servidor. Añade your_home_ip y guarda. Es una segunda barrera además de UFW, y será la única en el paso 9, cuando abras los puertos de DoH y DoT a Internet.
Paso 7: Añadir listas de bloqueo y reglas propias
En Filters > DNS blocklists, pulsa Add blocklist > Choose from the list y activa las listas que quieras del catálogo integrado, por ejemplo una de HaGeZi para publicidad y rastreo y una de malware. Cuantas más listas, más riesgo de bloquear algo legítimo; empieza con pocas.
En Filters > Custom filtering rules puedes escribir reglas propias, una por línea:
! Bloquea un dominio y todos sus subdominios
||telemetry.example.com^
! Permite un dominio aunque esté en una lista de bloqueo
@@||cdn.example.com^
! Bloquea por expresión regular
/^ads\./
! Responde con una IP fija (sintaxis de /etc/hosts)
10.0.0.10 nas.internal
Las líneas que empiezan por ! son comentarios. Guarda con Apply y comprueba con dig @your_server_ip telemetry.example.com +short, que debe devolver 0.0.0.0.
Para saber por qué se bloquea un dominio concreto, usa Filters > Custom filtering rules > Check the filtering, que indica qué regla y qué lista lo afectan.
Paso 8: Ajustes por cliente
En Settings > Client settings puedes registrar cada dispositivo por IP y aplicarle ajustes distintos de los globales: activar el control parental, forzar la búsqueda segura o bloquear servicios concretos (redes sociales, plataformas de vídeo o juegos) en la pestaña Blocked services. Si todos tus dispositivos salen a Internet con la misma IP pública, AdGuard Home no puede distinguirlos por IP; en ese caso usa los ClientID del paso 9.
Paso 9: Activar DNS-over-HTTPS y DNS-over-TLS
Con DoH y DoT tus dispositivos pueden usar AdGuard Home desde cualquier red, con las consultas cifradas. Primero necesitas un certificado válido para dns.your_domain.
Abre el puerto 80 para la validación de Let's Encrypt y los puertos de DNS cifrado:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 853/tcp
Instala Certbot y solicita el certificado. El modo standalone levanta un servidor web temporal en el puerto 80, que está libre porque el panel usa el 8080:
sudo apt update
sudo apt install certbot
sudo certbot certonly --standalone -d dns.your_domain \
--deploy-hook "systemctl restart AdGuardHome"
El --deploy-hook se guarda en la configuración de renovación, así que AdGuard Home se reinicia y carga el certificado nuevo cada vez que Certbot lo renueva. El temporizador certbot.timer se encarga de las renovaciones.
Ahora, en el panel, ve a Settings > Encryption settings:
- Marca Enable Encryption (HTTPS, DNS-over-HTTPS, and DNS-over-TLS).
- Server name:
dns.your_domain. - HTTPS port:
443. DNS-over-TLS port:853. - En Certificates, elige Set a certificates file path y escribe
/etc/letsencrypt/live/dns.your_domain/fullchain.pem. - En Private key, elige Set a private key file y escribe
/etc/letsencrypt/live/dns.your_domain/privkey.pem. - Pulsa Save configuration.
El servicio de AdGuard Home se ejecuta como root, así que puede leer los certificados directamente en /etc/letsencrypt.
Importantecon el cifrado activado, el panel de administración también es accesible en
https://dns.your_domain. Usa una contraseña robusta para el usuario administrador.
Como abriste DoH y DoT a Internet, la lista Allowed clients del paso 6 es ahora lo que impide que cualquiera use tu servidor. Para autorizar dispositivos con IP variable, usa un ClientID: un identificador que el dispositivo envía en la URL de DoH. Añade por ejemplo my-phone a Allowed clients y configura ese dispositivo con la URL:
https://dns.your_domain/dns-query/my-phone
Probar DoT y DoH
Instala kdig en tu equipo y lanza una consulta por DoT desde tu IP autorizada:
sudo apt install knot-dnsutils
kdig @dns.your_domain +tls-ca +tls-hostname=dns.your_domain cubepath.com
La respuesta debe incluir ;; TLS session (TLS1.3) y una sección ANSWER con la IP. Para DoH, envía con curl la consulta de ejemplo del RFC 8484 (el registro A de www.example.com codificado en base64url), usando el ClientID autorizado:
curl -s -o /dev/null -w '%{http_code}\n' \
-H 'accept: application/dns-message' \
'https://dns.your_domain/dns-query/my-phone?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'
200
Configurar los clientes
- Firefox: Ajustes > Privacidad y seguridad > DNS sobre HTTPS > Protección máxima > Personalizado, con la URL
https://dns.your_domain/dns-query/my-phone. - Chrome y Edge: Configuración > Privacidad y seguridad > Seguridad > Usar DNS seguro > Personalizado, con la misma URL.
- Windows 11 y macOS/iOS: admiten DoH a nivel de sistema; en Apple se configura con un perfil
.mobileconfig. En Setup guide del panel encontrarás las instrucciones para cada plataforma.
Mantenimiento
Cuando haya una versión nueva, el panel muestra un aviso con un botón para actualizar. Revisa los logs del servicio si algo falla:
sudo journalctl -u AdGuardHome -n 100 --no-pager
Haz copia de seguridad del fichero /opt/AdGuardHome/AdGuardHome.yaml, que contiene toda la configuración (usuarios, listas, reglas y clientes).
Solución de problemas
- AdGuard Home no arranca con "address already in use" en el puerto 53:
systemd-resolvedsigue escuchando. Revisa el paso 2 y comprueba consudo ss -lntup 'sport = :53'. - Un cliente no obtiene respuesta: comprueba que su IP o ClientID figura en Allowed clients y, para DNS sin cifrar, que su IP coincide con la regla de UFW.
- Certbot falla en la validación: el registro A de
dns.your_domaindebe apuntar ayour_server_ipy el puerto 80 debe estar libre y abierto en UFW. - Una web ha dejado de funcionar: busca en Query Log los dominios bloqueados de ese cliente y añade una regla
@@||dominio^para permitir el necesario.
Conclusión
AdGuard Home ya filtra publicidad y rastreadores, consulta a sus servidores de origen de forma cifrada y sirve DNS-over-HTTPS y DNS-over-TLS a tus dispositivos, limitado a los clientes que has autorizado. Como siguientes pasos puedes instalar Unbound en el mismo servidor y usarlo como servidor de origen para resolver sin depender de terceros, o crear perfiles por cliente con control parental para los dispositivos de casa.
