Pi-hole - Ad-blocking DNS avec 232K+ domaines bloqués

Dernière mise à jour le

#pihole#dns#adblocker#privacy#docker#networking

🛡️ Qu’est-ce que Pi-hole?

Pi-hole est un DNS sinkhole qui bloque les publicités et trackers au niveau réseau, avant même qu’ils n’atteignent vos appareils. Contrairement aux ad-blockers classiques (uBlock Origin, AdBlock+), Pi-hole protège:

  • Tous les appareils du réseau (smartphones, TV, IoT…)
  • Toutes les applications (pas seulement les navigateurs)
  • Tous les protocoles (HTTP, HTTPS, apps mobiles…)

Avantages:

  • ✅ Bloque pub YouTube sur TV/mobile
  • ✅ Bloque trackers dans apps mobiles
  • ✅ Réduit bande passante
  • ✅ Améliore vie privée
  • ✅ Accélère navigation (moins de requêtes)

📊 Stats Mon Instance

Domaines bloqués:     232,646
Requêtes/jour:        ~15,000
% bloqué:             ~35%
Listes actives:       12
Clients:              8 devices
Uptime:               99.9%

🐳 Installation Docker

docker-compose.yml

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    hostname: pi.hole
    network_mode: host
    environment:
      TZ: 'Europe/Paris'
      WEBPASSWORD: '${PIHOLE_PASSWORD}'
      PIHOLE_DNS_: '1.1.1.1;1.0.0.1'  # Upstream DNS (Cloudflare)
      DNSSEC: 'true'
      WEB_PORT: '9090'
      FTLCONF_webserver_port: '9090'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    cap_add:
      - NET_ADMIN
    restart: unless-stopped
    dns:
      - 127.0.0.1
      - 1.1.1.1

network_mode: host évite d’avoir à publier chaque port un par un (53 DNS, 9090 web) — pratique pour un service réseau comme celui-ci, au prix de partager directement le réseau de l’hôte plutôt que d’être isolé dans un bridge Docker.

Commandes Déploiement

# Créer répertoires
mkdir -p pihole/{etc-pihole,etc-dnsmasq.d}
cd pihole

# Créer docker-compose.yml (contenu ci-dessus)

# Démarrer
docker compose up -d

# Vérifier logs
docker compose logs -f

# Vérifier status
docker compose ps

Accès Web Interface

URL:      http://<SERVER_IP>:PORT/admin
User:     (aucun)
Password: YOUR_SECURE_PASSWORD

🔧 Configuration Initiale

1. Configurer DNS Upstream

Settings > DNS > Upstream DNS Servers

Options recommandées:

  • Google: 8.8.8.8 + 8.8.4.4 (rapide, logging Google)
  • Cloudflare: 1.1.1.1 + 1.0.0.1 (privacy-focused)
  • Quad9: 9.9.9.9 (sécurité, bloque malware)
  • OpenDNS: 208.67.222.222 (filtrage famille optionnel)

Mon choix: Google DNS (performance)

2. Activer DNSSEC

Settings > DNS > DNSSEC

☑️ Use DNSSEC

DNSSEC vérifie authenticité des réponses DNS → protection contre spoofing/poisoning

3. Configurer Interface

Settings > DNS > Interface listening behavior

Choix:

  • ✅ Listen on all interfaces, permit all origins (simple, réseau local trusted)
  • ⬜ Listen only on interface eth0 (plus sécurisé)

4. Conditional Forwarding (Optionnel)

Pour résolution noms locaux (ex: jellyfin.local)

Settings > DNS > Conditional forwarding

☑️ Use Conditional Forwarding
Target:         192.168.0.1 (adresse router)
Domain:         local

📋 Listes de Blocage (Adlists)

Listes Installées (12)

Fichier: adlists.txt

# Default Pi-hole list
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts

# Malware domains
https://mirror1.malwaredomains.com/files/justdomains
https://s3.amazonaws.com/lists.disconnect.me/simple_malware.txt

# Tracking & telemetry
https://v.firebog.net/hosts/Easyprivacy.txt
https://v.firebog.net/hosts/Prigent-Ads.txt
https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt

# Ads
https://adaway.org/hosts.txt
https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt

# Smart TV ads
https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt

# Crypto mining
https://zerodot1.gitlab.io/CoinBlockerLists/hosts_browser

# French ads
https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileAds.txt

Ajouter Liste

Web UI: Adlists > Add new adlist

Address: https://example.com/list.txt
Comment: Description liste

Puis mettre à jour:

docker compose exec pihole pihole -g

Ou Web UI: Tools > Update Gravity

Recommandations Listes

Strict (privacy maximum):

Équilibré (mon setup):

  • StevenBlack + Firebog curated lists

Léger (pas de faux positifs):

  • StevenBlack uniquement

🎯 Whitelist / Blacklist

Whitelist (Débloquer)

Certains services légitimes sont parfois bloqués:

# Microsoft services
msftncsi.com
www.msftncsi.com

# Google safe browsing
clients2.google.com
clients4.google.com

# Apple services
captive.apple.com

# Smart TV fonctionnalités (optionnel)
api-global.netflix.com

Ajouter: Whitelist > Add domain

Blacklist (Bloquer manuellement)

Domaines spécifiques à bloquer:

# Telemetry Windows
telemetry.microsoft.com
vortex.data.microsoft.com

# Trackers spécifiques
googleadservices.com
doubleclick.net

Ajouter: Blacklist > Add domain

Regex Filters

Bloquer patterns complexes:

# Bloquer tous sous-domaines tracking
^(.+\.)?tracking\..*$

# Bloquer ads dans domaines
^ad[sxv]?[0-9]*\..*$

RegEx Filters > Add regex filter

📊 Dashboard & Monitoring

Widgets Principaux

Overview:

  • Total queries (24h)
  • Queries blocked (%)
  • Gravity (domaines en liste)
  • Clients actifs

Query Types:

  • A (IPv4): ~70%
  • AAAA (IPv6): ~25%
  • PTR (reverse): ~5%

Top Blocked Domains:

1. googleadservices.com    2,340 hits
2. doubleclick.net         1,890 hits
3. facebook.com            1,234 hits
4. graph.facebook.com        987 hits
5. analytics.google.com      654 hits

Top Permitted Domains:

1. www.google.com          3,456 hits
2. youtube.com             2,109 hits
3. github.com              1,543 hits
4. cloudflare.com            876 hits

Long-term Data

Settings > API / Web interface > Privacy settings

Options:

  • ☑️ Show everything (default)
  • ⬜ Hide domains (anonymize)
  • ⬜ Hide domains + clients (max privacy)

Settings > System > FTL Database

Max database days: 365
Database interval: 1 minute

🔌 Configuration Clients

Méthode 1: Router (Recommandé)

Configure router DHCP pour distribuer Pi-hole comme DNS:

Router admin panel:
DHCP Settings > DNS Server
  Primary DNS:   <SERVER_IP>
  Secondary DNS: 8.8.8.8 (fallback)

Avantages:

  • Tous devices automatiquement protégés
  • Nouveaux devices aussi
  • Pas de config manuelle

Méthode 2: Par Device (Alternatif)

Windows:

Paramètres > Réseau > Propriétés WiFi
  DNS manuel:
    Préféré:   <SERVER_IP>
    Auxiliaire: 8.8.8.8

macOS:

Préférences Système > Réseau > Avancé > DNS
  Serveurs DNS:
    <SERVER_IP>
    8.8.8.8

Android:

Paramètres > WiFi > Longue pression réseau > Modifier
  Options avancées > DNS
    DNS 1: <SERVER_IP>
    DNS 2: 8.8.8.8

iOS:

Réglages > WiFi > (i) réseau
  Configurer DNS > Manuel
    Serveurs: <SERVER_IP>

Méthode 3: DHCP Pi-hole (Avancé)

Désactiver DHCP router, activer dans Pi-hole:

Settings > DHCP > DHCP Settings

☑️ DHCP server enabled
Range:     192.168.0.100 - 192.168.0.250
Gateway:   192.168.0.1

Risque: Si Pi-hole down, pas d’IPs distribuées!

🛠️ Maintenance

Update Gravity

Actualiser listes de blocage (hebdomadaire):

docker compose exec pihole pihole -g

Ou Web UI: Tools > Update Gravity

Update Pi-hole

# Pull dernière image
docker compose pull

# Recréer container
docker compose up -d --force-recreate

# Vérifier version
docker compose exec pihole pihole -v

Flush Logs

Nettoyer requêtes anciennes:

docker compose exec pihole pihole -f

Backup Config

# Telecharger backup depuis Web UI
Tools > Teleporter > Backup

# Ou manuel
tar -czf pihole-backup.tar.gz etc-pihole/ etc-dnsmasq.d/

Restore Backup

# Arrêter container
docker compose down

# Extraire backup
tar -xzf pihole-backup.tar.gz

# Redémarrer
docker compose up -d

🐛 Troubleshooting

Site cassé (faux positif)

Symptôme: Site ne charge pas ou fonctionnalités manquantes

Solution:

  1. Web UI > Query Log
  2. Chercher domaine bloqué (rouge)
  3. Click domaine > Whitelist > Add
  4. Refresh site

Exemple: api.example.com bloqué → Whitelist

DNS lent

Symptôme: Sites chargent lentement

Diagnostic:

# Test résolution DNS
dig @<SERVER_IP> google.com

# Devrait être < 50ms

Solutions:

  • Changer upstream DNS (Cloudflare plus rapide que Google parfois)
  • Activer DNSSEC cache
  • Vérifier load CPU Pi-hole

Pi-hole ignoré

Symptôme: Stats Pi-hole à 0 requêtes

Causes:

  • Device utilise DNS alternatif (hard-coded 8.8.8.8)
  • Router distribue autre DNS
  • VPN bypass Pi-hole

Diagnostic:

# Sur device, vérifier DNS utilisé
nslookup google.com
# Server doit être <SERVER_IP>

📈 Stats Avancées avec PADD

PADD = Pi-hole Ad Detection Display (terminal dashboard)

# Installer
docker compose exec pihole bash
wget -O padd.sh https://install.padd.sh
chmod +x padd.sh

# Lancer
./padd.sh

Affiche:

  • Queries temps réel
  • Top blocked domains
  • CPU/RAM usage
  • Clients actifs

🔗 Intégrations

Home Assistant

Ajouter Pi-hole comme sensor:

# configuration.yaml
sensor:
  - platform: pi_hole
    host: <SERVER_IP>:PORT
    monitored_conditions:
      - ads_blocked_today
      - ads_percentage_today
      - dns_queries_today
      - domains_being_blocked

Dashboard card:

type: entities
title: "Pi-hole Stats"
entities:
  - sensor.pi_hole_ads_blocked_today
  - sensor.pi_hole_ads_percentage_today
  - sensor.pi_hole_dns_queries_today

Grafana

Visualiser métriques long-terme:

  • Queries/jour graph
  • Blocked % pie chart
  • Top domains bar chart

🎓 Ressources


Status: 🟢 Running
Blocks: 232,646 domains
Efficiency: 35% queries blocked
Clients: 8 devices protected