Blog & Astuces

Bloquer les publicités sur son réseau domestique avec Pi-Hole

Bloquer les publicités sur son réseau domestique avec Pi-Hole

Tuto

Dans ce tutoriel, nous allons voir comment faire pour bloquer les publicités sur Internet à l'échelle de votre réseau domestique. Grâce à cette méthode, il sera possible de bloquer les publicités sur tous les appareils connectés au réseau (ordinateur, smartphone, tablette, télévision connectée) sans modification de ces appareils, ni installation de logiciels ou applications supplémentaires sur ceux-ci.

Pour cela, nous allons installer et mettre en place Pi-Hole.

Pré-requis

  • Un serveur Linux, un Raspberry PI, ou un ordinateur qui tournera H24 (possible aussi sur un ordinateur Windows, mais pas testé)
  • Avoir installé Docker sur son serveur (il est possible d'installer Pi-Hole sans Docker, mais le tutoriel passera par son utilisation)

Présentation de Pi-Hole

Pi-Hole est un logiciel libre qui intègre de manière simplifiée un serveur DNS qui est chargé de bloquer les publicités à travers une liste de domaines à bloquer pré-configurée : quand votre appareil va effectuer une requête pour récupérer l'adresse IP d'un domaine, si celui-ci fait partie de cette liste, une mauvaise adresse IP sera envoyée (souvent 127.0.0.1 ou 0.0.0.0) ce qui bloquera la connexion au site. Certains gouvernements utilisent cette technique pour bloquer les sites illégaux : c'est ce qu'on appelle un DNS menteur.

Pi-Hole intègre aussi un serveur DHCP pour propager automatiquement son DNS aux appareils du réseau : nous allons utiliser aussi cette possibilité.

Pi-Hole est très configurable : ajout de listes, utilisation d'un serveur DNS interne ou externe pour les requêtes (par défaut, utilise le DNS de Cloudflare), etc.

Pi-Hole est très économe en ressources processeur et mémoire : il tourne sur n'importe quel ordinateur ou serveur dans sa configuration par défaut.

Si pas déjà fait : installation de Docker

Reportez-vous à la documentation Docker pour voir comment l'installer sur votre serveur.

Par exemple sous Ubuntu, vous pouvez procéder de la façon expliquée ici (configuration du dépôt APT de Docker et installation). Pour les Raspberry PI, c'est ici.

Une fois Docker installé, pas besoin de redémarrer le système, vous pouvez suivre directement le tutoriel.

Installation de Pi-Hole

Créez un nouveau dossier nommé pihole, puis créez un fichier docker-compose.yml dans ce dossier.

Pour mettre en place le paramétrage Docker Compose de Pi-Hole, vous pouvez vous baser sur la configuration suivante :

version: "3"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    network_mode: "host"
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "67:67/udp"
      - "80:80/tcp"
    environment:
      TZ: 'Europe/Paris'
      PIHOLE_DNS_: 1.1.1.1
      ServerIP: 'ENTREZ ICI L'ADRESSE IP LOCALE DU SERVEUR'
      WEB_PORT: 80
      # WEBPASSWORD: 'ENTREZ ICI UN MOT DE PASSE. SI PAS FAIT, UN MDP TEMPORAIRE SERA GENERE'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    cap_add:
      - NET_ADMIN
    restart: unless-stopped

Voici une explication de chaque information de configuration :

  • container_name: Nom du conteneur Docker, dans ce cas "pihole".
  • image: L'image Docker utilisée pour créer le conteneur, dans ce cas "pihole/pihole:latest".
  • network_mode: Mode réseau utilisé par le conteneur, ici "host" pour utiliser le réseau de l'hôte.
  • ports: Les ports exposés par le conteneur Docker, indiqués sous forme "port_hôte:port_conteneur/protocole". Les ports 53 (TCP et UDP) pour le DNS, le port 67 (UDP) pour le DHCP, et le port 80 (TCP) pour l'interface web.
  • environment: Les variables d'environnement définies pour le conteneur. "TZ" pour le fuseau horaire, "PIHOLE_DNS_" pour les serveurs DNS à utiliser, "ServerIP" pour l'adresse IP locale du serveur, "WEB_PORT" pour le port de l'interface web, et éventuellement "WEBPASSWORD" pour le mot de passe de l'interface web.
  • volumes: Les volumes Docker montés dans le conteneur, pour stocker les configurations de Pi-Hole.
  • cap_add: Les privilèges supplémentaires accordés au conteneur, ici "NET_ADMIN" pour permettre à Pi-Hole de gérer le réseau.
  • restart: La politique de redémarrage du conteneur, définie ici comme "unless-stopped" pour redémarrer le conteneur sauf s'il est explicitement arrêté.

Vous devez modifier la configuration selon votre réseau :

  • Le port 80 : vous devrez peut-être modifier ce port selon vos préférences (par exemple si vous avez plusieurs services web hébergés sur votre serveur, ou un reverse proxy installé) ;
  • ServerIP : entrez l'adresse IP locale de votre serveur (exemple : 192.168.1.X) ;
  • WEB_PORT : indiquer le port HTTP de Pi-Hole, tel que défini dans la partie ports de la configuration Docker Compose juste au dessus ;
  • WEBPASSWORD : mot de passe pour accéder au panneau d'administration de pihole. Si rien n'est indiqué, Pi-Hole va générer un mot de passe qui sera affiché la première fois que le container sera démarré, accessible via la commande docker container logs pihole

Une fois votre configuration terminée, créez le container et démarrez-le avec la commande suivante :

docker-compose up -d

Paramétrage du pare-feu

Par défaut, le pare-feu UFW (si installé et activé) va bloquer les requêtes en entrée au serveur. Il faut mettre en place un paramétrage pour laisser passer les requêtes DNS, DHCP et web en entrée.

Vous pouvez utiliser les commandes suivantes pour le faire :

sudo ufw allow from <adresse_IP_locale> to any port 53/tcp
sudo ufw allow from <adresse_IP_locale> to any port 53/udp
sudo ufw allow from <adresse_IP_locale> to any port 67/udp
sudo ufw allow from <adresse_IP_locale> to any port 80/tcp
sudo ufw reload

Remplacez adresse_IP_locale par l'IP de base de votre réseau local. Par exemple si les IP de votre réseau local sont du type 192.168.1.X, vous devrez indiquer 192.168.1.0/24. Cela permettra d'autoriser uniquement l'accès aux IPs locales à votre Pi-Hole.

Paramétrage de Pi-Hole

Pour accéder à l'interface d'administration de votre serveur, vous devez entrez l'adresse IP de votre serveur sur votre navigateur web, suivi de /admin. Si tout est bien paramétré, vous devriez voir s'afficher la page de connexion de Pi-Hole :

Page de login de Pi-Hole

Si vous n'avez défini aucun mot de passe dans la configuration Pi-Hole, un mot de passe aléatoire a été généré. Vous pouvez le retrouver en lançant la commande docker container logs pihole.

Entrez le mot de passe, puis validez pour accéder à la page d'accueil du panel d'administration :

Panel d'administration de Pi-Hole

Par défaut, Pi-Hole bloque déjà les publicités grâce à des listes intégré à l'outil : il n'y a rien à faire de ce côté

Vérifiez qu'au moins un serveur DNS "upstream" soit activé. Pour cela, rendez-vous dans Settings, puis cliquez sur l'onglet DNS. Cochez au moins un serveur parmi la liste affichée (je vous conseille celui de Cloudflare) :

Paramètres DNS de Pi-Hole

Validez ensuite les paramètres (Save tout en bas de la page).

Nous allons ensuite mettre en place le paramétrage permettant de propager le blocage de publicités à l'ensemble du réseau : nous allons activer le serveur DHCP. Cela permettra d'activer automatiquement le serveur DNS de Pi-Hole (qui bloque les publicités) sans aucune configuration nécessaire, sur chaque appareil qui se connectera au réseau.

Une autre manière de faire est, si votre box le permet, de directement configurer le serveur DNS sur le paramétrage de la box, mais la plupart des box opérateur l'interdisent : il faut donc passer par la mise en place du DHCP.

Activation du serveur DHCP

Pour cela, rendez-vous dans la partie Settings, puis cliquez sur l'onglet DHCP :

Paramètres DHCP de Pi-Hole

Nous allons configurer le serveur DHCP comme suit (vous pouvez vous baser sur la capture d'écran) :

  1. Cochez la case DHCP server enabled ;
  2. Range of IP addresses to hand out : Indiquez l'adresse IP de début et de fin que le serveur pourra distribuer : pour savoir ce qu'il faut indiquer, vous devrez vous baser sur l'adresse IP locale de base de votre réseau (souvent 192.168.1.X ou 192.168.0.X). Je vous conseille de partir d'une IP de la forme X.X.X.10 (commencer à numéroter à partir de 10) car certaines box opérateur réservent les premières plages d'IP (pour la télévision, le téléphone par exemple). Comme adresse de fin, vous pouvez mettre jusqu'au limites du sous-réseau, cela n'a pas d'importance (sauf si vous avez un grand nombre d'appareil connectés au réseau) ;
  3. Router (gateway) IP address : Indiquez l'adresse IP de votre box opérateur (souvent 192.168.1.1 ou 192.168.0.1), première IP du réseau ;
  4. Pi-hole domain name : vous pouvez laisser la valeur à "home", cela n'a pas d'importance ;
  5. DHCP lease time : pendant combien de temps le serveur DHCP va "louer" l'adresse IP locale - vous pouvez mettre "8760" pour 1 an

Validez les paramètres en cliquant sur Save tout en bas de la page.

Normalement, le serveur DHCP de Pi-Hole doit être fonctionnel, mais il faudra désactiver celui de votre box opérateur pour que la propagation puisse fonctionner.

Désactivation du serveur DHCP de la box opérateur

Pour désactiver le DHCP, rendez-vous dans la configuration de votre box opérateur (192.168.1.1 ou 192.168.0.1).

Sur certaines box (par exemple la Livebox d'Orange), le DHCP IPV6 n'est cependant pas désactivable : il faut désactiver complètement l'IPV6 dans la configuration de la box, sinon le DNS de Pi-Hole ne sera pas appliqué. Le DHCP IPV4 par contre est lui la plupart du temps désactivable.

Par exemple sur la Livebox d'Orange, vous pouvez le désactiver de cette manière :

Accédez à l'onglet de paramétrage "Réseau", et décochez "Activer le serveur DHCP" puis sur "Enregistrer" :

Configuration Livebox DHCP

Puis désactivez l'IPV6 (car DHCPv6 pas désactivable) dans l'onglet IPV6 :

Configuration Livebox IPV6

La configuration devrait être similaire sur les autres box opérateur.

Une fois cela fait, le DHCP devra être opérationnel. Pour que le DNS soit appliqué sur chaque appareil, il faudra soit le redémarrer, soit recréer la connexion Wi-Fi.

Configuration optionnelle de Pi-Hole

Je vais ici expliquer une configuration supplémentaire de Pi-Hole, mais totalement optionnelle, pour améliorer votre installation de Pi-Hole.

Désactivation du blocage de certains domaines

Par défaut, Pi-Hole bloque les domaines de redirection d'URLs suivants, ce qui peut provoquer quelques problèmes. Vous pouvez les mettre en liste blanche en accédant à la partie Domains, puis en entrant le domaine et en cliquant ensuite sur Add to Whitelist :

Liste des domaines bloqués Pi-Hole

Voici la liste des domaines que j'ai personnellement placés en liste blanche :

  • (.*)digidip.net
  • cdn.tagcommander.com
  • tagcommander.com
  • try.abtasty.com
  • abtasty.com
  • adf.ly
  • t.co (liens Twitter)
  • t.ly
  • www.bit.ly
  • bit.ly
  • ow.ly
  • tinyurl.com
  • cdn.optimizely.com
  • cdn.jsdelivr.net
  • go.pardot.com

Activation de DNSSEC

Afin d'améliorer la sécurité de votre serveur DNS et contrer certaines attaques, vous pouvez activer DNSSEC pour valider les requêtes DNS. Pour cela, accédez à la partie Settings puis l'onglet DNS :

Activation de DNSSEC sur Pi-Hole

Cochez Use DNSSEC, puis validez les paramètres (Save tout en bas de la page).

Installation de Unbound

Vous pouvez aussi installer Unbound, qui est un serveur DNS récursif, afin de mettre en place la chaîne complète qui permettra d'assurer la résolution DNS entièrement chez vous, et ne pas se baser sur un prestataire DNS extérieur. Cela permettra d'améliorer votre confidentialité sur Internet.

La plupart des distributions Linux ont Unbound dans leurs dépôt. Il suffit par exemple sur Debian ou Ubuntu de lancer la commande suivante pour installer Unbound :

sudo apt install unbound

Un installateur existe aussi pour Windows.

Ensuite, il faut configurer le logiciel. Rendez-vous dans le dossier /etc/unbound puis éditez le fichier unbound.conf. Vous pouvez vous inspirer de ma configuration ci-dessous :

include: "/etc/unbound/unbound.conf.d/*.conf"

server:
    port: 5353
    interface: 127.0.0.1
    do-ip4: yes
    do-ip6: no
    do-udp: yes
    do-tcp: yes

    num-threads: <ENTREZ LE NOMBRE DE THREADS DE VOTRE PROCESSEUR>
    harden-glue: yes
    hide-identity: yes
    hide-version: yes
    val-clean-additional: yes
    use-caps-for-id: no
    edns-buffer-size: 1232
    so-rcvbuf: 4m
    so-sndbuf: 4m

    key-cache-slabs: 8
    infra-cache-slabs: 8
    msg-cache-slabs: 8
    rrset-cache-slabs: 8

    root-hints: /etc/unbound/named.cache
    logfile: /var/log/unbound/unbound.log
    verbosity: 1
    log-queries: no
    log-replies: no
    log-time-ascii: no
    log-servfail: yes

    harden-below-nxdomain: yes
    harden-dnssec-stripped: yes
    harden-referral-path: yes
    harden-large-queries: yes
    qname-minimisation: yes

    private-address: <votre adresse ip locale>/<masque de sous-réseau>

    minimal-responses: yes
    rrset-roundrobin: yes
    deny-any: yes
    aggressive-nsec: yes

    cache-max-ttl: 86400
    cache-min-ttl: 300
    serve-expired: yes
    so-reuseport: yes

Modifiez la configuration de la manière suivante :

  • num-threads : entrez le nombre de threads de votre processeur ;
  • port : entrez un port DIFFERENT de 53 (qui est utilisé par Pi-Hole), il s'agit du port d'écoute du serveur ;
  • private-address : entrez l'adresse IP et le masque de sous-réseau de votre réseau local (exemple 192.168.0.0/24) ;
  • logfile : le chemin vers le fichier de log à créer
  • root-hints : le named.cache que nous allons télécharger plus tard (contient les adresses IP vers les serveurs racines du DNS, vers lesquels Unbound effectuera les requêtes DNS finales)

Téélchargez ensuite les root-hints de la manière suivante :

wget https://www.internic.net/domain/named.root -O /etc/unbound/named.cache

Je vous conseille de mettre en place une tâche planifiée cron afin de mettre à jour ce fichier chaque semaine (il change souvent). Vous pouvez utiliser le script suivant :

#!/bin/bash
echo "Mise à jour du fichier named.root pour Unbound"
wget https://www.internic.net/domain/named.root -O /etc/unbound/named.cache
echo "Redémarrage d'Unbound"
systemctl restart unbound
echo "Redémarrage d'Unbound - terminé"

Puis le placer dans le dossier /etc/cron.weekly. Activez le droits d'exécution sur le script avec la commande chmod +x <nom du script>.

Activez et démarrez ensuite le service d'Unbound :

sudo systemctl enable unbound
sudo systemctl start unbound

Ensuite, mettez en place la configuration permettant à Pi-Hole d'utiliser Unbound comme serveur DNS récursif. Pour cela, dans le panneau d'administration, rendez-vous dans Settings puis DNS, puis effectuez la configuration suivante :

Paramétrage du serveur DNS de Unbound dans Pi-Hole

Validez ensuite les paramètres (Save tout en bas de la page). Pi-Hole devra utiliser Unbound comme serveur DNS récursif.

Avantages et inconvénients de cette méthode de blocage de publicités

Cette méthode de blocage de publicités a des avantages et des inconvénients. Les avantages sont, pour moi, les suivants :

  • Blocage de publicités sur les appareils sur lesquels cela n'est pas possible
  • Blocage à l'échelle d'un réseau local, de manière transparente, sans configuration supplémentaire nécessaire sur vos appareils

Les inconvénients sont, pour moi, les suivants :

  • Le blocage par DNS n'est pas efficace à 100%, notamment si une application ou un logiciel force ses propres serveurs DNS, ou si les publicités sont servies depuis le domaine principal
  • Le blocage ne s'effectue que si vous être connecté à votre réseau local : avec votre smartphone, le blocage ne sera pas effectif si vous êtes connecté via le réseau mobile. Cependant, je vais publier prochainement un article sur comment outrepasser cette limitation (grâce à DNS over HTTPS et DNS over TLS)

Le blocage n'est pas efficace par exemple sur certaines applications et services comme Youtube (utilisez Youtube Revanced), les applis de réseaux sociaux. Un blocage supplémentaire peut donc être nécessaire (comme par exemple l'extension Ublock Origin).

Conclusion

Nous avons vu à travers ce tutoriel comment mettre en place un blocage des publicités au niveau d'un réseau local de la manière la plus transparent possible pour les appareils connectés au réseau. Cette méthode a des avantages et des inconvénients, comme nous l'avons vu auparavant. Cependant, il est possible avec cette méthode de bloquer bien plus que les publicités : les sites d'arnaques notamment. Un article va suivre sur le sujet.

Commentaires