PiHole, un excellent bloqueur de publicité

Installation de PiHole, un excellent bloqueur de publicité et de trackers avec docker en quelques minutes pour rendre votre internet plus propre.

PiHole, un excellent bloqueur de publicité

Bonjour,

Tiens c'est bizarre, y'a un autre post sur AdGuard qui a le même titre. Oui, je n'ai pas réussi à choisir et au final j'utilise les deux, ça me permet d'avoir une certaine redondance même si c'est certainement inutile. Lequel des deux est le mieux ? En résumé, AdGuard est simple de prise en main avec une interface logique et épurée alors que Pihole est plus complexe mais dispose de plus de données et de choix. A noter que AdGuard propose nativement DoH & DoT ce qui pour beaucoup fera pencher très fortement la balance.

Les prérequis pour l'installation:
- Docker
- Docker Compose

Dans votre répertoire principal ou sont vos dockers, on va commencer par créer le réseau "backend".

docker network create backend

Le réseau "backend" chez moi est le réseau qui n'est pas sensé être en frontal avec internet et dans lequel les services n'ont pas de frontend exposés. Dès que j'ai un frontend exposé, j'utilise un reverse-proxy + authentification pour sécuriser (et Cloudflare pour rajouter une couche).

Le docker compose qui va bien (je ne m'amuse pas à faire un docker-compose par service, je ne vois pas l'intérêt à part perdre du temps quand on veut faire des modifications / relancer des applications, après libre à vous de le découper suivant vos besoins / installations ):

version: "3.9"

########################### NETWORKS ###############################################
networks:
  #traefik:
  #  external: true
  backend:
    external: true
    #name: backend if external false
    #driver: bridge

########################### SERVICES ###############################################
services:
############################### PORTAINER #######################################################     
  portainer:
    # Installer Portainer / Interface graphique docker
    # https://hub.docker.com/r/portainer/portainer-ce
    container_name: portainer
    image: portainer/portainer-ce:latest
    restart: unless-stopped
    command: -H unix:///var/run/docker.sock
    security_opt:
      - no-new-privileges:true      
    networks:
      - backend
    ports:
      - "$PORTAINER_PORT:9000"
      - "$PORTAINERSERVER_PORT:8000"   
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - $USERDIR/Portainer:/data 
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      
 ############################## MAINTENANCE ################################################### 
  watchtower:
    # Watchtower detects if any linked containers have a new image available, automatically updating & restarting them if needed.
    # https://hub.docker.com/r/containrrr/watchtower
    container_name: watchtower
    image: containrrr/watchtower:latest
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - backend
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=$TZ
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_INCLUDE_RESTARTING=true
      #- WATCHTOWER_POLL_INTERVAL=60
      - WATCHTOWER_DEBUG=false
      - WATCHTOWER_SCHEDULE=0 0 3 * * *  
      
 ########################### UTILITIES ################################################
  dozzle:
    # Dozzle - Real-time Docker Log Viewer
    # https://hub.docker.com/r/amir20/dozzle
    image: amir20/dozzle:latest
    container_name: dozzle
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - backend
    ports:
      - "$DOZZLE_PORT:8080"
    environment:
      DOZZLE_LEVEL: info
      DOZZLE_TAILSIZE: 300
      DOZZLE_FILTER: "status=running"
      # DOZZLE_FILTER: "label=log_me" # limits logs displayed to containers with this label     
      TZ: "$TZ"      
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock     

 ###################################### DNS ################################################# 
  pihole:
    # Pihole - Remove ads via DNS
    # https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
    # https://hub.docker.com/r/pihole/pihole
    # Image :nightly
    container_name: pihole
    image: pihole/pihole:latest
    restart: unless-stopped
    #security_opt:
    #  - no-new-privileges:false
    networks:
      - backend       
    ports:
      - "$PIHOLEDNS_PORT:53/tcp"
      - "$PIHOLEDNS_PORT:53/udp"
      - "67:67/udp"
      - "$PIHOLEHTTP_PORT:80/tcp"
      - "$PIHOLEHTTPS_PORT:443/tcp"
    volumes:
      - '$USERDIR/PiHole/etc-pihole/:/etc/pihole/'
      - '$USERDIR/PiHole/etc-dnsmasq.d/:/etc/dnsmasq.d/'
    environment:
      TZ: $TZ   
      #WEBPASSWORD: $PIPASS    #Use for the first run to define your password
    # Recommended but not required (DHCP needs NET_ADMIN)
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    cap_add:
      - NET_ADMIN 
      - SETUID
      - SETGID
    dns:
      - 127.0.0.1
      - 192.168.1.1 

J'utilise toujours la même structure pour mes VMs / containers. En plus de PiHole, j'ai ajouté les containers suivant (vous pouvez les enlever si ils ne vous intéressent pas) que je considère comme indispensables pour une utilisation / debugging plus simple:
- Portainer: il me permet de gérer simplement mes containers, les relancer / détruire, virer les images, etc...
- Dozzle est un utilitaire qui permet de lire très facilement les logs des containers.
- Watchtower permet quand à lui de mettre à jour automatiquement les containers quand une nouvelle image est disponible (ici à 3h du matin chaque jour). Le but c'est de tout automatiser, pas de s'amuser à faire les mises à jour à la main ou tous les deux ans avec une version spécifique d'où le "latest" pour tous les containers. Alors oui, il peut arriver que lors d'une mise à jour automatique ça casse tout mais bon ça doit arriver 2x par an au maximum alors que j'ai en permanence plus d'une quarantaine de containers qui tournent. Not worth the hassle comme on dit chez Sam.

Toutes mes variables sont des $qqch. Elles sont toutes stockées dans un fichier .env à la racine de mes dockers pour plus de simplicité.  On ouvre donc ce fichier :

nano .env

Et voici à quoi ça ressemble en exemple dans ce fichier .env :

################## SYSTEM ########################
PUID=1001 
PGID=1001
TZ=Europe/Paris 
USERDIR=/home/docker
[email protected] 
[email protected]
SERVER_IP=192.160.125.101
COMPOSE_PROJECT_NAME=PiHole

############## PORTS ###########################
PORTAINER_PORT=9000 
PORTAINERSERVER_PORT=8000
DOZZLE_PORT=8071 
PIHOLEHTTP_PORT=80
PIHOLEHTTPS_PORT=443
PIHOLEDNS_PORT=53
PIPASS=password

Rien de transcendant ici, faites bien attention à bien définir votre USERDIR là ou seront les répertoires permanents des containers.

C'est terminé ? Pour docker oui, il ne reste plus qu'à lancer les containers :

docker-compose up -d

Pour configurer Pihole, il faut vous rendre sur http://votreip/admin. Soit vous avez défini un mot de passe via votre docker, soit il faudra aller l'indiquer via la console du container.

pihole -a -p somepasswordhere

Via la console de portainer, voici ce que ça donne:

Pour la configuration, c'est ultra simple, il suffit de se rendre dans Settings/DNS et de choisir votre DNS :

Sur la même page, je vous conseille de cocher ces options :

Pour rajouter des blocklists, il faut vous rendre dans Group Management/Adlists :

Je vous conseille les listes de Firebog.

Et voila, vous avez un DNS Blacklist fonctionnel qui va vous permettre de filtrer la majeure partie des pubs et des trackers sur le net !

@+