Pi-Hole en homelab con Docker y red macvlan

Pihole Homelab Docker Macvlan

Hace ya más de un año que empecé con el proyecto del homelab. La verdad que en mis inicios lo sobrecompliqué todo: instalé Proxmox con varios contenedores, un router virtual, servicios que no necesitaba y un sinfín de rabbit holes que, si bien no fueron tan útiles al final, me sirvieron para aprender y acabar simplificando bastante las cosas.

Si Google o alguna IA te ha traído hasta aquí, probablemente ya sepas qué es un servidor DNS y qué es Pi-Hole, pero por si acaso, hago una intro rápida.

¿Qué es un servidor DNS y qué es Pi-Hole?

Un servidor DNS (Domain Name System) traduce nombres de dominio (como google.com) a direcciones IP que entienden los ordenadores (como 142.250.185.14). Es como la guía telefónica de internet.

Algunos ejemplos de servidores DNS:

Pi-Hole se coloca en medio de esta comunicación, interceptando todas las peticiones DNS que hacen los dispositivos de tu red local, y bloqueando aquellas que están en listas negras (trackers, publicidad, malware, etc.).

Mi homelab y mi uso concreto

Mi homelab es simple:

  • Un ordenador principal con Arch Linux (host del homelab)
  • Un MacBook Air
  • El router del operador (sin modificar)
  • Otros dispositivos conectados: portátil de mi pareja, móviles, TV, Google Home Mini…

¿Qué quiero conseguir?

Quiero que un contenedor Docker con Pi-Hole actúe como servidor DNS para toda mi red local.

Diagrama Homelab Pihole Dns Server Dokcer Macvlan

Para evitar enrutar tráfico DNS desde mi host al contenedor, uso una red macvlan. Esto le da a Pi-Hole una IP propia dentro de la red local, como si fuera un dispositivo más.

¿Por qué usar Pi-Hole y cambiar los DNS?

Privacidad

Sin darte cuenta, todas tus consultas DNS suelen ir directamente a tu proveedor de internet (ISP), porque así viene configurado el router por defecto. Esos datos luego se venden para crear perfiles y segmentarte con publicidad.

Con Pi-Hole:

  • Reduces el rastreo.
  • Ganas privacidad.
  • Filtras contenido malicioso antes de que llegue a tus dispositivos.

Seguridad

Un servidor DNS comprometido puede redirigir tus peticiones a sitios maliciosos sin que lo notes. Pi-Hole actúa como una capa de defensa adicional.

Rendimiento

Pi-Hole mantiene una caché de peticiones, así que muchas respuestas se resuelven más rápido sin necesidad de salir de tu red.

Red macvlan en Docker

Este tipo de red sólo funciona en Linux. En Windows o macOS no es compatible directamente. Si no usas Linux, más abajo te doy una alternativa.

Una red macvlan permite que el contenedor tenga su propia IP dentro de la red local. Lo bueno: cada contenedor se comporta como si fuera un dispositivo más en la red. Lo malo: hay que hacer algún truquito para que el host y el contenedor se puedan comunicar.

¿Por qué el contenedor no puede comunicarse con el host?

Por diseño del kernel de Linux, la interfaz del host y la del contenedor en red macvlan están aisladas. No se pueden comunicar entre sí directamente.

Mas información sobre la red maclvland docker en su documentación oficial: https://docs.docker.com/engine/network/drivers/macvlan/

Para solucionarlo, más abajo creo una interfaz virtual (macvlan-shim) que actúa de puente.

Conexion Homelab pihole

Instalación

Asumo que tienes Docker instalado y sabes lo básico. Aquí vamos al grano.

Crear red macvlan

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \ # subnet de la red
  --gateway=192.168.1.1 \ # ip del router
  -o parent=enp7s0 \ # la internace por la que recibes internet, en mi caso ethernet
  --ip-range=192.168.1.240/28 \  # rango de la red
  pihole_macvlan # nombre de la red

Crear directorios persistentes

mkdir -p ~/docker/pihole/etc-pihole
mkdir -p ~/docker/pihole/etc-dnsmasq.d

Crear docker-compose.yml

services:
  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    hostname: pihole
    restart: unless-stopped
    networks:
      pihole_net:
        ipv4_address: 192.168.1.250 # asignacion manual de la ip del contenedor
    volumes: #montaje de los volumenes para persistencia
      - ./etc-pihole:/etc/pihole
      - ./etc-dnsmasq.d:/etc/dnsmasq.d
    environment:
      TZ: Europe/Madrid
      WEBPASSWORD: "cambiala123"
      DNSMASQ_LISTENING: all
      DNS1: 9.9.9.9 #no nos preocupamos mucho por eso, se puede cambiar luego
      DNS2: 149.112.112.112 
    cap_add:
      - NET_ADMIN

networks:
  pihole_net:
    external: true
    name: pihole_macvlan #red que previamente hemos creado.

Después, levanta el contenedor:

# Comprobar que estamos en el directorio ~/docker/pihole
# si hacemos ls, deberiamos ver dos carpetas (etc-pihole y etc-dnsmasq.d) y el docker-compose.yml
docker-compose up -d

Acceder desde el host

No podrás entrar desde 192.168.1.250 si estás en el mismo host. Para solucionarlo:

sudo ip link add macvlan-shim link enp7s0 type macvlan mode bridge
sudo ip addr add 192.168.1.251/32 dev macvlan-shim
sudo ip link set macvlan-shim up
sudo ip route add 192.168.1.250 dev macvlan-shim

Si quieres saber que es lo que hace paso a paso, copia y pregunta a ChatGPT o Claude, que te lo van a exlicar mejor que yo, pero basicmamente lo que hace es que cuando tu host este buscando la ip 192.168.1.250 lo enrute a macvlan-shim que es donde esta conectado nuestro contenedor docker con pihole.

Ahora ya debería ir todo bien y podrás acceder a http:///192.168.1.250/admin desde el host.

Opción sin macvlan (modo bridge)

Si usas Windows o mac, o no quieres complicarte:

Si quieres saber que es lo que hace paso a paso, copia y pregunta a ChatGPT o Claude, que te lo van a exlicar mejor que yo, pero basicmamente lo que hace es que cuando tu host este buscando la ip 192.168.1.250 lo enrute a macvlan-shim que es donde esta conectado nuestro contenedor docker con pihole.

Ahora ya debería ir todo bien y podrás acceder a http:///192.168.1.250/admin desde el host.

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    restart: unless-stopped
    environment:
      TZ: "Europe/Madrid"
      WEBPASSWORD: "cambiala123"
      DNS1: 1.1.1.1
      DNS2: 1.0.0.1
    volumes: #montaje de los volumenes para persistencia
      - ./etc-pihole:/etc/pihole
      - ./etc-dnsmasq.d:/etc/dnsmasq.d
    ports:
      - "53:53/tcp"        # DNS TCP
      - "53:53/udp"        # DNS UDP
      - "80:80"            # Panel web
    cap_add:
      - NET_ADMIN

Recuerda abrir los puertos en el firewall si es necesario.

Configuración básica de Pi-Hole

Nada más instalarlo, accede a http://192.168.1.250/admin. Usa el comando pihole setpassword desde dentro del contenedor para cambiar la contraseña.

Pihole Admin Panel Overview

Te recomiendo revisar:

  • Settings > DNS para seleccionar tus proveedores DNS preferidos
  • Group Management > Adlists para gestionar listas de bloqueo

Qué DNS uso

Yo uso Quad9 (9.9.9.9 y 149.112.112.112). No tengo una razón técnica concreta más allá de que me generan más confianza y su política de privacidad es bastante clara.

Pihole Settings Dns

Listas de bloqueo

Las que vienen por defecto ya bloquean bastante, pero puedes añadir otras desde Blocklist Project. Hay listas temáticas para trackers, anuncios, malware, juegos de azar, etc.

Pihole List

Configurar DNS en el router y dispositivos

Router

Entra en 192.168.1.1, busca la configuración DNS y pon:

  • DNS 1: 192.168.1.250
  • DNS 2: 9.9.9.9 (respaldo)

Reinicia el router tras guardarlo.

Dispositivos

Normalmente toman los DNS por DHCP (modo automático). Si los has configurado manualmente, cámbialos a:

  • DNS 1: 192.168.1.250
  • DNS 2: 9.9.9.9

Consideraciones adicionales

Navegadores y DNS over HTTPS (DoH)

Chrome y Firefox a veces fuerzan el uso de DoH (DNS sobre HTTPS), lo que hace que las peticiones DNS no pasen por Pi-Hole. En Chrome, puedes desactivar esto desde:

chrome://settings/security > Usar DNS seguro

Google Chrome Dns Secure

Desactívalo o usa un proveedor actual del servicio “With your current service provider”

iCloud Private Relay

Si tienes dispositivos Apple, desactiva iCloud Private Relay. Este servicio redirige el tráfico DNS por sus propios servidores y por defecto en la lista que viene por defecto de pihole, el trafico hacia estos servicios de icloud estan blouqeados, estos dominios son: mask.icloud.com o similares

Tanto en chrome con cloudflare o safari/apple con icloud, tienes dos opciones, o enviar tu trafico dns a través de ellos, de modo que en pihole solo veras peticiones a esos dominios no a los dominos que realmente visitas y derivas en ellos tu privacidad y tus seguridad, o los desactivas y usas pihole.

Documentación oficial de apple sobre cómo funciona el relay privado de icloud

Conclusión

Este setup puede parecer un poco lioso al principio, pero una vez configurado, tener Pi-Hole en tu red es una de esas pequeñas mejoras que notas a diario. Menos anuncios, más privacidad, y control total sobre el tráfico DNS en tu red.

Si has llegado hasta aquí y has montado todo con éxito: enhorabuena. Mandame un email si tienes dudas o quieres comentar algo.