284.150
Dominios bloqueados
3 listas activas compiladas
23,4%
Queries bloqueadas
De ~4.200 consultas/día
8 ms
Latencia DNS media
vs 42 ms con ISP DNS
DoH
DNS cifrado activo
Cloudflare 1.1.1.1 via cloudflared
🌐 Arquitectura de red
Flujo de consultas DNS con Pi-hole activo · Red 192.168.1.0/24
Dispositivos
40 devices
DHCP automático
DNS query →
Pi-hole
192.168.1.10
Pi 4 · v5.18
bloqueado = 0.0.0.0
Bloqueados
ads, trackers
malware domains
← DoH :5053
Cloudflare
1.1.1.1 / DoH
TLS cifrado
Consulta legítima (permitida)
Dominio bloqueado → 0.0.0.0
DNS-over-HTTPS (cifrado)
Router (fallback emergencia solo)
🐳 docker-compose.yml
Bare-metal / Docker
# /opt/pihole/docker-compose.yml
services:
pihole:
image: pihole/pihole:2024.07.0
container_name: pihole
ports:
- "53:53/tcp" # DNS
- "53:53/udp" # DNS
- "80:80/tcp" # Web admin
environment:
TZ: "Europe/Madrid"
WEBPASSWORD: "${PIHOLE_WEBPASSWORD}"
PIHOLE_DNS_: "127.0.0.1#5053"
DNSMASQ_LISTENING: "all"
volumes:
- "./etc-pihole:/etc/pihole"
- "./etc-dnsmasq.d:/etc/dnsmasq.d"
restart: unless-stopped
network_mode: "host"
services:
pihole:
image: pihole/pihole:2024.07.0
container_name: pihole
ports:
- "53:53/tcp" # DNS
- "53:53/udp" # DNS
- "80:80/tcp" # Web admin
environment:
TZ: "Europe/Madrid"
WEBPASSWORD: "${PIHOLE_WEBPASSWORD}"
PIHOLE_DNS_: "127.0.0.1#5053"
DNSMASQ_LISTENING: "all"
volumes:
- "./etc-pihole:/etc/pihole"
- "./etc-dnsmasq.d:/etc/dnsmasq.d"
restart: unless-stopped
network_mode: "host"
Seguridad .env
Guardar PIHOLE_WEBPASSWORD en .env con
chmod 600. No incluir en git.🔒 DNS-over-HTTPS · cloudflared
Cifrado activo
# Instalar cloudflared (ARM64 para Pi 4)
CLOUDFLARED_VERSION="2024.11.0"
curl -LO "https://github.com/cloudflare/cloudflared/releases/
download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64"
# Verificar checksum antes de instalar
sudo mv cloudflared-linux-arm64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared
CLOUDFLARED_VERSION="2024.11.0"
curl -LO "https://github.com/cloudflare/cloudflared/releases/
download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64"
# Verificar checksum antes de instalar
sudo mv cloudflared-linux-arm64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared
# /etc/cloudflared/config.yml
proxy-dns: true
proxy-dns-port: 5053
proxy-dns-upstream:
- https://1.1.1.1/dns-query
- https://1.0.0.1/dns-query
proxy-dns: true
proxy-dns-port: 5053
proxy-dns-upstream:
- https://1.1.1.1/dns-query
- https://1.0.0.1/dns-query
# Instalar y arrancar servicio systemd
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
# Pi-hole apunta a: 127.0.0.1#5053
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
# Pi-hole apunta a: 127.0.0.1#5053
🚫 Listas de bloqueo activas
284.150 dominios
| Lista | Dominios | Tipo | Estado |
|---|---|---|---|
|
StevenBlack hosts
Unified hosts + extras
|
202.418 | Ads | Activa |
|
BlocklistProject · Malware
malware.txt
|
51.892 | Malware | Activa |
|
BlocklistProject · Tracking
tracking.txt
|
29.840 | Tracking | Activa |
Actualización automática: cada lunes a las 03:00 via
Último gravity update: Lunes 16 Jun 2026 · 03:00 · 18 min
pihole -g (cron)Último gravity update: Lunes 16 Jun 2026 · 03:00 · 18 min
🗺️ Registros DNS locales
home.arpa
| Dominio | IP | Servicio |
|---|---|---|
| pi.home.arpa | 192.168.1.10 | Pi-hole admin |
| nas.home.arpa | 192.168.1.20 | Synology NAS |
| printer.home.arpa | 192.168.1.30 | HP LaserJet Pro |
| grafana.home.arpa | 192.168.1.10 | Métricas red (futuro) |
| backup.home.arpa | 192.168.1.21 | CNAME → nas.home.arpa |
Acceso: Pi-hole admin → Local DNS → DNS Records
CNAME: Local DNS → CNAME Records
CNAME: Local DNS → CNAME Records
📊 Top dominios bloqueados hoy
Query Log (últimas 24h)
doubleclick.net
412 bloqueos
googlesyndication.com
378 bloqueos
facebook.com/tr
291 bloqueos
hotjar.com
187 bloqueos
scorecardresearch.com
134 bloqueos
moatads.com
89 bloqueos
✅ Lista blanca · Herramientas SaaS
22 dominios permitidos
| Dominio | SaaS | Motivo |
|---|---|---|
| api.hubspot.com | HubSpot | CRM live data |
| cdn.figma.com | Figma | Assets diseño |
| slack-edge.com | Slack | Media / archivos |
| tracking.metabase.com | Metabase | Licencia validación |
| lemon.squeezy.com | Lemon Squeezy | Checkout pagos |
Añadir falso positivo:
Consultar si bloqueado:
pihole -w dominio.comConsultar si bloqueado:
pihole -q dominio.com📋 Pasos de instalación
Completado
-
1IP estática en Raspberry PiAsignar 192.168.1.10/24 en /etc/dhcpcd.conf antes de instalar Pi-hole.
sudo nano /etc/dhcpcd.conf -
2Docker Engine instaladoDocker + docker-compose en Raspberry Pi OS Lite 64-bit.
curl -fsSL https://get.docker.com | sh -
3Pi-hole desplegado vía Docker Composedocker-compose.yml + .env con PIHOLE_WEBPASSWORD (chmod 600).
docker compose up -d -
4cloudflared instalado y activo (DoH)Proxy DNS-over-HTTPS escuchando en 127.0.0.1:5053.
systemctl status cloudflared -
5Router apuntado a 192.168.1.10DNS primario del router DHCP cambiado. Dispositivos renuevan DHCP automáticamente.
Router admin → DHCP → DNS Primary -
6Gravity compilado + listas activas3 blocklists descargadas y compiladas. 284.150 dominios.
pihole -g
🔧 Troubleshooting habitual
Referencia rápida
Dispositivo sin internet tras instalar Pi-hole
Verificar que pihole-FTL está corriendo:
pihole status. Test directo: dig @192.168.1.10 google.com. Reiniciar DNS: pihole restartdnsSaaS bloqueado (falso positivo)
Consultar qué lista lo bloquea:
pihole -q dominio.com. Añadir a whitelist: pihole -w dominio.com. También desde admin web → Whitelist.Pi pierde corriente = red sin DNS
Documentar fallback en router: cambiar DNS primario temporalmente a 1.1.1.1. La Pi tiene UPS de 18.000 mAh para cortes breves.
Actualizar blocklists (gravity)
Manual:
pihole -g. Automático: cron configurado en /etc/cron.d/pihole (lunes 03:00). Tarda ~15 min, DNS operativo durante el update.
Live monitoring:
pihole -t — tail de todas las queries en tiempo realpihole -c — estadísticas en consola (cronomonitor)http://192.168.1.10/admin — panel web Pi-hole
⛔ Anti-patrones evitados
Mejores prácticas
✗
DNS fallback público en router
Un segundo DNS (1.1.1.1) en el router permite que los dispositivos salten el bloqueo cuando Pi-hole tarda. Configurado sin fallback secundario.
✗
Tag :latest en docker-compose
Usar
pihole:latest en DNS crítica es peligroso. Fijado a pihole:2024.07.0 para upgrades deliberados y revisables.
✗
Dominio .local para DNS local
Conflicto con mDNS/Bonjour en macOS. Usado .home.arpa (RFC 8375) para los registros DNS locales de Nexo.
✗
Pi-hole DHCP sin deshabilitar router DHCP
Dos servidores DHCP en la misma red causan conflictos de IPs. Nexo mantiene DHCP en el router (suficiente para la escala actual).
✗
Gravity sin actualización programada
Nuevos dominios de malware y ads no se bloquean con listas estancadas. Cron semanal configurado:
pihole -g cada lunes 03:00.✓ Checklist de verificación
Post-instalación
-
IP estática asignada a la Pi (192.168.1.10)Verificado con
ip addr show eth0 -
Pi-hole resuelve DNS correctamente
dig @192.168.1.10 google.comdevuelve A record -
Pi-hole bloquea dominio de prueba
dig @192.168.1.10 doubleclick.netdevuelve 0.0.0.0 -
cloudflared activo en :5053
dig @127.0.0.1 -p 5053 google.comresuelve -
Router DHCP apunta a 192.168.1.10Todos los dispositivos obtienen Pi-hole como DNS
-
HubSpot, Slack, Figma funcionan correctamenteDominios críticos whitelisteados tras prueba en oficina
-
Cron de gravity update configurado (lunes 03:00)
cat /etc/cron.d/piholemuestra la tarea -
Segunda instancia Pi-hole para redundanciaPendiente: añadir Pi Zero 2W como réplica (fase 2)
-
Grafana + dashboard de métricas DNSPlanificado para Q3 2026 (Prometheus + Pi-hole exporter)
🌍 Apuntar la red a Pi-hole · Configuración router Vodafone HFC
Paso clave
Método recomendado (red completa)
# Router admin UI
→ Configuración DHCP
→ DNS Primario
→ 192.168.1.10
# DNS Secundario: DEJAR VACÍO
# (no poner 1.1.1.1 como fallback)
# Renovar DHCP en devices:
reconectar WiFi
# o en Linux:
sudo dhclient -r && dhclient
→ Configuración DHCP
→ DNS Primario
→ 192.168.1.10
# DNS Secundario: DEJAR VACÍO
# (no poner 1.1.1.1 como fallback)
# Renovar DHCP en devices:
reconectar WiFi
# o en Linux:
sudo dhclient -r && dhclient
Test por dispositivo (antes del rollout)
# macOS
System Settings → Network
→ Details → DNS
→ Añadir 192.168.1.10
# Windows
Panel Control → Red
→ IPv4 → DNS manual
→ 192.168.1.10
# Verificar desde terminal:
nslookup google.com 192.168.1.10
System Settings → Network
→ Details → DNS
→ Añadir 192.168.1.10
# Windows
Panel Control → Red
→ IPv4 → DNS manual
→ 192.168.1.10
# Verificar desde terminal:
nslookup google.com 192.168.1.10
Rollback de emergencia
# Si Pi-hole falla completamente:
# 1. Router: cambiar DNS primario
→ 1.1.1.1 (Cloudflare)
# 2. Reiniciar Pi-hole:
docker compose restart pihole
# 3. Restaurar DNS en router
→ 192.168.1.10
# Todo el proceso: ~3 minutos
# 1. Router: cambiar DNS primario
→ 1.1.1.1 (Cloudflare)
# 2. Reiniciar Pi-hole:
docker compose restart pihole
# 3. Restaurar DNS en router
→ 192.168.1.10
# Todo el proceso: ~3 minutos