Communitygithub.com

homelab-pihole-dns

Instalación de Pi-hole, gestión de listas de bloqueo, configuración de DNS-over-HTTPS, integración con DHCP, registros DNS locales y resolución de problemas de resolución DNS en una red doméstica. Utilízalo cuando la tarea involucre explícitamente Pi-hole: instalarlo, gestionar listas de bloqueo, configurar DoH o DHCP, agregar registros DNS locales o diagnosticar problemas de resolución DNS con Pi-hole en el camino.

¿Qué es homelab-pihole-dns?

Esta habilidad proporciona una guía completa para instalar y configurar Pi-hole, un bloqueador de anuncios a nivel de red que se ejecuta en Raspberry Pi o cualquier host Linux. Cubre desde la instalación mediante Docker (recomendada) y bare-metal, hasta la configuración de listas de bloqueo, DNS-over-HTTPS (DoH) con cloudflared, registros DNS locales y la integración con DHCP. También incluye una sección detallada de resolución de problemas con comandos prácticos y antipatrones a evitar, como depender de una sola instancia de Pi-hole sin plan de contingencia. Es ideal para homelabs y entornos de red doméstica donde se busca bloquear publicidad y malware a nivel de red sin necesidad de extensiones en cada dispositivo.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/homelab-pihole-dns

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Homelab Pi-hole DNS

Pi-hole es un bloqueador de anuncios DNS a nivel de red que se ejecuta en una Raspberry Pi o cualquier host Linux. Cada dispositivo de tu red obtiene bloqueo automático de anuncios y dominios maliciosos, sin necesidad de una extensión de navegador.

Cuándo Usarlo

  • Instalando Pi-hole en una Raspberry Pi o host Linux
  • Configurando Pi-hole como servidor DNS para una red doméstica
  • Agregando o gestionando listas de bloqueo
  • Configurando resolutores ascendentes DNS-over-HTTPS (DoH)
  • Creando registros DNS locales (ej. nas.home.lan, pi.home.lan)
  • Solucionando problemas de dispositivos que pierden acceso a Internet después de instalar Pi-hole
  • Ejecutando Pi-hole junto con DHCP o en su lugar

Cómo Funciona Pi-hole

Flujo normal (sin Pi-hole):
  Dispositivo → solicita ads.tracker.com → ISP DNS → IP real → se cargan anuncios

Con Pi-hole:
  Dispositivo → solicita ads.tracker.com → Pi-hole DNS → bloqueado (devuelve 0.0.0.0) → sin anuncio

Todas las consultas DNS pasan primero por Pi-hole.
Pi-hole las compara contra las listas de bloqueo.
Los dominios bloqueados devuelven una respuesta nula: el anuncio/rastreador nunca se carga.
Los dominios permitidos se reenvían a tu resolutor ascendente (Cloudflare, Google, etc.).

Instalación

Docker (Recomendado)

Docker es la forma más sencilla de instalar Pi-hole y facilita las actualizaciones y las copias de seguridad.

# docker-compose.yml
services:
  pihole:
    image: pihole/pihole:<etiqueta-de-versión-fijada>
    container_name: pihole
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"          # Administración web
    environment:
      TZ: "America/New_York"
      WEBPASSWORD: "${PIHOLE_WEBPASSWORD}"   # configurado mediante archivo .env o secreto
      PIHOLE_DNS_: "1.1.1.1;1.0.0.1"
      DNSMASQ_LISTENING: "all"
    volumes:
      - "./etc-pihole:/etc/pihole"
      - "./etc-dnsmasq.d:/etc/dnsmasq.d"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN              # solo necesario si Pi-hole servirá DHCP

Reemplaza <etiqueta-de-versión-fijada> con una etiqueta de lanzamiento actual de Pi-hole antes de desplegar. Evita latest para infraestructura DNS de larga duración para que las actualizaciones sean deliberadas y revisables.

Establece PIHOLE_WEBPASSWORD en un archivo .env junto a docker-compose.yml, cambia sus permisos a 600 y mantenlo fuera de git: no pongas la contraseña directamente en el archivo compose.

Accede a la administración web en: http://<ip-de-la-pi>/admin

Instalación Directa (Raspberry Pi OS / Debian / Ubuntu)

Pi-hole requiere una IP estática antes de instalarlo.

# Paso 1: Asignar una IP estática (editar /etc/dhcpcd.conf en Pi OS)
sudo nano /etc/dhcpcd.conf
# Agregar al final:
interface eth0
static ip_address=192.168.3.2/24
static routers=192.168.3.1
static domain_name_servers=192.168.3.1

# Paso 2: Descargar e inspeccionar el instalador antes de ejecutarlo.
# Prefiere el paquete o la ruta de instalación documentada por Pi-hole para tu SO/versión.
curl -sSL https://install.pi-hole.net -o pi-hole-install.sh
less pi-hole-install.sh   # revisar antes de continuar

# Paso 3: Ejecutar
bash pi-hole-install.sh

# Sigue el instalador interactivo:
# 1. Seleccionar interfaz de red (eth0 para cableada — recomendada)
# 2. Seleccionar DNS ascendente (Cloudflare o dejar por defecto — se puede cambiar después)
# 3. Confirmar IP estática
# 4. Instalar la interfaz de administración web (recomendado)
# 5. Anotar la contraseña de administrador que se muestra al final

Apuntando tu Red a Pi-hole

# Método 1: Cambiar el DNS en la configuración DHCP del router (recomendado)
  Interfaz de administración del router → Configuración DHCP → Servidor DNS
  DNS primario: 192.168.3.2  (IP de Pi-hole)
  DNS secundario: dejar vacío para bloqueo estricto, o usar un segundo Pi-hole.
                 Un fallback público como 1.1.1.1 mejora la disponibilidad durante
                 el despliegue, pero puede eludir el bloqueo porque los clientes podrían consultarlo.

  Todos los dispositivos obtienen Pi-hole como DNS automáticamente en la próxima renovación de DHCP.
  Forzar renovación: reconectar Wi-Fi o ejecutar 'sudo dhclient -r && sudo dhclient' en Linux

# Método 2: DNS por dispositivo (útil para probar antes del despliegue en toda la red)
  Windows: Panel de control → Adaptador de red → Propiedades de IPv4 → configurar DNS manualmente
  macOS: Configuración del Sistema → Red → Detalles → DNS → configurar manualmente
  Linux: /etc/resolv.conf o NetworkManager

# Método 3: Pi-hole como servidor DHCP (reemplaza el DHCP del router)
  Administración de Pi-hole → Configuración → DHCP → Habilitar
  Deshabilita primero el DHCP del router: dos servidores DHCP en la misma red causan conflictos
  Ventaja: la resolución de nombres de host funciona automáticamente (los dispositivos registran sus nombres)

Gestión de Listas de Bloqueo

# Administración de Pi-hole → Listas de anuncios → Agregar nueva lista de anuncios

# Listas de bloqueo recomendadas:
  https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
  # predeterminada: más de 200k dominios

  https://blocklistproject.github.io/Lists/malware.txt
  # dominios de malware

  https://blocklistproject.github.io/Lists/tracking.txt
  # rastreo/telemetría

# Después de agregar una lista:
  Herramientas → Actualizar Gravity (descarga y compila todas las listas de bloqueo)

# Si un sitio está bloqueado que no debería (falso positivo):
  Administración de Pi-hole → Lista blanca → Agregar dominio
  Ejemplo: api.my-legitimate-service.com

# Ver qué se está bloqueando en tiempo real:
  Panel → Registro de consultas (transmisión en vivo de consultas DNS con estado de bloqueo/permitido)

DNS-over-HTTPS Ascendente

DNS-over-HTTPS cifra tus consultas DNS para que tu ISP no pueda ver qué sitios resuelves.

# Instalar cloudflared (proxy DoH de Cloudflare).
# Prefiere el repositorio de paquetes de Cloudflare para verificación automática de paquetes firmados.
# Si descargas un binario directamente, fija una versión y verifica su suma de verificación.
CLOUDFLARED_VERSION="<versión-fijada>"
curl -LO "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64"
# Verifica la suma de verificación/firma de las notas de lanzamiento de Cloudflare antes de instalar.
sudo mv cloudflared-linux-arm64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared

# Crear configuración de cloudflared
sudo mkdir -p /etc/cloudflared
sudo tee /etc/cloudflared/config.yml << EOF
proxy-dns: true
proxy-dns-port: 5053
proxy-dns-upstream:
  - https://1.1.1.1/dns-query
  - https://1.0.0.1/dns-query
EOF

# Crear servicio systemd
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

# Ahora apunta Pi-hole al proxy DoH local:
# Administración de Pi-hole → Configuración → DNS → DNS ascendente personalizado
# Establecer en: 127.0.0.1#5053
# Desmarcar todos los demás resolutores ascendentes

Registros DNS Locales

Haz que tus servicios sean accesibles por nombre (ej. nas.home.lan, grafana.home.lan).

Nota sobre nombres de dominio: .home.lan se usa ampliamente en homelabs y funciona en la práctica. El sufijo reservado por el IETF para uso local es .home.arpa (RFC 8375) — úsalo para cumplir con el estándar. Evita .local para registros DNS de Pi-hole, ya que entra en conflicto con mDNS/Bonjour.

# Administración de Pi-hole → DNS Local → Registros DNS

  Dominio              IP
  nas.home.lan        192.168.30.10
  pi.home.lan         192.168.30.2
  grafana.home.lan    192.168.30.3
  proxmox.home.lan    192.168.30.4

# Desde cualquier dispositivo de tu red:
  ping nas.home.lan        → 192.168.30.10
  http://grafana.home.lan  → tu panel de Grafana

# Para subdominios, agrega un CNAME:
  Administración de Pi-hole → DNS Local → Registros CNAME
  Dominio: portainer.home.lan → Destino: pi.home.lan

Solución de Problemas

# Pi-hole bloqueando algo que no debería
pihole -q example.com          # Verificar si el dominio está bloqueado y en qué lista
pihole -w example.com          # Agregar a lista blanca inmediatamente

# DNS no resuelve en absoluto
pihole status                  # Verificar si pihole-FTL se está ejecutando
dig @192.168.3.2 google.com   # Probar DNS directamente contra Pi-hole

# Reiniciar DNS de Pi-hole
pihole restartdns

# Ver registros de consultas para un dispositivo específico
pihole -t                      # Seguimiento en vivo de todas las consultas
# O filtrar por cliente en el Registro de consultas de la administración web

# Actualizar gravity de Pi-hole (refrescar listas de bloqueo)
pihole -g

Antipatrones

# MALO: Depender de un solo Pi-hole sin una ruta de recuperación
# Si Pi-hole se bloquea o la Pi pierde energía, el DNS puede dejar de funcionar
# BUENO: Mantener un fallback documentado en el router para retroceder durante la configuración
# MEJOR: Ejecutar dos instancias de Pi-hole para redundancia; evitar DNS público de respaldo para bloqueo estricto

# MALO: Instalar Pi-hole sin una IP estática
# Si la Pi obtiene una nueva IP por DHCP, todos los dispositivos pierden DNS
# BUENO: Configurar IP estática primero, luego instalar Pi-hole

# MALO: Habilitar DHCP de Pi-hole sin deshabilitar primero el DHCP del router
# Dos servidores DHCP en la misma red entregan IPs conflictivas
# BUENO: Deshabilitar el DHCP del router, luego habilitar el DHCP de Pi-hole

# MALO: Nunca actualizar gravity (listas de bloqueo)
# Se acumulan nuevos dominios de anuncios y malware; las listas desactualizadas los pasan por alto
# BUENO: Programar actualización semanal de gravity: pihole -g (o habilitar en Configuración → API)

Buenas Prácticas

  • Asignar a la Pi una IP estática o reserva DHCP antes de instalar Pi-hole
  • Usar Pi-hole como DNS primario; para redundancia, agregar un segundo Pi-hole en lugar de un resolutor público si necesitas bloqueo estricto
  • Habilitar DoH (DNS-over-HTTPS) con cloudflared para consultas ascendentes cifradas
  • Configurar home.lan como tu dominio local y crear registros DNS para todos tus servicios
  • Revisar el Registro de consultas ocasionalmente: las consultas bloqueadas te muestran lo que hacen los dispositivos

Habilidades Relacionadas

  • homelab-network-setup
  • homelab-vlan-segmentation
  • homelab-wireguard-vpn

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados