Skip to content

Infrastructure

Pi-hole: bloqueador de anuncios y filtro DNS a nivel de red

Resumen

Pi-hole es una solución de DNS-level ad-blocking que funciona como un servidor DNS en tu red local. Intercepta todas las solicitudes DNS de los dispositivos conectados y bloquea dominios clasificados como anuncios, malware o rastreadores, sin necesidad de instalar software en cada dispositivo. Se despliega típicamente en una Raspberry Pi (de ahí el nombre), aunque corre en cualquier Linux, contenedor Docker o VM. Útil para redes caseras, laboratorios, pequeñas oficinas o como infraestructura de seguridad en entornos de desarrollo.

¿Qué es Pi-hole?

Pi-hole es un servidor DNS que actúa como un proxy entre tus dispositivos y el DNS upstream (Google, Cloudflare, etc.). Cuando un dispositivo intenta resolver un dominio, Pi-hole consulta su lista de bloqueo (blocklist) y si el dominio está en ella, devuelve una respuesta NXDOMAIN o una IP local en lugar de permitir la conexión.

Diferencia clave con adblockers de navegador:

  • Los adblockers en el navegador solo filtran en ese navegador
  • Pi-hole funciona a nivel de DNS, bloqueando en toda la red y en todos los dispositivos, incluyendo apps móviles, IoT, etc.

Arquitectura

flowchart LR
    D1["Dispositivo 1
    PC"] --> DNS1["Pi-hole
    DNS Server"]
    D2["Dispositivo 2
    Móvil"] --> DNS1
    D3["Dispositivo 3
    IoT"] --> DNS1
    D4["Dispositivo 4
    TV"] --> DNS1
    DNS1 --> LIST{"Blocklist
    Verificación"}
    LIST -->|Bloqueado| BLOCK["NXDOMAIN
    o 0.0.0.0"]
    LIST -->|Permitido| UP["Upstream DNS
    Google/Cloudflare"]
    UP --> DNS1
    DNS1 --> D1
    DNS1 --> D2
    DNS1 --> D3
    DNS1 --> D4

Configuración en Docker

Para entornos de laboratorio o integración en stack de contenedores:

docker run -d \
  --name pihole \
  --net=host \
  -e TZ="Europe/Madrid" \
  -e WEBPASSWORD="your-password" \
  -e DNS1="1.1.1.1" \
  -e DNS2="1.0.0.1" \
  -p 53:53/tcp -p 53:53/udp \
  -p 80:80 \
  -v pihole_config:/etc/pihole \
  -v pihole_dnsmasq:/etc/dnsmasq.d \
  --restart unless-stopped \
  pihole/pihole:latest

O con docker-compose:

version: '3'
services:
  pihole:
    image: pihole/pihole:latest
    hostname: pihole
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80"
    environment:
      TZ: "Europe/Madrid"
      WEBPASSWORD: "your-secure-password"
      DNS1: "1.1.1.1"
      DNS2: "1.0.0.1"
    volumes:
      - pihole_config:/etc/pihole
      - pihole_dnsmasq:/etc/dnsmasq.d
    restart: unless-stopped

volumes:
  pihole_config:
  pihole_dnsmasq:

Instalación en TrueNAS Scale (Apps)

TrueNAS Scale incluye un catálogo de aplicaciones containerizadas. Pi-hole está disponible en TrueCharts, el repositorio comunitario de apps para TrueNAS.

Pasos para instalar Pi-hole en TrueNAS Scale

1. Agregar el repositorio de TrueCharts

Desde el dashboard de TrueNAS Scale:

Apps → Manage Catalogs → Add Catalog

Name: truecharts
Repository: https://github.com/truecharts/catalog
Branch: main
Preferred Trains: community

Apps → Discover → Buscar "Pi-hole"

Selecciona Pi-hole y haz click en Install.

3. Configuración de Pi-hole

En la pantalla de configuración, ajusta los siguientes parámetros:

Application Configuration:

Campo Valor Descripción
Application Name pihole Nombre del contenedor
Timezone Europe/Madrid Tu zona horaria local
Web Password •••••• Contraseña para el dashboard web (mínimo 8 caracteres)
Shared Memory Size 64 Tamaño de memoria compartida en MiB
4. Configuración de red

Network Configuration:

Parámetro Valor Propósito
WebUI Port 20720 Puerto alternativo para acceso web (evita conflictos con puerto 80)
Port Bind Mode Publish port on the host Permite acceso desde otros dispositivos
HTTPS Port 30132 Puerto HTTPS del dashboard
DNS Port 53 Puerto DNS (estándar)
DNS Bind Mode Publish port on the host Hace disponible DNS en toda la red
Host IP (DNS) 192.168.xx.xx IP del TrueNAS donde responde DNS

Note

El puerto DNS (53) debe estar disponible en la red. Si otro servicio lo usa, cámbialo a uno > 1024 (ej: 5353), pero entonces los clientes necesitan configurar ese puerto específicamente.

5. Configuración de almacenamiento

Storage Configuration:

Volumen Tipo Descripción
Pi-Hole Config ixVolume Dataset automático para /etc/pihole
Pi-Hole DNSMASQ Config ixVolume Dataset automático para /etc/dnsmasq.d

Activa Enable ACL en ambos para permisos adecuados.

6. Configuración de recursos

Resources Configuration:

Recurso Valor Nota
CPUs 2 Suficiente para resolver ~5k consultas/min
Memory 4096 MB (4 GB) Mínimo para cache DNS decente

Warning

No asignes todos los cores del servidor. Deja al menos 2 cores libres para TrueNAS. Monitorea uso real con Apps → Installed Applications → Pi-hole → Resources.

7. Desplegar

Haz click en Install. TrueNAS crea el contenedor, lo inicia y gestiona automáticamente su ciclo de vida.

8. Acceder al dashboard

Una vez desplegado (estado "Running"), accede a:

http://<IP-truenas>:20720/admin

O si usaste puerto 80:

http://<IP-truenas>/admin

Contraseña: la que configuraste en Web Password.

Ventajas de instalación en TrueNAS Scale

  • Almacenamiento integrado: Los datos de Pi-hole se guardan en datasets ZFS con snapshots automáticos
  • Aislamiento: Corre en contenedor sin afectar al OS de TrueNAS
  • Gestión centralizada: Actualización, reinicio y logs desde el dashboard de TrueNAS
  • Persistencia: La configuración se mantiene incluso si TrueNAS se reinicia
  • Fácil respaldo: Snapshot automático del dataset con tank/ix-applications/pihole

Monitoreo en TrueNAS

Desde Apps → Installed Applications → Pi-hole:

Status: Running / Stopped
Resources: CPU, RAM, Network I/O
Logs: Ver stdout/stderr en tiempo real
Actions: Restart, Stop, Shell

Para ver logs en tiempo real:

# Desde Advanced → Shell en TrueNAS
kubectl logs -f -n ix-pihole deployment/pihole

Note

Si usas TrueNAS Core (no Scale), necesitas ejecutar Pi-hole como contenedor Docker independiente o instalarlo directamente en FreeBSD. TrueNAS Core no tiene el catálogo de Apps integrado.

Configurar dispositivos para usar Pi-hole

En el router (opción recomendada)

Configura el DNS primario en tu router WiFi/LAN para que apunte a la IP de Pi-hole. Así todos los dispositivos usan automáticamente Pi-hole como DNS sin configuración individual.

Router → Settings → DHCP → Primary DNS: <IP-de-pihole>

En dispositivos individuales

Si no puedes modificar el router:

Windows:

Settings → Network & Internet → Change adapter options → 
IPv4 Properties → Use these DNS servers: <IP-pihole>

macOS / Linux:

# En /etc/resolv.conf
nameserver <IP-pihole>

iPhone / iPad:

Settings → WiFi → [Tu red] → Configure DNS → Manual
Add DNS Server: <IP-pihole>

Gestionar listas de bloqueo

Dashboard web

Accede a http://<IP-pihole>/admin

En Settings → Adlists:

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://adaway.org/hosts.txt
https://www.claudedrake.de/amalgamated_hosts.txt

Estas son listas comunitarias verificadas de dominios de anuncios y malware.

Agregar dominios personalizados

En Whitelist / Blacklist:

  • Whitelist: dominios que quieres permitir (útil para desbloquear un sitio bloqueado por error)
  • Blacklist: dominios adicionales que quieres bloquear
# Ejemplo: bloquear un rastreador específico
tracker.example.com
analytics.badcompany.net

Buenas prácticas

  • Backup del dashboard: exporte la configuración regularmente desde Settings → Teleport
  • Monitorización: revisa el panel Query Log periódicamente para detectar patrones anómalos
  • Actualizar listas: agrega listas comunitarias confiables pero no todas a la vez; prueba el impacto en experiencia de usuario
  • HA en pequeña escala: despliega una segunda instancia de Pi-hole como fallback en caso de que la primera no esté disponible

Warning

Algunos servicios legítimos pueden estar bloqueados por listas demasiado agresivas. Si una app o web no funciona correctamente tras instalar Pi-hole, verifica el Query Log para confirmar que el dominio está siendo bloqueado y añádelo a la whitelist.

Note

Pi-hole es software de código abierto. Revisa periódicamente el repositorio GitHub para actualizaciones de seguridad y nuevas blocklists comunitarias.

Casos de uso comunes

  • Red doméstica: reduce publicidad y rastreadores sin adblocks de navegador
  • Laboratorio de seguridad: simula comportamiento de malware analizando qué dominios intenta contactar
  • Red corporativa pequeña: filtrado de contenido inapropiado a nivel de DNS
  • IoT: bloquea conexiones no deseadas de dispositivos smart home

Referencias

TrueNAS: almacenamiento de datos escalable con ZFS

Resumen

TrueNAS es un sistema de almacenamiento en red (NAS) de código abierto basado en ZFS, construido sobre FreeBSD o Linux. Proporciona almacenamiento centralizado, snapshots, replicación, y acceso a datos vía SMB/NFS/iSCSI para pequeñas oficinas, laboratorios y entornos empresariales. Se despliega en hardware propio o virtualizado, y su modelo de gestión es muy intuitivo: desde el dashboard web configuran desde la capacidad de almacenamiento hasta políticas de respaldo y acceso de usuarios.

¿Qué es TrueNAS?

TrueNAS es un appliance de almacenamiento basado en ZFS (filesystem con capacidades avanzadas como snapshots, compresión y deduplicación). Corre sobre un OS Linux (TrueNAS Core/Scale) o FreeBSD (TrueNAS Enterprise) y proporciona:

  • Almacenamiento centralizado: acceso desde múltiples clientes (Windows, macOS, Linux)
  • Snapshots y replicación: backup y DR integrado
  • Gestión de datos: cuotas, compresión, deduplicación
  • Escalabilidad: desde 2 bahías hasta sistemas multi-exabyte
flowchart LR
    C1["Cliente Windows
    SMB"] --> NAS["TrueNAS
    ZFS Storage"]
    C2["Cliente Linux
    NFS"] --> NAS
    C3["Cliente iSCSI
    SAN"] --> NAS
    NAS --> POOL["Storage Pool
    RAID-Z"]
    POOL --> DISK1["Disk 1"]
    POOL --> DISK2["Disk 2"]
    POOL --> DISK3["Disk 3"]
    POOL --> DISK4["Disk 4"]

Variantes de TrueNAS

Variante Base OS Licencia Uso
TrueNAS Core FreeBSD Open Source Laboratorio, hogar, PYME
TrueNAS Scale Linux (Debian) Open Source Entornos modernos, Kubernetes
TrueNAS Enterprise FreeBSD Comercial Empresas con soporte SLA

Instalación en hardware propio

Requisitos mínimos

  • CPU: x86-64 moderno (Intel/AMD)
  • RAM: 8GB mínimo (16GB recomendado)
  • Almacenamiento: 2+ discos SATA/SAS de 2TB+
  • Red: Gigabit Ethernet

Pasos de instalación

  1. Descargar imagen ISO: desde truenas.com/downloads
  2. Crear USB instalable: con Etcher o dd
  3. Bootear desde USB y seguir el instalador
  4. Configurar red: IP estática, gateway, DNS
  5. Acceder al dashboard: https://<IP-truenas>:6000

Configuración inicial: crear un Pool de almacenamiento

Desde el dashboard web:

Storage → Create Pool:

Pool name: tank (nombre convencional)
Disks: Seleccionar mínimo 2 discos
Layout: RAID-Z1 (redundancia 1 disco)
      o RAID-Z2 (redundancia 2 discos para pools grandes)

Esquema de RAID-Z recomendado

Discos Layout Capacidad útil Redundancia
4 RAID-Z1 3 discos 1 fallo
6 RAID-Z2 4 discos 2 fallos
8 RAID-Z3 5 discos 3 fallos

Crear datasets y comparticiones

Dataset (contenedor lógico)

Storage → Datasets → Add Dataset
Name: tank/homes
Encryption: On (recomendado)

Compartición SMB (para Windows/macOS)

Sharing → Windows Shares (SMB) → Add
Dataset: tank/homes
Name: homes
Purpose: Default share
Permissions: Administrador (propietario)

Los usuarios acceden vía \\<IP-truenas>\homes en Windows.

Compartición NFS (para Linux)

Sharing → Unix (NFS) Shares → Add
Dataset: tank/homes
Mapall User: nobody
Path: /mnt/tank/homes

Los clientes Linux montan: mount -t nfs <IP-truenas>:/mnt/tank/homes /mnt/homes

Point-in-time recovery y replicación

Crear recuperación puntual automática (Point-in-time Snapshots)

TrueNAS crea versiones puntuales de los datasets en momentos específicos. Estos NO son backups completos, sino "fotografías" del estado del filesystem que permiten restaurar archivos a un momento anterior si se modifican o se borran accidentalmente.

Tasks → Periodic Snapshot Tasks
Dataset: tank/homes
Schedule: Daily at 2:00 AM
Retention: Keep last 7 days

Replicar a otro TrueNAS (backup remoto)

Para backup verdadero, la replicación copia los datos hacia otra instancia de TrueNAS (o almacenamiento remoto):

Tasks → Replication Tasks
Source Dataset: tank/homes
Target: <IP-otro-truenas>:/mnt/backup/homes
Schedule: Daily after snapshot

Note

Las versiones puntuales (snapshots) NO ocupan espacio inicial en ZFS; crece bajo demanda según cambios. Son ideales para recuperación rápida de archivos eliminados, no para DR. Para disaster recovery, necesitas replicación o backup remoto.

Actualización de software de TrueNAS

TrueNAS SCALE usa "trains" (ramas de actualización) que siguen caminos de versiones lineales. Desde System → Update:

Perfiles disponibles

  • Stable: Versiones probadas y recomendadas (default para producción)
  • Nightly: Versiones en desarrollo diario (solo testing)
  • Release Candidate: Candidatos a versión estable

Proceso de actualización

  1. Antes de actualizar: crear un backup de configuración

    System → General → Save Configuration
    ✅ Marcar: Export Password Secret Seed
    

  2. Realizar actualización:

    System → Update → Check for Updates
    → Install Update
    

  3. Durante la actualización: TrueNAS descarga archivos y reinicia automáticamente

  4. Después: limpiar caché del navegador (CTRL+F5) antes de loguear

Warning

Actualiza durante ventanas de mantenimiento programado. Los clientes desconectados durante la actualización experimentarán un corte de servicio. Todos los parámetros auxiliares pueden cambiar entre versiones mayores; revisa la documentación de cambios (release notes) antes de actualizar.

Instalación de apps en TrueNAS Scale

TrueNAS Scale incluye TrueCharts o iX Apps —catálogos de aplicaciones containerizadas que corren en Kubernetes integrado.

Apps → Discover Apps → [Buscar aplicación]
    → Install → Configurar
    → Deploy

Las apps comparten el almacenamiento de TrueNAS directamente, útil para servicios como Pi-hole, Plex, Home Assistant, etc.

Monitoreo y alertas

Dashboard → Reporting:

  • Uso de almacenamiento en tiempo real
  • Temperatura y estado de discos
  • Performance (IOPS, throughput)

Sistema → Settings → Email:

Configura notificaciones automáticas si:

  • Un disco falla
  • Capacidad del pool > 85%
  • Temperatura de discos alta

Buenas prácticas

  • Planifica capacidad: deja 10-20% de espacio libre en el pool para que ZFS funcione óptimamente
  • Monitorea salud: revisa el estado de discos regularmente desde Storage → Disks
  • Respalda la configuración: System → General → Save Configuration
  • Actualiza regularmente: System → Update → Check for Updates
# Desde shell (Advanced → Shell), ver estado del pool
zpool status tank

# Ver dataset usage
zfs list -o space

Warning

NO añadas discos a un pool existente esperando aumentar capacidad. Los RAID-Z no se pueden expandir; necesitas migrar a un nuevo pool o usar RAID concatenado (no recomendado). Planifica el tamaño inicial correctamente.

Referencias