[Raspberry Pi] Pi-Hole : bloquer les pubs sur tout son reseau domestique

Pi-Hole-blocage-DNS-Publicites-reseau-local

Les publicités sont une vraie plaie et autant sur PC il est facile de s’en affranchir (plugins Adblock ou uBlock que je lui préfère), autant sur smartphone, c’est mission quasi impossible, à moins de rooter son téléphone Android pour modifier le fichier de blocage de certains domaines.

Une solution existe sur Raspberry Pi avec le petit serveur Pi-Hole qui sert de serveur DNS pour votre réseau local à la maison.

Les DNS, c’est quoi ?

Un serveur DNS (Domain Name Serveur) est une sorte d’annuaire téléphonique. Vous lui demandez d’aller sur un site via son URL, il y associe une adresse IP pour que l’échange de données puisse se faire.

Si vous souhaitez bloquer un site, il suffit de renvoyer tel ou tel nom de domaine vers une IP nulle. Cette tactique est bien connue de certains FAI, on en revient à la neutralité du net avec par exemple des FAI qui bloquent certains sites web via leurs « DNS menteurs » ou du packet sniffing.

Configurer Pi-Hole

Pi-Hole est un serveur DNS custom pour Raspberry Pi ou tout appareil faisant tourner une distribution Linux Raspbian. Contrairement aux extensions de navigateur pour bloquer les pubs, Pi-Hole peut bloquer les publicités ou domaines choisis sur TOUS les appareils connectés à votre réseau domestique. Pas besoin d’installer de logiciel ou application sur chaque appareil de la maison, le simple fait de se connecter au WiFi bloque tous les domaines choisis.

On installe git et net-tools

sudo apt-get install git net-tools

Puis on le git pi-hole :

git clone --depth 1 https://github.com/pi-hole/pi-hole.git pi-hole

Enfin, on lance l’installation :

sudo bash pi-hole/automated\ install/basic-install.sh

On suit l’installeur en prenant :

  • DNS de repli : Quad 9 (filtré + DNSSEC)
  • Blocage des noms de domaine en IPv4 (je n’utilise pas l’IPv6 en réseau local, vous non plus je suppose)
  • Choisir l’adresse de Gateway proposée et la noter

  • Noter l’adresse statique de Pi-Hole
  • On active l’interface web (on) et les logs (désactiver les logs si vous utilisez un VPN)
  • Notez le mot de passe admin affiché à la fin de l’installation, on va en avoir besoin pour se connecter à l’interface web. Vous pouvez aussi le changer par la commande :
pihole -a -p

Une fois connecté, aller dans la configuration et modifier les serveurs DNS de repli. Le plus simple dans un premier temps est de prendre Quad9 en non filtré et Cloudflare.

Pihole-blocage-DNS-bloquer-pub-reseau-raspberry

Facultatif : DNS Over HTTPS avec Cloudlfared

[Edition le 11/11/2019] Pour aller plus loin, je vous conseille vivement de mettre en place le DoH sur Pihole (DNS over HTTPS) via le tuto suivant sur le wiki de Pihole. Voici les commandes du tutoriel à rentrer dans le terminal de votre Raspberry Pi :

wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.tgz
tar -xvzf cloudflared-stable-linux-arm.tgz
sudo cp ./cloudflared /usr/local/bin
sudo chmod +x /usr/local/bin/cloudflared
cloudflared -v
sudo useradd -s /usr/sbin/nologin -r -M cloudflared

Puis on modifie un fichier de config via la commande suivante :

sudo nano /etc/default/cloudflared

Et on ajoute ceci dedans avant de sauvegarder (CTRL + X puis O et entrée)

# Commandline args for cloudflared
CLOUDFLARED_OPTS=--port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query

On met à jour les permissions d’accès aux dossier pour l’utilisateur cloudflared

sudo chown cloudflared:cloudflared /etc/default/cloudflared
sudo chown cloudflared:cloudflared /usr/local/bin/cloudflared

On permet au service de se lancer au démarrage en éditant un fichier systemd :

sudo nano /etc/systemd/system/cloudflared.service

Auquel on ajoute les données suivantes (CTRL + V, puis on enregistre CTRL + K, « O », Entrée)

[Unit]
Description=cloudflared DNS over HTTPS proxy
After=syslog.target network-online.target

[Service]
Type=simple
User=cloudflared
EnvironmentFile=/etc/default/cloudflared
ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

On saisit les commandes suivantes :

sudo systemctl enable cloudflared
sudo systemctl start cloudflared
sudo systemctl status cloudflared

Un reboot et on peut saisir les nouvelles infos du serveur DNS dans PiHole. On décoche les serveurs DNS dans la partie gauche et on entre l’IP locale 127.0.0.1#5053.

Pihole-blocage-DNS-cloudflared-bloquer-pub-reseau-raspberry

Les requetes seront résolues par Pihole via Cloudflared, chiffrées en DNS over HTTPS. Nickel !

Quelques commandes pour Pihole

Voir le log des requêtes en direct :
pihole -t

Afficher dans le terminal un etat en direct de Pihole et du RaspberryPi. L’affichage s’adapte automatiquement à un LCD :

pihole -c

Voir la version et mettre à jour Pihole :

pihole -v
pihole -up

Ajouter des listes de blocage

Je vous recommandes les listes de Wally3k’s block lists et notamment la première, Ticked lists, qui demande le moins de maintenance pour whitelister des sites bloqués. La plupart des sites bloqués le sont à juste titre (pub, spam, virus etc.)

Les deux autres listes sont plus étoffées mais risquent de bloquer des accès à tort.

Je vous propose un récapitulatif complet des meilleures listes de blocage pour PiHole.

Config de votre routeur : utiliser DHCP pour bloquer les pubs

Ajouter la config DNS au DHCP du routeur permet à chaque appareil connecté au routeur de se voir fournir les DNS de Pi-Hole, en même temps que l’IP sur le réseau.

Pi-Hole-blocage-DNS-cofig-routeur-linksys-DHCP

Certains routeurs (des FAI notamment) refusent l’utilisation de DNS autres que les originaux (pour permettre les DNS menteurs notamment). Pi-Hole peut alors faire office de serveur DHCP + DNS, les IP et DNS seront alors fournis par Pi-Hole et plus par le routeur. Inconvénient, si le Raspberry Pi est éteint, le réseau n’a plus de DHCP.

Quelques optimisations du Raspberry Pi

Pour éviter de fusiller une carte SD par mois avec votre raspberry Pi, voici quelques astuces à mettre en oeuvre :

Depuis que j’ai mis en place cette méthode, ma TV Samsung ne communique plus avec ses serveurs de pub à la noix et plus aucun appareil à la maison ne subit de pub !!!

[MAJ 7/06/2019]

  • Modification de la méthode d’installation, plus sécurisée.
  • Quelques commandes utiles de Pihole rajoutées
  • Astuces pour optimiser les écritures sur carte SD et la préserver

7 Replies to “[Raspberry Pi] Pi-Hole : bloquer les pubs sur tout son reseau domestique”

    1. Bonjour,
      Oui, c’était sacrément gonflé de ma part ! Bloquer les pubs google et fournir de la data à Google, drôle de paradoxe ! J’ai oublié de mettre à jour l’article à l’époque.
      Merci de m’avoir repris, j’en ai profité pour corriger tout ça et ajouter un paragraphe sur le DNS over HTTPS via clouflared.
      Mon Pihole ronronne depuis plus de 3 mois avec le DoH sans souci, et j’ai mis le firmware DD-WRT sur mon routeur Linksys pour plus de contrôle. Perfect !

  1. bonjour comment faire pour que la liste blacklist se mettent à jour automatiquement car j’ai pas trouvé la solution, merci, l’idée est de mettre une temporisation du style toutes les 6 heures par exemple

    1. Bonjour, la blacklist est peuplée par vos ajouts, je ne vois pas comment cela pourrait être « automatique ». Je dois mal comprendre votre question. Pour la tempo, vous voulez désactiver pi-hole temporairement ? Si oui il y a une option dans l’interface graphique « Disable » > « Custom time ».

  2. je voudrais savoir comment forcer la mise à jour des listes qui se retrouve dans « Domains on Blocklist » tous les jours car quant je regarde en déplaçant mas souris dessus « Blocking List Updated » y a 5 jours…….donc j’aimerais que ce soit toute les 24h et non je ne sais quand, merci, j’espère avoir étais plus clair

    1. Je comprends mieux, vous voulez mettre l’ensemble des listes de blocage à jour quotidiennement via gravity. Je doute de l’utilité d’une mise à jour quotidienne, les listes n’étant à mon avis pas modifiées aussi souvent. Pihole fait déjà une mise à jour hebdomadaire. Mais pour une mise à jour quotidienne, il suffit de créer une tâche cron pour cela.
      On ouvre le fichier cron de pihole dans nano :
      sudo nano /etc/cron.d/pihole
      On édite pour avoir la ligne suivante (mise à jour tous les jours à 4h du matin):
      00 4 * * * root PATH="$PATH:/usr/local/bin/" pihole updateGravity
      Enregistrer le fichier (CTRL+K puis O puis Entrée).
      On lance la commande suivante pour que tout soit pris en compte :
      sudo systemctl restart cron
      Gravity de Pihole mettra à jour la liste globale tous les matins à 4h ! C’est cela que vous vouliez faire ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.