Por qué alojar Pi-hole en un VPS
La mayoría de las guías de Pi-hole asumen una Raspberry Pi en tu red local. Un VPS cambia radicalmente la ecuación: tu bloqueador DNS está accesible desde cualquier dispositivo, en cualquier lugar del mundo. Configura tu smartphone en movimiento para apuntar a tu VPS y los anuncios desaparecen incluso en redes móviles y Wi-Fi públicas.
Beneficios concretos de Pi-hole en un VPS
- Protección universal: cubre todos tus dispositivos (PCs, teléfonos, tabletas) sin configuración por dispositivo
- Reducción del ancho de banda: las peticiones bloqueadas no consumen ningún byte de descarga
- Registros DNS centralizados: visibilidad completa de los dominios contactados por cada dispositivo
- Independencia del ISP: tu DNS ya no transita por el resolvedor de tu operador
- Bloqueo de rastreadores IoT: los dispositivos conectados no pueden contactar sus servidores de telemetría
- Personalizable: añade tus propias reglas, pon en lista blanca lo que necesites, elige tus listas
Pi-hole v5 vs Pi-hole v6: qué cambió
Pi-hole v5 vs v6
Desplace la tabla
| Característica | Pi-hole v5 | Pi-hole v6 (2025) |
|---|---|---|
| Interfaz web | PHP + lighttpd | Integrada en FTL, sin lighttpd |
| Motor DNS | dnsmasq separado | FTL unificado (Faster Than Light) incluye DNS |
| API | API limitada, clave en la URL | API REST completa con autenticación por token |
| Configuración | Ficheros en /etc/pihole/* | Fichero TOML único pihole.toml |
| Instalación | Script curl | bash | Script curl | bash (idéntico, misma URL) |
| Docker | Imagen pihole/pihole | Imagen pihole/pihole (actualizada, mismo nombre) |
Pi-hole v6 salió el 18 de febrero de 2025. La migración desde v5 pasa por el script de instalación habitual ejecutado en un sistema v5: Pi-hole detecta la versión existente, ofrece la actualización y convierte la configuración al formato TOML (/etc/pihole/pihole.toml). Si empiezas desde cero, instala directamente v6.
Dos cambios importan en un VPS. Primero, cada ajuste de pihole.toml tiene su equivalente en variable de entorno FTLCONF_<sección>_<clave>: WEBPASSWORD de v5 pasa a ser FTLCONF_webserver_api_password, y los servidores superiores se escriben en FTLCONF_dns_upstreams, separados por punto y coma. Una variable definida así queda en solo lectura en la interfaz: es la fuente de verdad. Segundo, a las listas de bloqueo se suman listas de permitidos por suscripción (antigravity), útiles para neutralizar falsos positivos conocidos.
A 7 de noviembre de 2026, las versiones vigentes son Pi-hole Core v6.5, FTL v6.8 y Web v6.6.1 (17 de octubre de 2026); la imagen Docker correspondiente es pihole/pihole:2026.10.1, publicada el 31 de octubre de 2026 para actualizar su base Alpine.
Requisitos técnicos
Lo que necesitas
- Un VPS con Ubuntu 22.04/24.04 o Debian 12 con al menos 512 MB de RAM (1 GB recomendado)
- Una dirección IPv4 estática e idealmente una dirección IPv6
- Acceso SSH root o sudo
- El puerto 53 (TCP y UDP) cerrado a Internet: abierto solo a la interfaz de WireGuard o a tus propias direcciones IP, nunca a todo el mundo
- Puerto 80 o 443 para la interfaz web (opcional, pero recomendado con HTTPS)
La seguridad primero: ningún resolvedor abierto y actualizaciones al día
En una Raspberry Pi detrás del router de casa, el puerto 53 solo es accesible desde el hogar. En un VPS está en Internet: un resolvedor que responde a cualquiera sirve de relé para ataques DDoS de amplificación DNS, y tu IP acaba en listas negras. Pi-hole lo sabe. Su modo de escucha por defecto, «Allow only local requests», solo acepta equipos de una subred para la que exista una interfaz en el servidor; el modo ALL «permite todos los orígenes», y la documentación de FTL advierte de que puede convertir tu Pi-hole en un resolvedor abierto si no está protegido por un firewall.
De ahí sale la arquitectura correcta: tus dispositivos llegan al VPS por un túnel WireGuard, cuya subred es local para Pi-hole, y el puerto 53 queda cerrado al resto del mundo. Compruébalo desde fuera con nmap -sU -p 53 IP_DE_TU_VPS: el puerto debe aparecer closed o filtered.
Sigue también los parches. Pi-hole publicó en 2026 varias tandas de avisos de seguridad (abril, mayo, julio, septiembre y octubre), entre ellas ejecuciones remotas de código por inyección en la configuración, como CVE-2026-35517 a través de dns.upstreams, y escaladas de privilegios locales. La última tanda está corregida en las versiones del 17 de octubre de 2026. Ejecuta pihole -up en instalación nativa, o docker compose pull && docker compose up -d con Docker, y aplica en paralelo las actualizaciones de seguridad automáticas del sistema. Por último, no dejes la contraseña vacía: sin un valor fijado, Pi-hole genera una aleatoria y la escribe en los registros en el primer arranque. Para un script o un exportador, crea una contraseña de aplicación en Settings → Web interface / API en lugar de copiar en él la contraseña de administrador.
Desplegar Pi-hole paso a paso
Instalación completa en Ubuntu/Debian
Desactivar el stub resolver de systemd-resolved
En Ubuntu y Debian recientes, systemd-resolved escucha en el puerto 53 localmente. Pi-hole no puede arrancar mientras este puerto esté ocupado. Edita /etc/systemd/resolved.conf y añade DNSStubListener=no bajo la sección [Resolve]. Luego recarga: sudo systemctl reload systemd-resolved. Verifica que el puerto está libre: ss -tulpn | grep ':53'.
Instalar Pi-hole
Ejecuta el script oficial:
curl -sSL https://install.pi-hole.net | bashEl instalador te pide la interfaz de red (a menudo
eth0) y el DNS superior (elige Custom si después vas a instalar Unbound). Conserva el modo de escucha por defecto, «Allow only local requests»: con WireGuard, es el adecuado. Anota la contraseña de administrador que aparece al final, o fíjala conpihole setpassword.Configurar el firewall
No abras el puerto 53 a todo Internet. Abre el puerto de WireGuard, permite el DNS desde la subred del túnel y rechaza el resto:
sudo ufw allow 51820/udp sudo ufw allow from 10.8.0.0/24 to any port 53 sudo ufw deny 53Adapta
10.8.0.0/24a la subred de tu túnel. Si usas CSF o firewalld, traslada las mismas reglas. La interfaz web tampoco debe ser pública: pasa por el túnel o por un reverse proxy HTTPS restringido a tus IP.Comprobar el funcionamiento
Prueba la resolución y luego el bloqueo desde el propio VPS; después, comprueba desde fuera que el puerto no es accesible fuera del túnel:
# desde el VPS dig @127.0.0.1 google.com dig @127.0.0.1 doubleclick.net # desde un equipo exterior, FUERA del túnel: debe fallar nmap -sU -p 53 IP_DE_VOTRE_VPSgoogle.comdebe devolver una dirección,doubleclick.netdebe responder0.0.0.0, ynmapdebe mostrar el puertoclosedofiltered.Apuntar tus dispositivos al VPS
Lo más sencillo es pasar por WireGuard: en la configuración de cada cliente, indica la dirección de Pi-hole dentro del túnel como servidor DNS, según la guía WireGuard de Pi-hole:
[Interface] Address = 10.8.0.2/32 DNS = 10.8.0.1En Android, el «DNS privado» no sirve: espera el nombre de host de un proveedor DNS-over-TLS, no una dirección IP (véase la ayuda de Android), y Pi-hole no sirve DNS cifrado. En iOS y en ordenadores, la aplicación WireGuard aplica la misma línea
DNS. El túnel también te protege en 4G y en redes Wi-Fi públicas.Acceder a la interfaz web
En v6, la interfaz la sirve el propio FTL en
http://IP/admin(y en HTTPS con un certificado autofirmado). Ábrela a través del túnel, por ejemplohttp://10.8.0.1/admin, e inicia sesión con la contraseña definida en la instalación. El panel muestra en tiempo real el número de consultas, la tasa de bloqueo, los dominios más solicitados y los clientes más activos.
Añadir las mejores listas de bloqueo
Pi-hole viene con una lista básica. Para un bloqueo eficaz, añade listas comunitarias probadas desde el menú Adlists de la interfaz web (Group Management → Adlists).
Listas recomendadas
- StevenBlack Unified (anuncios + rastreadores): https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts — la referencia, ~100.000 dominios
- OISD Big: https://big.oisd.nl — lista agresiva pero pocos falsos positivos, ~500.000 dominios
- Firebog Ticked (solo marca verde): visita firebog.net y añade solo las listas con marca verde para minimizar los falsos positivos
- HaGeZi Multi PRO: https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt — excelente cobertura de malware
- Perflyst Smart-TV: para bloquear la telemetría de televisores inteligentes
Tras añadir listas, haz clic en Tools → Update Gravity (o ejecuta pihole -g por SSH) para descargar y compilar todas las listas. Tarda de uno a tres minutos según el número de listas, y Pi-hole sigue funcionando mientras tanto. Después, Gravity se actualiza solo una vez por semana, en la madrugada del domingo: no hace falta añadir tu propia tarea cron.
Gestionar los falsos positivos y la lista blanca
Un bloqueo demasiado agresivo acaba rompiendo servicios legítimos. Pi-hole proporciona herramientas de diagnóstico precisas para identificar y corregir los falsos positivos sin debilitar tu protección.
Diagnosticar y corregir un falso positivo
Identificar el dominio bloqueado
En la interfaz, abre Query Log (tiempo real) o Long-term data → Query Log. Filtra por cliente o por estado Blocked. Cada entrada muestra el dominio exacto y la lista que lo bloqueó. En v6, puedes hacer clic en la entrada para ver los detalles completos.
Añadir a la lista de permitidos
Haz clic en el dominio y luego en Allow, o ve a Domains y añádelo con el tipo Allow. Para permitir un dominio y todos sus subdominios, usa la opción Wildcard. Una entrada permitida siempre prevalece sobre las listas de bloqueo. Si el mismo falso positivo vuelve en muchos dominios, suscríbete mejor a una lista de permitidos mantenida por la comunidad, en Lists, con el tipo Allow.
Permitir desde la línea de comandos
v6 renombró los comandos:
pihole -wy--white-wildya no existen. Desde SSH:pihole allow ejemplo.com pihole --allow-wild ejemplo.com pihole allow -lEl primero permite un dominio exacto, el segundo el dominio y sus subdominios, y el tercero muestra la lista de permitidos.
Casos comunes de falsos positivos
Microsoft Teams y Office 365 se bloquean a veces en listas agresivas (dominios live.com, microsoft.com). Apple usa CDNs compartidos con rastreadores. Las actualizaciones automáticas de Windows pueden ser bloqueadas por algunas listas. La lista verde de firebog.net existe precisamente para reducir estos problemas.
Pi-hole en Docker y los conflictos del puerto 53
Si tu VPS ya ejecuta contenedores, Pi-hole puede ser también un contenedor y servir de resolvedor a todos los demás. Dos trampas se repiten: otro proceso ya ocupa el puerto 53 del host, y los contenedores no alcanzan la dirección en la que escucha Pi-hole. El resolvedor integrado de Docker (127.0.0.11) vive dentro de cada contenedor: no ocupa el puerto 53 del host.
Desplegar Pi-hole con Docker Compose y conectar tus contenedores
Escribir el docker-compose.yml
El archivo sigue la documentación Docker de Pi-hole, con una etiqueta fechada en lugar de
latestpara controlar las actualizaciones. El DNS solo se publica en el loopback y en la dirección del puente Docker172.17.0.1, nunca en la IP pública; la interfaz web solo en127.0.0.1:8080, para un reverse proxy.mkdir -p /opt/pihole/etc-pihole && cd /opt/pihole cat > docker-compose.yml << 'EOF' services: pihole: container_name: pihole image: pihole/pihole:2026.10.1 ports: - "127.0.0.1:53:53/tcp" - "127.0.0.1:53:53/udp" - "172.17.0.1:53:53/tcp" - "172.17.0.1:53:53/udp" - "127.0.0.1:8080:80/tcp" environment: TZ: 'Europe/Paris' FTLCONF_webserver_api_password: 'una-contrasena-larga' FTLCONF_dns_listeningMode: 'ALL' FTLCONF_dns_upstreams: '9.9.9.9;1.1.1.1' volumes: - './etc-pihole:/etc/pihole' restart: unless-stopped EOF docker compose up -d && docker compose logs pihole | tail -20FTLCONF_dns_listeningMode: 'ALL'es necesario en la red bridge, porque las consultas llegan desde fuera de la subred del contenedor; es el mapeo de puertos lo que impide la exposición pública. Añadecap_add: NET_ADMINsolo si Pi-hole también hace de servidor DHCP, algo sin sentido en un VPS.Conectar los demás contenedores a Pi-hole
En cada servicio de tus otros stacks, indica la dirección del puente Docker:
services: mi-app: image: mi-imagen dns: - 172.17.0.1No escribas
127.0.0.1: la documentación de Docker recuerda que, en un contenedor,--dns=127.0.0.1designa el loopback del propio contenedor, no el del host. Para un ajuste global, la misma dirección va en/etc/docker/daemon.jsonbajo la clavedns, seguida de unsystemctl restart docker.Comprobar que ningún otro proceso escucha
Comando de diagnóstico:
sudo ss -tulpn | grep ':53'. El único proceso esperado espihole-FTL(odocker-proxypara los puertos publicados por el contenedor). Si ves systemd-resolved, named o bind9, desactiva el servicio que compite. Para systemd-resolved, basta conDNSStubListener=noen/etc/systemd/resolved.conf, como en la instalación nativa.Controlar el resolvedor que ve un contenedor
Desde un contenedor, lee su configuración DNS:
docker exec mi-app cat /etc/resolv.conf sudo ss -tulpn | grep ':53'Un contenedor de una red Compose personalizada muestra
127.0.0.11, el resolvedor integrado de Docker, que reenvía a los servidoresdns:declarados: es normal. La prueba está en el Query Log de Pi-hole, donde el contenedor debe aparecer como cliente. Si la actualización de Gravity falla con «Could not access the internet», es probable que el contenedor de Pi-hole se resuelva a sí mismo en bucle: comprueba queFTLCONF_dns_upstreamsapunta a un resolvedor externo o a Unbound.
Pi-hole + Unbound: recursión DNS completa sin terceros
Por defecto, Pi-hole reenvía las consultas no bloqueadas a un resolvedor público (Cloudflare 1.1.1.1, Google 8.8.8.8). Ese resolvedor ve entonces todas tus consultas DNS. Unbound resuelve este problema consultando directamente los servidores raíz y de autoridad, sin intermediario.
Instalar y configurar Unbound
Instalar Unbound
sudo apt install unbound. Disponible en los repositorios oficiales de Ubuntu y Debian. Arranca automáticamente pero lo configuraremos para escuchar solo localmente.
Crear la configuración Pi-hole + Unbound
Crea
/etc/unbound/unbound.conf.d/pi-hole.confa partir de la configuración de la guía Unbound de Pi-hole: escucha en127.0.0.1puerto5335, endurecimiento DNSSEC y búfer EDNS de 1232 bytes.sudo tee /etc/unbound/unbound.conf.d/pi-hole.conf > /dev/null << 'EOF' server: verbosity: 0 interface: 127.0.0.1 port: 5335 do-ip4: yes do-udp: yes do-tcp: yes do-ip6: no harden-glue: yes harden-dnssec-stripped: yes edns-buffer-size: 1232 prefetch: yes EOF sudo systemctl restart unboundInstalado desde los repositorios de Debian o Ubuntu, Unbound ya conoce los servidores raíz: descargar
root.hintsde internic.net solo tiene sentido en una instalación compilada a mano.Apuntar Pi-hole a Unbound
En la interfaz de Pi-hole, ve a Settings → DNS. Desmarca todos los servidores DNS upstream. En el campo Custom DNS, introduce 127.0.0.1#5335. Guarda. Pi-hole enviará ahora todas las consultas no bloqueadas a Unbound, que las resolverá directamente desde los servidores raíz.
Comprobar la recursión y DNSSEC
Prueba Unbound directamente:
dig pi-hole.net @127.0.0.1 -p 5335 dig fail01.dnssec.works @127.0.0.1 -p 5335 dig +ad dnssec.works @127.0.0.1 -p 5335La primera consulta debe devolver una dirección. La segunda debe fallar con
SERVFAIL, sin dirección: la firma del dominio está rota a propósito. La tercera debe responderNOERRORcon el indicadorad, que confirma la validación DNSSEC. En el Query Log de Pi-hole, las consultas deben aparecer reenviadas a127.0.0.1#5335.Neutralizar openresolv en Debian
Debian instala
openresolvpor defecto, y el serviciounbound-resolvconfescribe entoncesnameserver 127.0.0.1sin el puerto5335en/etc/resolv.conf: el sistema consulta a Pi-hole, que consulta a Unbound, al que ya no llega. La guía Unbound de Pi-hole recomienda desactivar ese servicio:sudo systemctl disable --now unbound-resolvconf.service # después, comenta la línea unbound_conf= en /etc/resolvconf.confDespués, reinicia Unbound y repite las pruebas del paso anterior.
Supervisar las métricas de Pi-hole
El panel de Pi-hole v6 muestra las métricas clave en tiempo real. Así es como interpretarlas y qué vigilar.
Métricas importantes y valores de referencia
- Tasa de bloqueo (Ads blocked today): entre 10% y 30% es normal. Una tasa inferior al 5% sugiere que tus listas están incompletas. Una tasa superior al 40% puede indicar demasiados falsos positivos.
- Queries/24h: da una idea de la carga. Una red familiar genera típicamente entre 5.000 y 50.000 consultas por día.
- Top Blocked Domains: si un dominio publicitario encabeza la lista cada día, la aplicación correspondiente es especialmente intrusiva.
- Top Clients: identifica los dispositivos más «parlanchines» — los objetos IoT suelen estar a la cabeza.
- DNS cache size: en v6, FTL gestiona la caché interna. Una tasa de aciertos alta (>60%) reduce la latencia percibida.
- Query Types: un volumen anormal de consultas PTR (resolución inversa) puede indicar un escaneo de red o software mal configurado.
Para exportar las métricas a Prometheus y Grafana, la API REST de v6 expone, entre otros, /api/stats/summary y /api/info/metrics. El exportador comunitario pihole-exporter se conecta con una contraseña de aplicación (Settings → Web interface / API) y alimenta un panel existente sin tocar la configuración de Pi-hole.
¿Pi-hole v6 o AdGuard Home?
AdGuard Home es el otro DNS de filtrado autoalojable, escrito en Go (versión v0.107.80, del 3 de noviembre de 2026). La tabla recoge las diferencias que se comprueban en la documentación de ambos proyectos; en un VPS unido a tus dispositivos por WireGuard, el cifrado DNS nativo de AdGuard Home pesa menos, porque el túnel ya cifra el tráfico.
Pi-hole v6 y AdGuard Home, criterio por criterio
Desplace la tabla
| Criterio | Pi-hole v6 | AdGuard Home |
|---|---|---|
| Arquitectura | FTL (C) con servidor web y API integrados, sin PHP ni lighttpd | Binario Go único, multiplataforma |
| Servir DNS cifrado (DoH, DoT) a los clientes | No, hace falta software adicional (o un túnel WireGuard) | Sí, de forma nativa |
| Servidor superior cifrado (DoH, DoT, DNSCrypt) | No nativo (cloudflared o Unbound al lado) | Sí, de forma nativa |
| Reglas por cliente | Sí, mediante grupos de clientes | Sí |
| Control parental y SafeSearch forzado | Mediante listas dedicadas; sin SafeSearch forzado | Integrados |
| Configuración declarativa | Archivo `pihole.toml` y variables `FTLCONF_*` | Archivo YAML e interfaz web |
Copia de seguridad y restauración de la configuración de Pi-hole
Las copias de seguridad regulares de Pi-hole son esenciales: preservan tus listas personalizadas, lista blanca, grupos y configuración DNS, que no querrás reconfigurer manualmente después de una migración o reinstalación.
Copia de seguridad y restauración
Crear una copia Teleporter
En la interfaz web, abre Settings → Teleporter y exporta el archivo: Pi-hole genera un ZIP con la configuración, las listas, los grupos y los dominios permitidos o bloqueados. En línea de comandos, v6 pasa por el binario FTL:
mkdir -p /root/pihole-backups && cd /root/pihole-backups sudo pihole-FTL --teleporterEl archivo se crea en el directorio actual, y se muestra su nombre.
Automatizar la copia de seguridad
Añade estas dos tareas con
crontab -e: un archivo cada noche y la limpieza de los archivos de más de 30 días.0 2 * * * cd /root/pihole-backups && pihole-FTL --teleporter >/dev/null 2>&1 0 3 * * * find /root/pihole-backups -name '*.zip' -mtime +30 -deleteCon Docker, antepón
docker exec piholeal comando y escribe el archivo en el volumen montado, por ejemplo/etc/pihole.Restaurar desde una copia
Tras una reinstalación, abre Settings → Teleporter e importa tu ZIP, o usa la línea de comandos:
sudo pihole-FTL --teleporter /root/pihole-backups/ARCHIVE.zipPi-hole importa ajustes, grupos y listas. En v6 el formato Teleporter difiere del de v5: las copias de v5 solo se recuperan en parte (listas importadas, configuración de red que rehacer a mano).
Copia de seguridad de la configuración de Unbound
Si usas Unbound, añade sus archivos a tu copia de seguridad: tar -czf /root/unbound-config-$(date +%Y%m%d).tar.gz /etc/unbound/. La configuración de Unbound no cambia entre versiones y puede restaurarse directamente.
Guarda tus copias de seguridad fuera del VPS: cópialas a un bucket S3, un servidor remoto o tu máquina local. Si tu VPS se vuelve inaccesible, puedes reconfigurar Pi-hole en un nuevo servidor en minutos simplemente importando el archivo Teleporter.