pihole est un solution anti-tracker et publicités que l’on peut installer sur un serveur dédié via un VPN ou un raspberry.
Le site propose un tutoriel : pi-hole : bloquer la publicité et trackers.
pihole gère la résolution DNS avec un forward de zone vers un serveur DNS externe comme Cloudflare, Adguard, Quad9, OpenDNS, etc.
Ce dernier gère DNSSec mais pas DNSCrypt, DNS over TLS ou HTTPS (DoT ou DoH).
Pour plus de sécuriser et de confidentialité, on peut ajouter le support DNSCrypt ou DoH à pihole avec dnscrypt-proxy.
Cet article vous guide pour configurer pihole avec DNSCrypt, DNS over TLS ou HTTPS (DoT ou DoH).
Table des matières
Configurer pihole avec DNSCrypt ou DNS over HTTPS (DoH)
Pour plus d’informations sur ces différents protocoles, reportez-vous à cet tutoriel :
La résolution DNS dans pihole se fait à travers dnsmasq.
On déclare alors les serveurs pour le transfert de zone dans la configuration de pihole.
dnsmasq se charge du reste.
- On ajoute le support DNSCrypt ou DoH en installant un proxy DNS comme dnscrypt-proxy.
- Puis dans pihole, on configure ce dernier pour utiliser ce proxy comme DNS.
Dans ce tutoriel, dnscrypt-proxy sera installé à l’adresse 127.0.0.1:5553.
Installer dnscrypt-proxy
Ici c’est sur un Linux Debian mais dans les faits, la distribution Linux ne change pas grand chose.
Il faut installer dnscrypt-proxy puis configurer l’interface et port d’écoute.
Enfin le serveur DNSCrypt à utiliser.
sudo apt install dnscrypt-proxy
On obtient une erreur car dnsmasq écoute déjà sur le port 53 et donc ce dernier n’est pas libre.
C’est normal.
Dans mon cas, j’ai décidé de dégager dnscrypt-proxy.socket
Ceci est expliqué dans cet article.
# On arrête les services et daemon
# -----------------------------------------
sudo systemctl stop dnscrypt-proxy.socket
sudo systemctl disable dnscrypt-proxy.socket
# Commentez toutes les options de sockets systemd * trouvées dans les deux
# fichiers et recharger le gestionnaire de configuration systemd
# pour vous assurer que systemd a lu toutes les modifications
# (* par exemple `Aussi = dnscrypt-proxy.socket`)
# ---------------------------------------------------
sudo vim /lib/systemd/system/dnscrypt-proxy.service
sudo vim /lib/systemd/system/dnscrypt-proxy-resolvconf.service
sudo systemctl daemon-reload
Il s’agit de retirer les dépendances des autres services avec celui du socket pour ne pas avoir de problème de démarrage.
Ensuite, on configurer le fichier /etc/dnscrypt-proxy/dnscrypt-proxy.toml
Ainsi dans :
# configurer l'interface et port à écouter
listen_addresses = ['127.0.0.1:5553', '[::1]:5553', '192.168.10.1:5553', '10.8.0.1:5553']
# les serveurs DNSCrypt à utiliser
server_names = ['scaleway-ams', 'scaleway-ams-ipv6']
Enfin on peut utiliser les paramètres suivantes.
Il est aussi possible des serveurs gérants le protocole DNS-over-HTTP/2.
# Use servers reachable over IPv4
ipv4_servers = true
# Use servers reachable over IPv6 -- Do not enable if you don't have IPv6 connectivity
ipv6_servers = true
# Use servers implementing the DNSCrypt protocol
dnscrypt_servers = true
# Use servers implementing the DNS-over-HTTP/2 protocol
doh_servers = true
# Server must support DNS security extensions (DNSSEC)
require_dnssec = false
keepalive = 30
cache = true
cache_size = 10000
cache_min_ttl = 600
force_tcp = false
- La documentation sur le fichier de configuration
- La liste des serveurs DNSCrypt. Choisissez bien, par exemple si vous forcer DNSSec, choisissez un serveur qui le gère.
Puis on démarre le tout et on vérifie que tout est correct.
Éventuellement utiliser netstat pour valider que dnscrypt-proxy écoute bien sur le port indiquer.
sudo systemctl restart dnscrypt-proxy.service
journalctl -u dnscrypt-proxy.service
systemctl status dnscrypt-proxy.service
Configurer pihole pour utiliser DNSCrypt
Ensuite on modifie la configuration DNS de pihole afin de pointer vers dnscrypt-proxy.
Pour cela,
- Connectez-vous à l’interface WEB de gestion pihole
- puis Settings
- Ensuitez cliquez sur l’onglet DNS
- Décochez les serveurs, à gauche dans la liste Upstream DNS Serveurs
- Puis à droite, cochez IPv4 et IPV6 (si active) pour indiquer l’adresse de serveur dnscrypt-proxy. Remplacez : par # pour le port. Dans mon cas, l’adresse c’est 127.0.0.1:5553 qui devient 127.0.0.1#5553
Editez le fichier /etc/dnsmasq.d/01-pihole.conf puis ajoutez l’option proxy-dnssec.
Cette option n’est pas disponible depuis la configuration WEB.
Puis on relance pihole-FTP de cette manière.
Chose que l’on peut aussi faire depuis l’interface WEB dans Settings.
systemctl restart pihole-FTL
Activer l’anonymisation DNS
Pour aller plus loin, vous pouvez activer l’anonymisation DNS.
Pour cela, suivez ce tutoriel :
Tester la résolution pihole avec DNSCrypt
Voici quelques méthodes pour vérifier la résolution DNS à travers dnscrypt-proxy.
Le plus simple est d’utiliser les logs pour s’assurer que la résolution DNS passe par ce dernier.
dnscrypt-proxy
Puis on teste la résolution DNSCrypt avec la commande dnscrypt-proxy :
dnscrypt-proxy -resolve www.malekal.com
Les logs et journaux dnscrypt-proxy
Enfin on peut alors suivre les requêtes DNS effectuées par les clients depuis le journal /var/log/dnscrypt-proxy/query.log.
Ainsi cela permet de tester en direct.
Ce dernier indique alors l’état de la résolution DNS :
- PASS : la requête DNS a réussi
- SERVER_ERROR : le serveur DNS n’a pas répondu par exemple après un timeout
- PARSE_ERROR : le contenu de la requête DNS n’est pas correcte. Par exemple pour du DoH le serveur renvoie une page 404.
Logs dans Pihole
Vous pouvez aussi suivre les résolutions DNS dans pihole mais on ne peut pas savoir quel serveur DNS est au final.
A noter que si pihole indique INSECURE, cela indique que DNSSEC n’a pas fonctionné.
avec dig et tcpdump
dig est un utilitaire d’interrogation DNS que l’on peut installer avec apt-get.
L’interrogation se fait en direct et on peut spécifier le serveur DNS à utiliser.
Voici la syntaxe à utiliser pour tester le serveur DNSCrypt :
dig www.malekal.com +dnssec @127.0.0.1 -p 5553
- dnssec pour tester avec ce dernier
- @127.0.0.1 on utilise ce serveur DNS
- -p spécifie le port
Si DNSSec réussi alors le flag ad est présent :
Enfin on peut aussi tcpdump pour écouter les connexions et vérifier qu’aucune résolution DNS ne se fait sur le port 53
sudo tcpdump -n dst port 53 and \ 'not dst net (::1 or 10 or 127 or 172.16/12 or 192.168/16)'
Conclusion et liens
dnscrypt-proxy fournit une documentation complète sur github.
Pour la partie d’installation avec pihole, c’est là.
Sachez aussi qu’il gère les listes noires mais aussi le load-balancing.
Vous pouvez distribuer la résolution DNS sur plusieurs serveurs (définit dans server_names) aléatoirement.
Cela peut apporter plus de confidentialité.
Les liens du site :