Tutorial

Pi-hole v6 en un VPS: bloquea anuncios y rastreadores a nivel DNS

Seguridad y monitorización13 min de lectura8 pasos

Tienes una decena de servicios en tu VPS — n8n, Nextcloud, Grafana, varias APIs — y cada uno sigue contactando dominios de rastreo y publicidad. Pi-hole v6, publicado en febrero de 2025, trae una reescritura completa de su arquitectura: nada de PHP ni lighttpd, un servidor web integrado directamente en el binario FTL, y una API REST nativa que simplifica la integración en una stack Docker. Esta guía te lleva de cero a un resolver DNS funcional en tu VPS, asegurado contra la exposición pública.

Contenido· Por qué alojar tu propio resolver DNS Pi-hole en un VPS1/10
  1. 01Por qué alojar tu propio resolver DNS Pi-hole en un VPS
  2. 02Lo que Pi-hole aporta concretamente a una stack autoalojada
  3. 03Novedades de Pi-hole v6 — qué cambia para los self-hosters
  4. 04Requisitos previos del VPS
  5. 05Despliegue de Pi-hole v6 con Docker Compose: procedimiento completo
  6. 06Configuración post-instalación
  7. 07Pi-hole v6 vs AdGuard Home — comparativa 2026
  8. 08Hardening: reglas que no hay que ignorar
  9. 09Solución de problemas: errores habituales
  10. 10Integrar Pi-hole en tu stack de seguridad

Por qué alojar tu propio resolver DNS Pi-hole en un VPS

Un resolver DNS autoalojado en un VPS no está reservado a los homelabs. En cuanto operas múltiples contenedores y servicios en el mismo servidor, se convierte en un punto de control de red central: cada consulta DNS pasa por Pi-hole antes de llegar a internet, lo que te da visibilidad y control que los resolvers públicos no pueden ofrecer.

El argumento para un VPS frente a una Raspberry Pi local es simple. El VPS funciona 24/7, es accesible desde cualquier nodo de tu red Docker o de tu mesh VPN, y no depende de la disponibilidad de tu red doméstica. Para un desarrollador que administra varios servidores o trabaja en remoto, esta es la ubicación lógica.

Lo que Pi-hole aporta concretamente a una stack autoalojada

  • Bloqueo a nivel de red: cada consulta hacia dominios de publicidad, rastreo o malware se bloquea antes de que se establezca la conexión TCP — para todos los contenedores de la red Docker, sin modificar cada aplicación.
  • Logs DNS centralizados: un único dashboard muestra todas las consultas DNS de tu infraestructura, facilitando el debug de una aplicación que contacta un servicio externo inesperado.
  • Reducción del ancho de banda: las consultas bloqueadas no generan ninguna respuesta de red. En un VPS con cuota de ancho de banda, es un ahorro medible para stacks con mucho tráfico.
  • Privacidad de las consultas DNS: al combinar Pi-hole con Unbound como resolver recursivo local, tus consultas ya no pasan por un resolver de terceros — consultan directamente los servidores DNS autoritativos.
  • Integración con la stack autoalojada: Pi-hole actúa como servidor DNS local para tus servicios, permitiéndote crear entradas DNS personalizadas (grafana.miserv.local) sin modificar /etc/hosts en cada máquina.
  • Listas de bloqueo comunitarias: el ecosistema Pi-hole es uno de los más ricos en listas de bloqueo mantenidas — Hagezi, oisd, Steven Black — actualizadas automáticamente.
  • Actualización v6 no disruptiva: Pi-hole v6 mantiene compatibilidad con los clientes v5; la migración no interrumpe el servicio.

Novedades de Pi-hole v6 — qué cambia para los self-hosters

Pi-hole v6 fue anunciado el 18 de febrero de 2025 en pi-hole.net. Es una reescritura mayor, no una actualización incremental.

Eliminación de PHP y lighttpd. La versión 5 usaba lighttpd como servidor web y PHP para la interfaz de administración. En v6, el binario pihole-FTL integra directamente un servidor web basado en Lua. Resultado: la imagen Docker es más ligera, no hay dependencias separadas que gestionar, y la superficie de ataque se reduce.

Nueva API REST nativa. La API v6 está documentada y versionada. Expone estadísticas, gestión de listas y configuración directamente desde http://<ip>/api/. En una stack Docker Compose, esto permite automatizar la gestión de Pi-hole desde un script o desde n8n sin necesidad de workarounds.

Variables de entorno FTLCONF_*. El esquema de configuración ha cambiado. La variable WEBPASSWORD de v5 es reemplazada por FTLCONF_webserver_api_password. Todas las opciones de configuración FTL ahora se exponen via variables FTLCONF_<sección>_<clave>, haciendo el docker-compose.yml autocontenido y legible.

Modo Basic / Expert. La interfaz v6 separa los ajustes esenciales (modo Basic) de las opciones avanzadas (modo Expert). Para un despliegue en VPS, el modo Expert da acceso al control de la interfaz de escucha DNS y a los parámetros de seguridad.

Antigravity (listas de permitidos por suscripción). Como espejo de Gravity para listas de bloqueo, Antigravity permite suscribirse a listas de permitidos mantenidas por la comunidad — útil para evitar falsos positivos en dominios legítimos.

Desde el lanzamiento de v6 en febrero de 2025, han seguido varias actualizaciones: FTL v6.5 en febrero de 2026, FTL v6.6 en abril de 2026, FTL v6.6.1 en abril de 2026 con correcciones de seguridad. La imagen Docker oficial está etiquetada como 2026.06.0 para la última release de junio de 2026.

Requisitos previos del VPS

Pi-hole v6 está diseñado para ser ligero. Los requisitos son notablemente inferiores a los de un SIEM o una stack de monitorización.

Recursos mínimos recomendados:
- 512 MB de RAM son suficientes para uso moderado (pocos contenedores, menos de 10.000 peticiones/hora). Prevé 1 GB para uso intensivo o si activas el historial extendido de consultas.
- 1 vCPU es suficiente. Pi-hole FTL es un proceso único y eficiente.
- 4 GB de disco mínimo para la imagen y las bases de datos de consultas.
- Acceso root al VPS para gestionar Docker y la configuración de red.

Puertos de red a considerar:
- 53/UDP y 53/TCP: puerto DNS. No exponer públicamente — esta es la regla más importante de esta guía.
- 80/TCP y 443/TCP: interfaz web de administración, a exponer solo detrás de un reverse proxy con autenticación.

Requisitos de software:
- Docker Engine 24.0+ y Docker Compose v2 (comando docker compose, sin guión).
- Sistema operativo: Debian 12 o Ubuntu 22.04/24.04 LTS.

Comprobación previa — puerto 53:
En Debian/Ubuntu recientes, systemd-resolved escucha en el puerto 53. Es la causa número uno de fallo en el primer arranque de Pi-hole. Verifica y desactiva si es necesario:

ss -tlunp | grep ':53'
systemctl disable --now systemd-resolved

Si desactivas systemd-resolved, asegúrate de que /etc/resolv.conf apunte a un resolver funcional mientras haces el despliegue:

echo 'nameserver 1.1.1.1' > /etc/resolv.conf

Despliegue de Pi-hole v6 con Docker Compose: procedimiento completo

  1. Preparar el servidor e instalar Docker

    Actualiza el sistema e instala Docker Engine desde el repositorio oficial:

    apt-get update && apt-get upgrade -y
    curl -fsSL https://get.docker.com | sh
    docker --version && docker compose version

    Activa Docker al arranque y verifica que Docker Compose v2 responde (el comando es docker compose, sin guión):

    systemctl enable --now docker
  2. Crear la estructura de directorios

    Crea un directorio dedicado y volúmenes persistentes para la configuración y las bases de datos de Pi-hole:

    mkdir -p /opt/pihole/etc-pihole
    cd /opt/pihole

    Estos directorios persisten la configuración FTL, las listas Gravity y el registro de consultas. Sin ellos, cada recreación del contenedor comienza desde cero.

  3. Escribir el docker-compose.yml de Pi-hole v6

    Crea /opt/pihole/docker-compose.yml con la siguiente configuración. Nota el uso de FTLCONF_webserver_api_password (variable v6) y FTLCONF_dns_listeningMode para el adaptador al bridge network de Docker:

    services:
      pihole:
        container_name: pihole
        image: pihole/pihole:2026.06.0
        ports:
          - "127.0.0.1:53:53/tcp"
          - "127.0.0.1:53:53/udp"
          - "127.0.0.1:8080:80/tcp"
        environment:
          TZ: 'Europe/Paris'
          FTLCONF_webserver_api_password: 'cambia-esta-contraseña'
          FTLCONF_dns_listeningMode: 'ALL'
          FTLCONF_dns_upstreams: '1.1.1.1;8.8.8.8'
        volumes:
          - './etc-pihole:/etc/pihole'
        cap_add:
          - SYS_NICE
        restart: unless-stopped

    Punto crítico: 127.0.0.1:53 vincula el puerto DNS a la interfaz loopback del host únicamente. El resolver es accesible desde el propio servidor y desde la red Docker interna, pero no desde Internet.

  4. Arrancar Pi-hole y verificar su estado

    Lanza el contenedor en segundo plano y verifica que está healthy:

    docker compose up -d
    docker compose ps
    docker compose logs pihole | tail -30

    En el primer arranque, Pi-hole descarga las listas Gravity (pocos segundos). La interfaz web está disponible en http://127.0.0.1:8080/admin desde el propio servidor. Si ves Pi-hole blocking is enabled, el despliegue funciona.

  5. Configurar el DNS en la red interna de Docker

    Para que tus contenedores usen Pi-hole como resolver DNS, define dns en cada servicio de tus otras stacks Docker Compose, o configura el demonio Docker globalmente.

    Opción A — por servicio (recomendado para stacks existentes):

    services:
      mi-app:
        image: mi-imagen
        dns:
          - 172.17.0.1

    172.17.0.1 es la IP de la pasarela de la red bridge Docker por defecto, que corresponde a la interfaz del host donde escucha Pi-hole.

    Opción B — demonio Docker global (/etc/docker/daemon.json):

    {
      "dns": ["172.17.0.1", "1.1.1.1"]
    }

    Reinicia Docker tras la modificación: systemctl restart docker. El segundo resolver 1.1.1.1 es un fallback si Pi-hole está parado.

  6. Exponer el dashboard vía un reverse proxy HTTPS

    Nunca expongas el dashboard de Pi-hole directamente en el puerto 80 público. Usa nginx como reverse proxy con un certificado Let's Encrypt:

    server {
        listen 443 ssl;
        server_name pihole.your-domain.com;
    
        ssl_certificate /etc/letsencrypt/live/pihole.your-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/pihole.your-domain.com/privkey.pem;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    Obtén el certificado con Certbot: certbot --nginx -d pihole.your-domain.com. La autenticación de Pi-hole (contraseña definida en FTLCONF_webserver_api_password) sigue siendo la única puerta de entrada.

  7. Asegurar el resolver contra la exposición pública

    Un resolver DNS abierto en Internet es un vector de amplificación DDoS y puede ser usado por cualquiera. Verifica que el puerto 53 no sea accesible desde el exterior.

    Verificación desde una máquina remota:

    nmap -sU -p 53 <IP_DE_TU_VPS>

    El puerto debe estar filtered o closed. Si está open, tu resolver es público.

    Cerrar el puerto 53 con ufw:

    ufw deny 53/udp
    ufw deny 53/tcp
    ufw allow from 172.16.0.0/12 to any port 53

    La regla allow from 172.16.0.0/12 permite las redes Docker internas mientras bloquea el tráfico externo.

  8. Añadir listas de bloqueo y activar la actualización automática

    La interfaz de Pi-hole v6 > Lists permite añadir listas por URL. Listas recomendadas tras la instalación:

    - Hagezi Multi Pro: https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt
    - oisd Big: https://big.oisd.nl/
    - Steven Black Unified: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts

    Tras añadirlas, lanza una actualización de Gravity:

    docker exec pihole pihole -g

    Para automatizar la actualización semanal, añade una entrada cron en el host:

    0 3 * * 0 docker exec pihole pihole -g >> /var/log/pihole-gravity.log 2>&1

Configuración post-instalación

Una vez Pi-hole operativo y tus servicios apuntando a él, algunos ajustes aumentan su utilidad diaria.

DNS personalizados para servicios internos. En Pi-hole > Local DNS, puedes crear registros A que resuelvan nombres locales: grafana.local → 127.0.0.1, n8n.local → 127.0.0.1. Esto sustituye modificar /etc/hosts en cada máquina.

Ajustar el nivel de logging. Por defecto, Pi-hole conserva 24 horas del registro de consultas. Para extender a 7 días o reducir para limitar el uso de disco: en Settings > System, modifica la opción Query log. En un VPS con almacenamiento limitado, desactivar los logs detallados (manteniendo las estadísticas) es una opción viable.

Dashboard y estadísticas. El dashboard v6 muestra en tiempo real: el porcentaje de consultas bloqueadas, los dominios más solicitados, los clientes más activos. Estos datos son útiles para identificar un contenedor que realiza peticiones inusuales.

Lista blanca para falsos positivos. Algunas listas de bloqueo son agresivas y bloquean dominios legítimos. Pi-hole > Domains > Allow permite añadir excepciones sin tocar las listas. Comprueba si algún servicio interno deja de funcionar tras activar una nueva lista.

Pi-hole v6 vs AdGuard Home — comparativa 2026

Desplace la tabla

CriterioPi-hole v6AdGuard Home
ArquitecturaBinario FTL con servidor web Lua integrado — sin PHP ni lighttpd desde v6 (febrero 2025)Binario Go único, multiplataforma (Linux, Windows, macOS, OpenWrt, FreeBSD)
DNS cifrado (DoH/DoT/DoQ)No integrado — requiere contenedor sidecar Unbound o cloudflared para DoH/DoTIntegrado de forma nativa — DoH, DoT y DoQ disponibles sin configuración adicional
Huella de memoria~70-150 MB en funcionamiento normal, según volumen de consultas e historial activado~50-100 MB; algo más ligero en configuraciones simples sin historial extendido
Comunidad y listasEcosistema más amplio: cientos de listas compatibles (formato hosts y adblock), foros activos, documentación extensaCompatible con listas en formato adblock (uBlock Origin); ecosistema en crecimiento pero más joven
API y automatizaciónAPI REST nativa documentada en v6; gestión completa vía variables `FTLCONF_*`API REST disponible; configuración vía archivo YAML o interfaz web
Reglas por clienteFiltrado por cliente (IP o nombre de red), sin reglas nativas granulares por dispositivoReglas por cliente y por grupo de forma nativa, controles parentales integrados

Hardening: reglas que no hay que ignorar

Nunca expongas el puerto 53 públicamente. Este es el principal riesgo de un resolver DNS en un VPS. Un puerto 53 abierto permite a cualquiera usar tu servidor como resolver — y potencialmente como vector de amplificación DNS en un ataque DDoS. Comprueba regularmente con nmap -sU -p 53 <IP_VPS> desde el exterior.

Cambia la contraseña por defecto. La variable FTLCONF_webserver_api_password en el Compose debe contener una contraseña fuerte. Si la omites, Pi-hole genera una contraseña aleatoria y la muestra en los logs en el primer arranque — conveniente para pruebas, inaceptable en producción.

Actualiza la imagen regularmente. Las releases de Pi-hole v6 en 2026 incluyeron correcciones de seguridad (vulnerabilidad de escalada de privilegios local en abril de 2026, correcciones XSS en la interfaz web). Añade una verificación periódica:

docker compose pull && docker compose up -d

Sin DHCP en producción en un VPS. La función DHCP de Pi-hole está diseñada para redes locales. En un VPS no tiene utilidad, y activarla accidentalmente (cap_add: NET_ADMIN) puede crear conflictos de red con la infraestructura del host.

Solución de problemas: errores habituales

Estos son los problemas más frecuentes al desplegar Pi-hole v6 en un VPS, con causas exactas y soluciones.

1. El puerto 53 ya está en uso — bind: address already in use
Causa: systemd-resolved escucha en 127.0.0.53:53. Comprueba con ss -tlunp | grep ':53'. Solución: desactiva systemd-resolved (systemctl disable --now systemd-resolved) y reemplaza /etc/resolv.conf con un archivo estático apuntando a 1.1.1.1 durante el despliegue.

2. Las consultas DNS de los contenedores no pasan por Pi-hole
Causa: los contenedores usan el resolver predeterminado de Docker (127.0.0.11), no Pi-hole. Verifica desde un contenedor: docker exec <contenedor> cat /etc/resolv.conf. Si muestra 127.0.0.11, la opción dns: no está configurada en tu Compose o en /etc/docker/daemon.json.

3. Dashboard inaccesible tras el arranque
Causa habitual: el puerto 8080 está vinculado a 127.0.0.1 (no accesible desde el exterior) pero el reverse proxy aún no está configurado. Comprueba localmente: curl http://127.0.0.1:8080/admin/. Si responde, el problema está en el reverse proxy o el certificado TLS.

4. FTLCONF_webserver_api_password ignorada tras recrear el contenedor
Causa: Pi-hole almacena la configuración en /etc/pihole/pihole.toml. Si este archivo ya existe en el volumen ./etc-pihole con una contraseña antigua, la variable de entorno no lo sobreescribe. Solución: eliminar el archivo pihole.toml (pérdida de config) o cambiar la contraseña desde la interfaz web.

5. Fallo en la actualización de Gravity — Could not access the internet
Causa: el contenedor Pi-hole no puede resolver las URLs de las listas, generalmente porque FTLCONF_dns_upstreams no está configurado o el contenedor usa Pi-hole como su propio resolver (bucle). Verifica que FTLCONF_dns_upstreams apunte a un resolver externo (1.1.1.1;8.8.8.8) en tu Compose.

Integrar Pi-hole en tu stack de seguridad

Pi-hole es una capa de filtrado DNS, no un sistema de detección de intrusiones. Su alcance es preciso: actúa sobre las consultas de nombres de dominio antes de que se establezca la conexión. Complementa otras herramientas en lugar de reemplazarlas.

Combinado con Wazuh o CrowdSec, Pi-hole gestiona el filtrado preventivo mientras las otras herramientas analizan el comportamiento de red y del sistema en tiempo real. Un contenedor comprometido que contacta un dominio de command-and-control conocido será bloqueado por Pi-hole — y la ausencia de respuesta DNS puede disparar una alerta en Wazuh si has configurado la monitorización de logs de Pi-hole.

Combinado con NetBird o WireGuard, Pi-hole puede convertirse en el resolver DNS de toda tu red mesh VPN privada. Cada dispositivo conectado a la VPN se beneficia entonces del filtrado, incluso desde un puesto de trabajo remoto.

Para alojar Pi-hole en un VPS con acceso root completo, IPv4 dedicada y Docker preinstalado, consulta los planes VPS de ServOrbit. Pi-hole v6 funciona cómodamente en el plan de entrada — los recursos consumidos son modestos y dejan espacio para el resto de tu stack.

Artículos relacionados: actualizaciones de seguridad automáticas en VPS Debian/Ubuntu, red VPN mesh sin puertos abiertos con NetBird, Wazuh SIEM open source en VPS.

Tu VPS para Pi-hole y tu stack autoalojada

Acceso root, IPv4 dedicada, Docker preinstalado. Pi-hole v6 funciona cómodamente en el plan de entrada y deja espacio para el resto de tu infraestructura.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva