Voici un rapide billet pour présenter Pi-hole, un DNS sinkhole dont le but est de limiter au maximum la pub et les malwares directement au niveau DNS.

Installation

J’ai repris un vieux Raspberry 2 et j’installe la dernière version de Raspbian Lite. Dans la ligne ci-dessous sdX est à remplacer par le device de la carte SD

$ sudo dd bs=4M if=2021-01-11-raspios-buster-armhf-lite.img of=/dev/sdX conv=fsync

On pense ensuite à activer le ssh en faisant un touch ssh à la racine de la partition root.

Avant de lancer l’installation de Pi-hole, on ajoute un bail DHCP fixe pour le raspberry (dont on devra au préalable connaître l’adresse MAC).

On se connecte ensuite sur le raspberry, on change le mot de passe de l’utilisateur principal et on lance l’installation de Pi-hole

$ ssh pi@framboise
$ passwd
$ sudo ( curl -sSL https://install.pi-hole.net | bash )

Tout se déroule, lentement mais surement. Petit raffinement au passage, je préfère opter pour openDNS plutôt que ceux de Google pour traiter les requêtes “légitimes”.

Choix du DNS upstream

A la fin de l’installation, un petit récapitulatif nous est affiché ainsi que le mot de passe administrateur de l’interface Web de Pi-hole.

Fin de l'installation

Il nous reste maintenant à paramétrer la box internet pour indiquer notre raspberry comme unique DNS de référence. A ce niveau il est également envisageable de rajouter OpenDNS en serveur secondaire afin qu’il puisse prendre le relai en cas de défaillance du raspberry.

Quoiqu’il en soit, il est ensuite nécessaire de démonter/remonter l’interface réseau des autres postes connectés pour que le nouveau serveur soit propagé. Sur Linux, ce sera quelque chose comme ça :

$ ip link set eth0 down
$ ip link set eth0 up

Pour les tablettes et smartphone, il suffit de couper le WiFi pendant quelques secondes puis de le rallumer.

Premiers tests et utilisation

Voici ce que donnait auparavant une requête DNS sur le site 123count.com

$ dig 123count.com

; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> 123count.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51393
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;123count.com.			IN	A

;; ANSWER SECTION:
123count.com.		300	IN	A	104.21.43.12
123count.com.		300	IN	A	172.67.215.179

;; Query time: 18 msec
;; SERVER: 192.168.XXX.XXX#53(192.168.XXX.XXX)
;; WHEN: dim. févr. 07 12:49:12 CET 2021
;; MSG SIZE  rcvd: 73

Et voici la même commande après installation de Pi-hole :

$ dig 123count.com

; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> 123count.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32331
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;123count.com.			IN	A

;; ANSWER SECTION:
123count.com.		2	IN	A	0.0.0.0

;; Query time: 3 msec
;; SERVER: 192.168.YYY.YYY#53(192.168.YYY.YYY)
;; WHEN: dim. févr. 07 12:57:03 CET 2021
;; MSG SIZE  rcvd: 46

On observe deux choses très intéressantes :

  1. ce n’est plus la box internet (192.168.XXX.XXX) qui a résolu l’adresse mais bien notre nouveau serveur (192.168.YYY.YYY)
  2. L’adresse IP de 123count.com telle que retournée par Pi-hole est 0.0.0.0 : le filtre fonctionne bien !

Pour aller plus loin

Une interface Web est proposée pour afficher des statistiques et permettre un paramétrage de l’application. C’est un front-end de la commande pihole. Je n’ai pas encore regardé le détail mais on peut faire pleins de choses cool avec.

On peut aussi ajouter d’autres listes de blocage que celle par défaut maintenue par Steven Black. A voir à l’usage mais cette dernière me paraît déjà très bien tant en terme de contenu (environ 66k entrées) et surtout de mise-à-jour (la dernière mise-à-jour à l’heure de cette installation remonte à 4 jours).

La principale limitation que je vois à ce niveau, mis-à-part la nécessité de garder les listes de blocage à jour, concerne le DNS over HTTPS. Les appareils connectés utilisant ce protocole sont, à mon avis, insensible à Pi-hole.

La documentation officielle de Pi-hole