PiHole est un utilitaire sous Linux vous permettant de filtrer des adresses DNS, évitant ainsi de très (trop !) nombreuses requêtes DNS lorsque vous naviguez. En plus de bloquer les requêtes non souhaitées, certaines listes de blocage vous permettent de bloquer les sites web malicieux ou encore bloquer des catégories précises de sites.
En plus d’être un bel outil de filtrage pour vos réseaux personnels, il est possible d’y configurer un serveur DHCP. Ce service vous permettra d’avoir une configuration IP sur toutes les machines de votre réseau avec la configuration DNS souhaitée (et donc le filtrage).

Peu gourmand en ressources, vous pourrez facilement créer un conteneur sur un RaspberryPi 3 sans trop de latence. Les requêtes DNS sont assez courtes et légères, il n’est pas nécessaire d’avoir un processeur type Intel Xeon / AMD EPYC pour se faire.
Configuration système
J’ai décidé d’utiliser le dossier /srv/docker
, avec un dossier « conf » pour y stocker les fichiers de configuration. Libre à vous de choisir un autre emplacement, tant que vous avez les droits nécessaires pour écrire/lire des fichiers.
Vous pouvez être confronté à un problème de démarrage des conteneurs, notamment à cause du service « systemd-resolved » qui écoute déjà sur le port UDP/53. Pour se faire, nous devons arrêter le service concerné avec ces deux commandes :
sudo systemctl stop systemd-resolved.service
sudo systemctl disable systemd-resolved.service
Configuration docker
Maintenant que votre système est prêt, créons le fichier de configuration utilisé par Traefik (/srv/docker/conf/traefik.yml) :
---
global:
sendAnonymousUsage: false
checkNewVersion: false
api:
dashboard: true
log:
level: INFO
providers:
docker:
endpoint: unix:///var/run/docker.sock
exposedByDefault: false
watch: true
swarmMode: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
udpdns:
address: ":53/udp"
certificatesResolvers:
letsencrypt:
acme:
email: contact@czs.local
# caServer: https://acme-staging-v02.api.letsencrypt.org/directory
caServer: https://acme-v02.api.letsencrypt.org/directory
storage: acme.json
keyType: EC256
httpChallenge:
entryPoint: web
Globalement, rien de particulier hormis l’ajout d’un « entryPoints » pour l’UDP (notez la différence avec un entryPoint « traditionnel »). Volontairement, l’API de Traefik est toujours active pour afficher le tableau de bord et contrôler le bon fonctionnement.
Fichier docker-compose pour PiHole
Pareil pour le fichier docker-compose, rien de particulier, hormis la configuration vis-à-vis de PiHole et les labels relatifs à Traefik.
Ci-dessous le fichier docker-compose.yml
:
---
version: '3.7'
services:
traefik:
image: traefik:2.5
restart: unless-stopped
ports:
- 53:53/udp
- 53:53
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./conf/traefik.yml:/etc/traefik/traefik.yml:ro
pihole:
restart: unless-stopped
image: pihole/pihole:2021.10.1
environment:
TZ: "Europe/Paris"
VIRTUAL_HOST: pihole.czs.local
WEBPASSWORD: "pouetpouet"
volumes:
- datapihole:/etc/pihole/
- datadnsmasqd:/etc/dnsmasq.d/
dns:
- 127.0.0.1
- 1.1.1.1
labels:
traefik.enable: true
traefik.http.routers.pihole-http.rule: Host(`pihole.czs.local`)
traefik.http.routers.pihole-http.entrypoints: web
traefik.http.services.pihole.loadbalancer.server.port: 80
traefik.tcp.routers.pihole-dns.entrypoints: dns
traefik.tcp.routers.pihole-dns.service: pihole
traefik.udp.routers.pihole-udp.entrypoints: udpdns
traefik.udp.routers.pihole-udp.service: pihole
traefik.udp.services.pihole.loadbalancer.server.port: 53
volumes:
datapihole:
datadnsmasqd:
PiHole ne nécessite pas de configuration : quelques lignes d’environnement, les labels Traefik et le tour est joué. N’oubliez pas de changer pihole.czs.local
dans le label Traefik-HTTP-Router-Host, les deux variables WEBPASSWORD
et VIRTUAL_HOST
.
Vous pouvez retrouver les scripts sur GitHub à cette adresse.
Il est aussi possible d’installer PiHole en « bare-metal » sur votre machine sans docker, un article est disponible ici.