Pi-hole: Servidor DNS Bloqueador de Anuncios

Pi-hole es un servidor DNS que bloquea publicidad y rastreadores a nivel de red para todos los dispositivos conectados, sin necesidad de instalar extensiones en cada navegador. Al actuar como servidor DNS de la red local, intercepta y bloquea las solicitudes a dominios de anuncios antes de que lleguen a los dispositivos, reduciendo el consumo de ancho de banda y mejorando la privacidad. Esta guía cubre la instalación de Pi-hole en Linux, gestión de listas de bloqueo y configuración del servidor DHCP.

Requisitos Previos

  • Servidor Linux con IP estática (Ubuntu 22.04/Debian 12 o CentOS 9/Rocky 9)
  • Mínimo 512 MB de RAM y 2 GB de disco
  • IP estática configurada en el servidor
  • Puerto 53 disponible (deshabilitar systemd-resolved)
  • Acceso root al servidor

Instalación de Pi-hole

# Deshabilitar systemd-resolved para liberar el puerto 53 (Ubuntu)
# Primero configurar DNS de respaldo para no perder conectividad
cat > /etc/systemd/resolved.conf << 'EOF'
[Resolve]
DNS=1.1.1.1
FallbackDNS=8.8.8.8
DNSStubListener=no
EOF

systemctl restart systemd-resolved
rm -f /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

# Instalación automática de Pi-hole (script oficial)
curl -sSL https://install.pi-hole.net | bash

# Durante la instalación interactiva, configurar:
# - Interfaz de red: la interfaz principal del servidor
# - Upstream DNS: 1.1.1.1 y 1.0.0.1 (Cloudflare) u otro upstream
# - Lista de bloqueo: aceptar la lista StevenBlack por defecto
# - IPv6: según necesidad
# - Instalar interfaz web: Sí
# - Instalar servidor web lighttpd: Sí (si no tienes Nginx/Apache)
# - Registrar consultas: Sí

# Establecer contraseña para el panel web
pihole -a -p nueva_password_segura

Instalación no interactiva para automatización:

# Crear archivo de configuración para instalación desatendida
cat > /etc/pihole/setupVars.conf << 'EOF'
PIHOLE_INTERFACE=eth0
IPV4_ADDRESS=10.0.1.5/24
IPV6_ADDRESS=
QUERY_LOGGING=true
INSTALL_WEB_SERVER=true
INSTALL_WEB_INTERFACE=true
LIGHTTPD_ENABLED=true
WEBPASSWORD=hash_de_tu_password  # Generar con: echo -n "password" | sha256sum
BLOCKING_ENABLED=true
DNSMASQ_LISTENING=all
DNS_FQDN_REQUIRED=false
DNS_BOGUS_PRIV=true
DNSSEC=false
REV_SERVER=false
PIHOLE_DNS_1=1.1.1.1
PIHOLE_DNS_2=1.0.0.1
EOF

# Instalar en modo no interactivo
curl -sSL https://install.pi-hole.net | bash /dev/stdin --unattended

Configuración Inicial

# Verificar el estado de Pi-hole
pihole status

# Ver estadísticas rápidas desde la terminal
pihole -c  # Pantalla de estadísticas en tiempo real
pihole -c -j  # Estadísticas en formato JSON

# Verificar que Pi-hole está respondiendo consultas DNS
dig @10.0.1.5 google.com
dig @10.0.1.5 ads.doubleclick.net  # Debe devolver 0.0.0.0

# Actualizar Pi-hole a la última versión
pihole -up

# Ver la versión actual de todos los componentes
pihole -v

Accede al panel web en http://IP-del-servidor/admin con la contraseña configurada.

Gestión de Listas de Bloqueo

Pi-hole usa listas de bloqueo (adlists) para bloquear dominios de anuncios y rastreadores:

# Añadir listas de bloqueo adicionales via línea de comandos
# (también se puede hacer desde el panel web: Group Management > Adlists)

# Las listas se almacenan en la base de datos SQLite
sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled, comment) 
  VALUES ('https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts', 1, 'StevenBlack Unified');"

sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled, comment)
  VALUES ('https://someonewhocares.org/hosts/zero/hosts', 1, 'Dan Pollock hosts');"

sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled, comment)
  VALUES ('https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt', 1, 'anudeepND adservers');"

# Actualizar la base de datos gravity (descarga y procesa todas las listas)
pihole -g
# Esto puede tardar varios minutos dependiendo del número de listas

# Ver el resumen de las listas y dominios bloqueados
pihole -g --list

# Programar actualización automática semanal de listas
# Pi-hole ya instala un cron para esto, verificar:
cat /etc/cron.d/pihole

Listas Blancas y Negras Personalizadas

# Añadir dominios a la lista blanca (desbloquear)
pihole -w ejemplo-anuncio.com
pihole -w *.cdn-empresa.com  # Wildcard para subdominios

# Añadir a la lista blanca con regex
pihole --white-regex ".*\.tracking-empresa\.com$"

# Eliminar de la lista blanca
pihole -w -d ejemplo-anuncio.com

# Añadir dominios a la lista negra (bloquear manualmente)
pihole -b dominio-malicioso.com
pihole --blacklist telemetria-software.com

# Bloqueo con expresión regular
pihole --black-regex ".*ads.*\.com$"

# Ver las listas actuales
pihole -w -l   # Lista blanca
pihole -b -l   # Lista negra

# Gestión avanzada con SQLite directamente
# Ver grupos y dominios en la base de datos
sqlite3 /etc/pihole/gravity.db "SELECT * FROM whitelist;"
sqlite3 /etc/pihole/gravity.db "SELECT * FROM blacklist;"

# Exportar listas para backup
pihole -a teleporter  # Exporta toda la configuración en un ZIP

Configuración del Servidor DHCP

Pi-hole puede reemplazar al servidor DHCP del router para garantizar que todos los dispositivos usen Pi-hole como DNS:

# Habilitar el servidor DHCP de Pi-hole desde el panel web:
# Settings > DHCP > Enable DHCP server
# O desde la línea de comandos:

cat >> /etc/dnsmasq.d/02-pihole-dhcp.conf << 'EOF'
# Rango de IPs del servidor DHCP
dhcp-range=10.0.1.100,10.0.1.200,255.255.255.0,24h

# Puerta de enlace predeterminada
dhcp-option=3,10.0.1.1

# Servidor DNS (el propio Pi-hole)
dhcp-option=6,10.0.1.5

# Nombre de dominio local
domain=red.local

# Asignaciones estáticas por MAC
dhcp-host=aa:bb:cc:dd:ee:ff,nas-servidor,10.0.1.20
dhcp-host=11:22:33:44:55:66,impresora,10.0.1.30
EOF

# Reiniciar el servidor DNS/DHCP de Pi-hole
pihole restartdns

Si no quieres usar el DHCP de Pi-hole, configura el router para que sirva la IP del servidor Pi-hole como servidor DNS principal.

Personalización del Panel

# Configurar la retención de consultas en el log
# Settings > System > Log queries
# O via configuración:
echo "MAXDBDAYS=30" >> /etc/pihole/pihole-FTL.conf  # Mantener 30 días de logs

# Personalizar el dominio de bloqueo (en lugar de devolver 0.0.0.0)
# Crear página de bloqueo personalizada
cat > /var/www/html/block.html << 'EOF'
<!DOCTYPE html>
<html>
<body style="font-family: sans-serif; text-align: center; padding: 50px;">
<h1>Acceso bloqueado</h1>
<p>Este dominio está bloqueado por la política de red.</p>
</body>
</html>
EOF

# Configurar mensaje personalizado en pihole-FTL.conf
cat >> /etc/pihole/pihole-FTL.conf << 'EOF'
BLOCKINGMODE=IP       # Devolver IP del servidor en lugar de 0.0.0.0
BLOCK_IPV4=10.0.1.5   # IP para dominios bloqueados (la del servidor Pi-hole)
EOF

# Reiniciar FTL para aplicar cambios
systemctl restart pihole-FTL

# Ver estadísticas desde CLI
pihole -q google.com   # Ver si el dominio está bloqueado
pihole tail            # Ver consultas en tiempo real

Solución de Problemas

# Diagnóstico completo de Pi-hole
pihole -d  # Genera un informe de debug en /tmp/pihole_debug_*.log

# Ver logs de FTL (motor DNS de Pi-hole)
tail -f /var/log/pihole/FTL.log

# Ver el log de consultas DNS
tail -f /var/log/pihole/pihole.log

# Reiniciar todos los componentes de Pi-hole
pihole restartdns

# Pi-hole no bloquea anuncios
# Verificar que los clientes usan el servidor DNS correcto
# En el cliente, ejecutar:
# nslookup ads.google.com 10.0.1.5  # Debe devolver 0.0.0.0

# Actualizar gravity manualmente
pihole -g

# Verificar el estado de los servicios
systemctl status pihole-FTL
systemctl status lighttpd

# Puerto 53 ocupado
ss -ulnp | grep 53
# Si systemd-resolved ocupa el 53:
systemctl stop systemd-resolved
systemctl disable systemd-resolved

Conclusión

Pi-hole proporciona una solución de bloqueo de anuncios a nivel de red efectiva y fácil de gestionar, beneficiando a todos los dispositivos del hogar o la oficina sin configuración individual. Su panel web intuitivo, las listas de bloqueo actualizables automáticamente y las estadísticas detalladas hacen de Pi-hole una herramienta de red imprescindible para mejorar la privacidad y el rendimiento de la navegación en cualquier entorno.