techcsf/pihole-unbound

By techcsf

Updated 23 days ago

PiHole + Unbound

Image
Networking
0

1.4K

techcsf/pihole-unbound repository overview

📌 Pi-hole + Unbound Optimizado (Alpine)

Imagen unificada con Supervisor, caché ampliada, baja latencia y persistencia

Esta imagen combina Pi‑hole + Unbound en un único contenedor, con optimizaciones avanzadas de rendimiento, caché, seguridad y tiempos de respuesta.
Incluye:

  • Unbound totalmente configurado para resolución recursiva pura
  • Supervisor gestionando Pi‑hole FTL + Unbound
  • Caché ampliada (32m / 64m)
  • Prefetch, serve‑expired, EDNS optimizado
  • Persistencia completa en /etc-pihole, /etc-dnsmasq.d y /var/lib/unbound
  • Preparado para entornos domésticos y de alto rendimiento

🚀 Características principales

🔹 Unbound optimizado
  • Resolución recursiva real (sin forwarders)
  • Caché ampliada
  • Prefetch + serve‑expired para evitar lag
  • EDNS buffer ajustado a 1232
  • IPv6 desactivado para evitar timeouts
  • Root hints actualizados en /var/lib/unbound/root.hints
🔹 Pi-hole optimizado
  • DNS interno apuntando a Unbound (127.0.0.1#5335)
  • Caché DNS ampliada (10000)
  • Webserver en puerto 80 (mapeable externamente)
  • DNSSEC desactivado (Unbound ya valida)
🔹 Supervisord

Gestiona ambos servicios:

  • unbound -d -c /etc/unbound/unbound.conf
  • /usr/bin/start.sh (Pi-hole FTL)
🔹 Persistencia
  • /etc/pihole
  • /etc/dnsmasq.d
  • /var/lib/unbound

📦 Docker Compose recomendado

services:
  pihole-unbound:
    container_name: pihole-unbound
    image: techcsf/pihole-unbound:latest
    hostname: pihole
    restart: unless-stopped
    networks:
      - pi_hole
    sysctls:
      - net.core.somaxconn=2048
      - net.ipv4.tcp_fin_timeout=15
    privileged: true
    mem_limit: 1024m
    mem_reservation: 512m
    cpus: "2.0"
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8080:80"
    volumes:
      - ./etc-pihole:/etc/pihole
      - ./etc-dnsmasq.d:/etc/dnsmasq.d
      - ./unbound:/var/lib/unbound
    environment:
      TZ: "Europe/Madrid"
      WEBPASSWORD: ""
      PIHOLE_DNS_1: "127.0.0.1#5335"
      PIHOLE_DNS_2: ""
      DNSSEC: "false"
      DNS_BOGUS_PRIV: "true"
      DNS_FQDN_REQUIRED: "true"
      BLOCK_IPV6: "false"
      FTLCONF_webserver_port: "80"
      FTLCONF_dns_cache_size: "10000"
      OPTIMIZATION_LEVEL: "high"
      UNBOUND_FORWARDERS: ""
    healthcheck:
      test: ["CMD", "nc", "-z", "127.0.0.1", "5335"]
      interval: 60s
      timeout: 5s
      retries: 3
      start_period: 20s
    cap_add:
      - NET_ADMIN
    dns:
      - 127.0.0.1
      - 1.1.1.1

networks:
  pi_hole:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1500

⚙️ Variables de entorno

VariableValor por defectoDescripción
TZEurope/MadridZona horaria del contenedor.
WEBPASSWORD""Contraseña del panel web. Vacío = sin contraseña.
PIHOLE_DNS_1127.0.0.1#5335DNS primario de Pi‑hole apuntando a Unbound.
PIHOLE_DNS_2""DNS secundario. Se recomienda dejar vacío.
DNSSECfalseDebe ser false. Unbound ya valida DNSSEC.
DNS_BOGUS_PRIVtrueBloquea rangos privados no válidos.
DNS_FQDN_REQUIREDtrueRequiere dominios completos (evita consultas locales incorrectas).
BLOCK_IPV6falseDesactiva IPv6 en Pi‑hole.
FTLCONF_webserver_port80Puerto interno del servidor web.
FTLCONF_dns_cache_size10000Tamaño de la caché DNS de Pi‑hole FTL.
OPTIMIZATION_LEVELhighAjustes automáticos de rendimiento (low, medium, high).
UNBOUND_FORWARDERS""Lista de forwarders. Vacío = recursivo puro (recomendado).

🔐 Contraseña de la interfaz web

Puedes establecer la contraseña del panel web de Pi‑hole mediante:

WEBPASSWORD="tu_contraseña"

Si lo dejas vacío:

WEBPASSWORD=""

➡️ La interfaz web no pedirá contraseña.

También puedes cambiarla desde dentro del contenedor:

docker exec -it pihole-unbound pihole -a -p

🧩 Límite de recursos

Esta imagen está optimizada para funcionar incluso en hardware limitado, pero se recomiendan:

RecursoRecomendadoMínimo
RAM512–1024 MB256 MB
CPU1–2 cores1 core
Disco200 MB100 MB

En el compose ya se incluyen límites sugeridos:

mem_limit: 1024m
mem_reservation: 512m
cpus: "2.0"

Puedes ajustarlos según tu hardware.


🏗️ Arquitecturas soportadas

La imagen hereda las arquitecturas soportadas por pihole/pihole, normalmente:

  • amd64
  • arm64

Si tu plataforma está soportada por Pi‑hole, esta imagen funcionará sin cambios.


📂 Volúmenes y persistencia

CarpetaContenidoPersistente
/etc/piholeConfiguración Pi-hole
/etc/dnsmasq.dConfiguración DNS
/var/lib/unboundRoot hints, runtime

🧪 Healthcheck

Comprueba que Unbound responde en 127.0.0.1:5335.


🛠️ Troubleshooting

❗ Pi‑hole no arranca o el panel web no carga

Soluciones:

  • Ver logs: docker logs pihole-unbound
  • Verificar que el puerto 80 no está ocupado
  • En NAS (Synology/QNAP), desactivar servidor web interno

❗ Unbound no responde en el puerto 5335

Soluciones:

  • Probar: docker exec -it pihole-unbound dig @127.0.0.1 -p 5335 google.com
  • Verificar permisos en /var/lib/unbound
  • Comprobar que root.hints existe

❗ Resolución lenta o intermitente

Soluciones:

  • Asegurar do-ip6: no en unbound.conf
  • Actualizar root hints:
    docker exec pihole-unbound wget -O /var/lib/unbound/root.hints https://www.internic.net/domain/named.root
    
  • Ajustar MTU a 1500

❗ Los clientes no pueden resolver DNS

Soluciones:

  • Verificar que ningún servicio usa el puerto 53
  • Desactivar DNS forzado en el router
  • Mantener privileged: true

❗ Pi‑hole muestra “DNSSEC validation failed”

Solución:
Desactivar DNSSEC en Pi‑hole (DNSSEC=false).


❗ Alto consumo de RAM

Solución:
Reducir caché en unbound.conf:

msg-cache-size: 16m
rrset-cache-size: 32m

❗ Problemas en Raspberry Pi

Solución:
Reducir buffers:

so-rcvbuf: 1m
so-sndbuf: 1m

❤️ Créditos

Basado en Pi-hole + Unbound, con optimizaciones adicionales para rendimiento y estabilidad.

Tag summary

Content type

Image

Digest

sha256:8cf04b8c6

Size

59 MB

Last updated

23 days ago

docker pull techcsf/pihole-unbound:20260629