DNS-over-TLS avec Pi-hole®


Trou Crypte

Pi-hole® est un système de blocage de publicités reposant sur le DNS relativement populaire chez les geeks. De par sa conception, reposant en grande partie sur le logiciel dnsmasq, il n'est malheureusement pas capable d'utiliser DNS-over-TLS (DoT) afin de chiffrer le trafic vers le résolveur qu'il utilise. Il y a une méthode pour utiliser DNS-over-HTTPS (DoH), reposant sur le proxy cloudflared de CloudFlare mais son installation est longue, nécessitant d'installer des logiciels depuis GitHub et de faire plein de trucs chiant d'admin-sys. Voyons voir une méthode plus simple, basée sur des logiciels répandus, au choix Unbound ou Stubby (d'autres sont possibles comme Knot Resolver), plus simples à installer et à configurer. Pour le reste de l'article, je considère que Pi-hole® est déjà configuré sur votre machine. Je ne couvrirai donc pas son installation.

Choix du logiciel

On s'aventure ici dans le royaume des goûts et des couleurs. Unbound ou Stubby ont chacuns leurs avantages et désavantages. Si vous n'avez pas accès à une version récente d'Unbound (1.13.0 minimum), choisissez Stubby. Les performances d'Unbound sont catastrophiques en TLS (et TCP) avant cette version (en gros Unbound fermait la connexion via un RST après chaque requête). Chez Debian, Bullseye propose la version 1.13.1.

Unbound

Commençons par regarder comment configurer Unbound. Comme d'habitude sous Debian & dérivé, on crée un fichier dans /etc/unbound/unbound.conf.d/. Cela donne :

server:
			interface: 127.0.0.1@5335
			do-not-query-localhost: no
			tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt

		forward-zone:
			name: "."
			forward-addr: 2001:bc8:2c86:853::853@853#dns.shaftinc.fr
			forward-tls-upstream: yes

Le port est bien sûr pris au hasard. Le format de l'adresse renseignée dans forward-addr est un peu bizarre et mérite d'être explicité. La syntaxe est ip-du-résolveur-DoT@port-tls#nom-de-domaine. Le nom de domaine renseigné étant celui qui doit être présent dans le certificat fourni par le serveur à la connexion. Unbound l'utilise pour authentifier le serveur (méthode ADN + IP dans le RFC 8310).

Stubby

Je reprends ici le guide de configuration de dns.shaftinc.fr. Il faut éditer /etc/stubby/stubby.yml. Dès l'installation, quelques serveurs DoT sont déjà configurés dans la section DEFAULT UPSTREAMS. Commenter l'ensemble des entrées (à moins que vous ne souhaitez utiliser un des résolveurs proposés) et mettre les informations relatives au résolveur DoT de votre choix pour une authentication stricte. Attention ceci dit, Stubby utilise la syntaxe YAML, il faut donc respecter l'indentation particulière (2 espaces ici) :

upstream_recursive_servers:
		  - address_data: 2001:bc8:2c86:853::853
		    tls_auth_name: "dns.shaftinc.fr"
		    tls_pubkey_pinset:
		      - digest: "sha256"
		      value: ilee9nHBVT0DVWER1VDA+0NCaYd25zVvP0C1Jb4gCIc=

Ne reste plus qu'à lui donner le port d'écoute d'où viendront les requêtes:

listen_addresses:
		  - 127.0.0.1@5335

(La ligne - 0::1 n'est pas vraiment nécessaire et peut dégager)

Pi-hole®

Une fois Unbound ou Stubby configuré et le service du logiciel relancé, on teste que tout fonctionne bien :

		$ dig @127.0.0.1 -p 5335 framapiaf.org

		; <<>> DiG 9.17.21-1-Debian <<>> @127.0.0.1 -p 5335 framapiaf.org
		; (1 server found)
		;; global options: +cmd
		;; Got answer:
		;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34069
		;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
		
		;; OPT PSEUDOSECTION:
		; EDNS: version: 0, flags:; udp: 1232
		;; QUESTION SECTION:
		;framapiaf.org.                 IN      A
		
		;; ANSWER SECTION:
		framapiaf.org.          10800   IN      A       88.99.213.22
		
		;; Query time: 123 msec
		;; SERVER: 127.0.0.1#5335(127.0.0.1) (UDP)
		;; WHEN: Sat Jan 29 23:09:48 CET 2022
		;; MSG SIZE  rcvd: 58

Parfait, on a donc un service local transmettant ses requêtes à un résolveur DoT. Ne reste plus qu'à configurer Pi-hole® pour lui dire de l'utiliser.

Depuis l'interface Web de ce dernier, se rendre dans l'onglet DNS des paramètres. On doit y trouver la configuration renseignée à l'installation :

Capture d'écran de Pi-hole montrant les paramètres DNS. Un seul serveur personnalisé est renseigné, il a pour adresse 192.168.0.4

Décocher les serveurs pré-configurés (Google, OpenDNS, Quad9...) si certains le sont et rentrer 127.0.0.1#5335 comme seul et unique serveur personnalisé :

La partie de l'interface permettant de renseiger un serveur personnalisé. L'adresse 127.0.0.1#5335 est renseignée

Au passage, la validation DNSSEC n'est (toujours) pas activée par défaut, donc penser à vérifier que la case correspondante est cochée dans les paramètres avancés se trouvant en dessous. Sauvegarder et se rendre dans le tableau de bord. On doit voir le nouveau serveur configuré apparaître dans les Upstream servers (et à terme supplanter le ou les anciens serveurs configurés) :

Détail du tableau de bord. On voit notamment un camenbert montrant que le serveur 127.0.0.1#5335 répond désormais aux requêtes

Et voilà un Pi-hole® qui chiffre désormais son trafic sortant.