Configurer pihole avec DNSCrypt ou DNS over HTTPS (DoH)

Bloqueur de pub détectée - Vous bloquez l'affichage des publicités.
Pour soutenir le site, merci de bien vouloir laisser les publicités s'afficher.

Plus d'informations : Comment désactiver les bloqueurs de publicité sur un site internet.

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).

Configurer pihole avec DNSCrypt ou DNS over HTTPS (DoH)

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.

Installer dnscrypt-proxy

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.

configurer dnscrypt-proxy

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']
Vous devez un port d'écoute > 1024 car le service ne se lance pas en root. Si vous devez utiliser un port inférieur, installez dnscrypt-proxy depuis les sources pour le faire tourner en root. Ce qui n'est indiqué d'un point de vue de la sécurité.

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
configurer dnscrypt-proxy

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 dnscrypt-proxy

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
Configurer pihole pour utiliser DNSCrypt

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.

Configurer pihole pour utiliser DNSCrypt

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

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.
Les logs et journaux dnscrypt-proxy pour vérifier résolution DNS par DNSCrypt

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é.

Vérifier les résolutions DNS dans pihole

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 :

Tester la résolution DNS avec dig

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 .
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 :

Vous avez trouvé cet article utile et interressant, n'hésitez pas à le partager...

Trouver la solution sur le forum d'aide

Vous êtes arrivé au terme de l'article Configurer pihole avec DNSCrypt ou DNS over HTTPS (DoH) mais vous n'avez pas trouvé la solution à votre problème...
Suivez ces articles du forum pour trouver une réponse ou demandez à votre tour de l'aide sur le forum

Tags:,