Pi-hole es un servidor DNS que bloquea publicidad, rastreadores y dominios maliciosos para todos los dispositivos que lo usen, sin instalar nada en cada navegador. Cuando un dispositivo pregunta por un dominio de una lista de bloqueo, Pi-hole responde con 0.0.0.0 y la petición nunca sale. En este tutorial instalarás Pi-hole 6 en un servidor con Ubuntu 24.04, lo protegerás para que solo lo usen tus dispositivos, gestionarás listas de bloqueo y excepciones y configurarás los clientes.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS y una IP fija, por ejemplo un VPS de CubePath. Basta con 1 vCPU y 512 MB de RAM.
- Un usuario no root con privilegios
sudo. - La IP pública desde la que se conectarán tus dispositivos (la de tu casa u oficina), que en los ejemplos aparece como
your_home_ip. La IP del servidor aparece comoyour_server_ip.
Advertenciasi el servidor tiene IP pública, no dejes el puerto 53 abierto a todo Internet. Un resolvedor DNS abierto se usa para ataques de amplificación. En esta guía solo se permite el acceso desde
your_home_ip. Si tus dispositivos cambian de IP a menudo (móviles), conéctalos al servidor por una VPN como WireGuard y usa Pi-hole a través de ella.
Paso 1: Descargar y ejecutar el instalador
Pi-hole se instala con su propio script, que es el método oficial. Descárgalo primero para poder revisarlo antes de ejecutarlo como root:
curl -sSL https://install.pi-hole.net -o basic-install.sh
less basic-install.sh
Ejecútalo:
sudo bash basic-install.sh
El asistente te pedirá varias opciones. Estas son razonables para un servidor:
- Interface: la interfaz con la IP pública (normalmente
eth0oens3). - Upstream DNS Provider: el resolvedor al que Pi-hole reenviará las consultas que no bloquee, por ejemplo Cloudflare o Quad9.
- Blocklists: acepta la lista por defecto (StevenBlack's Unified Hosts List).
- Query logging y privacy mode: activa el registro con el nivel de privacidad que prefieras; se puede cambiar después.
Si systemd-resolved ocupa el puerto 53, el instalador desactiva su stub listener automáticamente creando /etc/systemd/resolved.conf.d/90-pi-hole-disable-stub-listener.conf.
Al terminar, el instalador muestra la URL del panel y una contraseña generada. Comprueba que el servicio está en marcha:
sudo pihole status
[✓] FTL is listening on port 53
[✓] UDP (IPv4)
[✓] TCP (IPv4)
[✓] UDP (IPv6)
[✓] TCP (IPv6)
[✓] Pi-hole blocking is enabled
Paso 2: Establecer la contraseña del panel
Cambia la contraseña generada por una tuya:
sudo pihole setpassword
El comando la pide de forma interactiva, así que no queda en el historial de la shell.
Paso 3: Permitir consultas desde tus dispositivos
Pi-hole 6 arranca en modo de escucha LOCAL: solo responde a equipos de las subredes conectadas directamente al servidor. Es un valor seguro para una red doméstica, pero en un VPS tus dispositivos están en otra red y sus consultas se ignorarían. Cambia el modo a ALL:
sudo pihole-FTL --config dns.listeningMode ALL
A partir de ahora el filtrado lo hace el firewall. Activa UFW permitiendo SSH y el puerto 53 solo desde tu IP:
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
El panel web de Pi-hole escucha en los puertos 80 y 443, pero no los abras: accederás a él por un túnel SSH en el paso 5.
Paso 4: Verificar el bloqueo
Desde un equipo de tu casa u oficina, consulta a Pi-hole 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
El primero se resuelve con normalidad y el segundo devuelve 0.0.0.0, que es la respuesta de bloqueo por defecto. En Windows puedes usar nslookup doubleclick.net your_server_ip.
En el servidor, pihole -q indica en qué lista está un dominio:
sudo pihole -q doubleclick.net
Paso 5: Acceder al panel web
Abre un túnel SSH desde tu equipo que redirija un puerto local al puerto 80 del servidor:
ssh -L 8080:127.0.0.1:80 your_user@your_server_ip
Mientras la sesión siga abierta, entra en http://localhost:8080/admin con la contraseña del paso 2. El panel muestra las consultas totales, el porcentaje bloqueado, los dominios más consultados y los clientes que usan Pi-hole.
Paso 6: Añadir listas de bloqueo
La lista por defecto bloquea unos cientos de miles de dominios de publicidad y malware. Puedes añadir más desde el panel en Lists, pegando la URL de la lista y pulsando Add blocklist. Algunas listas conocidas y mantenidas:
https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt(HaGeZi Pro: publicidad, rastreo y telemetría)https://urlhaus.abuse.ch/downloads/hostfile/(URLhaus: dominios que distribuyen malware)
Cuantas más listas, más riesgo de bloquear algo legítimo; añade pocas y revisa el efecto. Después de añadir listas, reconstruye la base de datos de bloqueo (gravity):
sudo pihole -g
La salida termina con el número de dominios únicos bloqueados:
[i] Number of gravity domains: 412337 (389021 unique domains)
Pi-hole ya actualiza las listas automáticamente una vez por semana, así que no necesitas programar esta tarea.
Paso 7: Gestionar excepciones y bloqueos manuales
Si una web deja de funcionar porque un dominio necesario está en una lista, añádelo a la lista de permitidos:
sudo pihole allow cdn.example.com
Para bloquear un dominio concreto que no está en ninguna lista:
sudo pihole deny telemetry.example.com
Para bloquear por expresión regular (en este caso, cualquier subdominio que empiece por ads.):
sudo pihole --regex '^ads\.'
Muestra y elimina entradas con -l y -d:
sudo pihole allow -l
sudo pihole allow -d cdn.example.com
Los cambios se aplican al momento. Compruébalo repitiendo el dig del paso 4 con el dominio afectado.
Paso 8: Configurar los dispositivos
Para que todos los equipos de tu red usen Pi-hole, lo más cómodo es cambiarlo en el router: en la configuración DHCP o LAN, pon your_server_ip como servidor DNS primario y deja el secundario vacío. Si pones un segundo DNS público, los dispositivos lo usarán a veces y los anuncios volverán a aparecer.
Si no puedes tocar el router, configúralo en cada dispositivo. En un Linux con systemd-resolved:
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/pihole.conf
[Resolve]
DNS=your_server_ip
Domains=~.
sudo systemctl restart systemd-resolved
resolvectl query doubleclick.net
La consulta debe devolver 0.0.0.0. Recuerda que la IP pública de tu casa debe coincidir con la que permitiste en UFW; si tu proveedor te la cambia, actualiza la regla.
Paso 9: Mantenimiento
Actualiza Pi-hole cuando haya versión nueva (el panel lo avisa en el pie de página):
sudo pihole -up
pihole -v
Para seguir en tiempo real las consultas que llegan:
sudo pihole -t
Para hacer una copia de seguridad de toda la configuración (listas, excepciones, ajustes), usa Settings > Teleporter en el panel y descarga el archivo. El mismo menú permite restaurarla en otra instalación.
Solución de problemas
- Los clientes no obtienen respuesta: comprueba que su IP pública coincide con la regla de UFW (
sudo ufw status) y quedns.listeningModeesALL(sudo pihole-FTL --config dns.listeningMode). - El puerto 53 está ocupado: identifica el proceso con
sudo ss -lntup 'sport = :53'. Si essystemd-resolved, revisa que exista el fichero90-pi-hole-disable-stub-listener.confy reinicia el servicio. - Una web ha dejado de funcionar: en el panel, Query Log muestra los dominios bloqueados recientemente para ese cliente. Añade el necesario con
pihole allow. - Informe de diagnóstico:
sudo pihole -drevisa la instalación completa y genera un informe útil para pedir ayuda. Los logs están en/var/log/pihole/FTL.logy/var/log/pihole/pihole.log.
Conclusión
Pi-hole ya bloquea publicidad y rastreadores para los dispositivos que lo usen como DNS, está protegido para que solo tus IP puedan consultarlo y tienes el panel accesible por túnel SSH. Como siguientes pasos puedes instalar Unbound en el mismo servidor y usarlo como resolvedor de origen de Pi-hole para no depender de un proveedor externo, o montar WireGuard para usar Pi-hole desde el móvil fuera de casa.
