Saltar al contenido

Instalar Unbound en Docker

17/08/2025
Instalar Unbound en Docker

En este tutorial te voy a enseñar paso a paso y sin saltarnos nada cómo montar Unbound en un NAS TerraMaster (ARM64) usando Docker y Portainer, para que trabaje junto a AdGuard Home en tu Home Assistant.
Así conseguirás un resolutor recursivo puro que dará más privacidad y velocidad a tus consultas DNS.

Sí, AdGuard Home también se puede instalar en Docker y Portainer, pero he preferido hacerlo como complemento oficial de Home Assistant.
¿Por qué? Muy simple: el add-on ya está integrado directamente en Home Assistant, se configura más rápido, se actualiza solo junto con el sistema y me permite tenerlo todo centralizado sin tener que montar contenedores adicionales ni preocuparme por puertos, volúmenes o actualizaciones manuales.
Además, para lo que necesito, el rendimiento es exactamente el mismo que si lo montara en Docker.

Black Friday · Hasta un 40 % de descuento

Ofertas oficiales en domótica inteligente

Interruptores WiFi, relés, sensores, tiras LED y más, con descuentos en la tienda oficial Sonoff. Promoción activa hasta el 15 de diciembre.

Ver ofertas oficiales Enlace de afiliado · Tienda Sonoff

¿Se puede instalar Unbound en Home Assistant?

Actualmente, no existe un add-on oficial o mantenido de Unbound para Home Assistant OS o Home Assistant Supervised, lo que significa que no se puede instalar directamente desde la tienda de complementos. Aunque en el pasado hubo versiones no oficiales creadas por la comunidad, hoy en día la opción más sólida y mantenible es instalar Unbound en un equipo externo, como un NAS o un servidor con Docker y Portainer. De esta forma, Home Assistant puede seguir ejecutando AdGuard Home como complemento oficial y utilizar Unbound como su servidor DNS ascendente. Esta arquitectura no solo garantiza un mejor rendimiento y estabilidad, sino que también evita problemas de compatibilidad o mantenimiento que podrían surgir con soluciones no soportadas oficialmente.

Contexto del proyecto

Actualmente, en Home Assistant OS/Supervised ya no existe un add-on oficial o mantenido de Unbound, así que lo más fiable es instalarlo en otro equipo, en mi caso, el NAS TerraMaster.
La arquitectura final será así:

Clientes → AdGuard Home (HA 192.168.100.50) → Unbound (NAS 192.168.100.60) → Servidores raíz DNS

(Cambia las IPs por las tuyas —comentado en el código más abajo)

AdGuard seguirá filtrando y enviará las consultas a Unbound, que resolverá directamente desde los servidores raíz, sin pasar por DNS de terceros.

Requisitos previos

  • NAS TerraMaster F2-212 (CPU ARM64) con Portainer ya instalado.
  • Puerto 53 TCP/UDP libre en el NAS (si otro servicio lo usa, Unbound no arrancará).
  • IPs fijas:
    • NAS (Unbound): 192.168.100.60#cambiar esta ip para la de tu NAS
    • Home Assistant (AdGuard): 192.168.100.50#cambiar esta ip para la de tu Home Assistant
  • Imagen Docker: ghcr.io/klutchell/unbound:latest (multi-arch compatible ARM64).

📂 1. Crear carpeta de configuración en el NAS

En tu NAS, crea esta carpeta para guardar los archivos de configuración de Unbound:

/Volume1/DockerAppsData/unbound

Dentro de esa carpeta vamos a crear tres archivos:

a) unbound.conf

Este será el archivo principal de configuración (lo pongo completo más abajo).

b) root.hints

Como en TerraMaster no había curl ni wget, descárgalo desde tu PC:

c) root.key

Archivo vacío.
En el explorador de archivos, crea un archivo nuevo y llámalo root.key (sin contenido).


⚙ 2. Configuración probada de Unbound

Guarda este contenido en /Volume1/DockerAppsData/unbound/unbound.conf:

server:
    # logs visibles en Portainer
    use-syslog: no
    verbosity: 2

    # usuario y carpeta válidos en la imagen
    username: "unbound"
    directory: "/opt/unbound"

    # seguridad / privacidad
    hide-identity: yes
    hide-version: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    qname-minimisation: yes
    rrset-roundrobin: yes

    # DNSSEC
    auto-trust-anchor-file: "/opt/unbound/root.key"

    # caché / rendimiento
    msg-cache-size: 50m
    rrset-cache-size: 100m
    cache-min-ttl: 60
    cache-max-ttl: 86400
    prefetch: yes
    prefetch-key: yes

    # escucha
    interface: 0.0.0.0
    port: 53
    do-ip4: yes
    do-ip6: no
    do-udp: yes
    do-tcp: yes

    # permisos (tu LAN)
    access-control: 127.0.0.1/32 allow
    access-control: 192.168.86.0/24 allow
    access-control: 0.0.0.0/0 refuse

    # root hints (resolución desde raíz)
    root-hints: "/opt/unbound/root.hints"

    # nombres locales útiles
    local-zone: "lan." static
    local-data: "nas.lan. IN A 192.168.86.104"

    local-zone: "local." static
    local-data: "homeassistant.local. IN A 192.168.86.70"

Importante: No hay forward-zone: — esto es recursivo puro.

2.1. ¿Y si yo tengo AdGuard en Docker?

Si utilizas AdGuard Home en Docker y Portainer en lugar de como complemento de Home Assistant, no necesitas incluir la línea:

local-data: "homeassistant.lan. IN A 192.168.100.50"   #cambiar esta ip para la de tu Home Assistant  

Esta línea solo es necesaria si Home Assistant (y, por tanto, AdGuard) están en otro dispositivo de tu red y quieres que Unbound resuelva su nombre interno (homeassistant.lan).
Si todo está dentro del mismo sistema o no usas este nombre local, puedes omitirla sin problema.

Te lo explico claro:

  • Esa línea en unbound.conf crea un registro DNS local que asocia homeassistant.lan a la IP que le indiques.
  • En tu caso es útil porque AdGuard está en Home Assistant, y quieres que Unbound pueda resolver ese dominio local.
  • Si AdGuard y Unbound están en el mismo servidor o si el usuario no usa un dominio local personalizado para Home Assistant, se puede omitir sin problema.
  • En cambio, si alguien quiere que desde cualquier equipo de la red se pueda escribir homeassistant.lan y abrir el panel de HA, sí debería dejarla y ajustar la IP.

2.2. Dominios internos opcionales

En algunos casos puede ser útil añadir entradas extra en local-data para acceder fácilmente a dispositivos de tu red usando nombres personalizados en lugar de direcciones IP. Esto es completamente opcional:

  • No es necesario si el propio dispositivo ya resuelve su dominio interno (por ejemplo, www.asusrouter.com en routers ASUS).
  • Sí es útil si quieres un acceso más corto o uniforme, como router.lan o nas.lan, o si el dispositivo no ofrece su propio nombre DNS.

Ejemplos de entradas opcionales en unbound.conf:

Unbound no solo resuelve dominios públicos, también puede asignar nombres personalizados a dispositivos de tu red local.
Esto se hace con dos directivas:

  • local-zone: define un “área” de dominios que Unbound gestionará directamente sin preguntarlo fuera.
  • local-data: dentro de esa zona, asigna un nombre concreto a una IP.

Por ejemplo:

local-zone: "lan." static
local-data: "nas.lan. IN A 192.168.86.104"

local-zone: "local." static
local-data: "homeassistant.local. IN A 192.168.86.70"

Con esto:

  • Si escribes nas.lan en tu navegador, te abre la interfaz del NAS.
  • Si escribes homeassistant.local, accedes a Home Assistant.

💡 Truco: no uses .local si ya usas mDNS en tu red, puede dar conflictos; .lan es más “seguro”.

💡 Consejo: Si usas dispositivos que ya tienen un dominio propio que funciona (como www.asusrouter.com), no es necesario añadirlos. Esta técnica es principalmente para nombres personalizados o para dispositivos que no publican su propio dominio.


🐳 3. Despliegue en Portainer (Stack)

En PortainerStacksAdd stack, pega este docker-compose.yml:

version: "3.8"
services:
  unbound:
    image: ghcr.io/klutchell/unbound:latest
    platform: linux/arm64
    container_name: unbound
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - /Volume1/DockerAppsData/unbound:/opt/unbound
    cap_add:
      - NET_BIND_SERVICE
    # quita el healthcheck si te da guerra
    # healthcheck:
    #   test: ["CMD", "drill", "@127.0.0.1", "com", "NS"]
    #   interval: 30s
    #   timeout: 5s
    #   retries: 5

Pulsa Deploy the stack.
Si puedes, marca Re-pull image and redeploy para asegurarte de que usa la última versión.


🔍 4. Comprobar que Unbound arranca

En Containers → unbound → Logs deberías ver algo como:

[1547824586] unbound[1:0] notice: init module 0: validator
[1547824586] unbound[1:0] notice: init module 1: iterator
[1547824586] unbound[1:0] info: start of service (unbound 1.23.1).
[1547824586] unbound[1:0] info: generate keytag query _ta-4c43-9268. NULL IN
[1547824586] unbound[1:0] info: generate keytag query _ta-4c43-9268. NULL IN

Si no hay errores de root.hints not found o address already in use :53, todo va bien.


🧪 5. Probar que resuelve

Además de probar dominios públicos, conviene comprobar que Unbound resuelve también los nombres internos que has configurado con local-data. Esto asegura que la parte de DNS local está bien. Desde tu PC abre PowerShell (en Windows):

nslookup tecnoyfoto.com 192.168.86.104   #cambiar esta ip para la de tu NAS
nslookup homeassistant.local 192.168.86.104

El segundo comando debería devolver la IP local de tu Home Assistant.

6. Cómo utilizar Unbound en tu red doméstica

Una vez que Unbound está funcionando, tienes dos formas principales de integrarlo en tu red, dependiendo de si usas Home Assistant con AdGuard Home o no:

6.1 Usar solo Unbound (sin AdGuard)

Esta opción es ideal si:

  • No usas Home Assistant.
  • Quieres aprovechar el NAS para tener un DNS recursivo local.
  • Buscas simplicidad y baja latencia, sin filtrado de anuncios.

Cómo configurarlo:

  1. Entra en la configuración de tu router.
  2. Localiza la sección de DNS primario (o Servidor DNS).
  3. Introduce la IP de tu NAS donde corre Unbound (ej.: 192.168.86.104).
  4. Deja el DNS secundario vacío o pon otro servidor de confianza (ej. 1.1.1.1 de Cloudflare) como respaldo.

Flujo:

scssCopiarEditarClientes → Unbound (NAS) → Servidores raíz DNS

Ventaja:

  • Resolución directa desde servidores raíz, sin intermediarios.

Desventaja:

  • No tendrás filtrado de publicidad ni bloqueo de rastreadores.

6.2 Usar Unbound junto a AdGuard Home

Esta opción es la mejor si:

  • Usas Home Assistant y quieres el filtrado avanzado de AdGuard Home.
  • Deseas mantener control local y privacidad total usando Unbound como resolutor recursivo.

Cómo configurarlo:

  1. En AdGuard HomeConfiguración → DNS → Servidores ascendentes
    Introduce la IP de Unbound (192.168.86.104).
  2. Guarda y prueba que se resuelvan dominios correctamente.
  3. En el router, pon como DNS primario la IP de AdGuard (ej.: 192.168.86.70).
  4. No pongas DNS secundario para que todo pase siempre por AdGuard.

Flujo:

Clientes → AdGuard Home (HA) → Unbound (NAS) → Servidores raíz DNS

Ventaja:

  • Combinas filtrado de anuncios/rastreadores con resolución directa desde raíz.

Desventaja:

  • Ligeramente más latencia que usar Unbound solo (aunque casi imperceptible).

Sígueme a Youtube

instalar unbound en docker

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *