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 como your_server_ip.

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 eth0 o ens3).
  • 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 que dns.listeningMode es ALL (sudo pihole-FTL --config dns.listeningMode).
  • El puerto 53 está ocupado: identifica el proceso con sudo ss -lntup 'sport = :53'. Si es systemd-resolved, revisa que exista el fichero 90-pi-hole-disable-stub-listener.conf y 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 -d revisa la instalación completa y genera un informe útil para pedir ayuda. Los logs están en /var/log/pihole/FTL.log y /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.