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).

logo pihole

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: [email protected]
#      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.

Auteur

Bercé par l'informatique depuis mon plus jeune âge, je transforme ma passion en expertise.

Écrire un commentaire