l’Almanet doLys Gnu/Linux – Open Source – Entreprises › Forums › L’almanet doLys Open Source › Installer Pi-hole avec DNS-over-HTTPS (DoH) et dnscrypt-proxy sous Docker : bloquer les publicités et interroger des résolveurs souverains
- This topic is empty.
- AuteurArticles
- avril 12, 2025 à 4:05 pm #12833
Introduction
Mise à jour : la liste des résolveurs DNS-over-HTTPS a été actualisée avec des serveurs testés, non filtrants et compatibles avec dnscrypt-proxy.
Je vous propose ici une stack DNS chiffrée avec Pi-hole et dnscrypt-proxy : une alternative propre aux résolveurs DNS des FAI, avec blocage publicitaire local, chiffrement des requêtes DNS et sélection explicite de résolveurs de confiance.
Grâce à Pi-hole et dnscrypt-proxy, je peux résoudre mes requêtes DNS via des serveurs DoH ou DNSCrypt choisis, sans passer par Google, Cloudflare ou les DNS de mon fournisseur d’accès. Pi-hole reste chargé du filtrage local : publicités, traqueurs, domaines indésirables et listes personnalisées.
DNS-over-HTTPS chiffre les requêtes DNS dans du trafic HTTPS. Le fournisseur d’accès ne reçoit plus les requêtes via son propre résolveur. Il devient donc beaucoup plus difficile pour lui d’appliquer un filtrage DNS local, de renvoyer une réponse mensongère ou de journaliser directement les noms demandés au niveau DNS.
Cette configuration apporte trois fonctions :
- blocage local des publicités, traqueurs et domaines indésirables ;
- résolution DNS chiffrée via dnscrypt-proxy ;
- sélection explicite de résolveurs non filtrants, hors FAI et compatibles avec dnscrypt-proxy.
Astuce : si vous hésitez entre DoH et DoT avec Unbound, vous pouvez aussi utiliser un petit switcher pour passer de l’un à l’autre.
Pourquoi cette méthode ?
- pour ne plus confier ses requêtes DNS au fournisseur d’accès ;
- pour contourner les DNS menteurs et les blocages DNS grossiers ;
- pour chiffrer les requêtes DNS vers des résolveurs externes choisis ;
- pour garder le filtrage publicitaire en local avec Pi-hole ;
- pour conserver une stack simple, portable et isolée dans Docker.
Prérequis
Avant de commencer, assurez-vous d’avoir :
- un système Linux à jour ;
- Docker et Docker Compose installés ;
- un terminal et un accès sudo ;
- le port local 53 disponible sur la machine.
Installation de Docker si nécessaire
Arch Linux et dérivés
sudo pacman -S docker docker-compose sudo systemctl enable --now docker sudo usermod -aG docker "$USER"Debian
sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker sudo usermod -aG docker "$USER"Après avoir ajouté votre utilisateur au groupe Docker, déconnectez-vous puis reconnectez-vous pour que les changements prennent effet.
Pour Linux Mint basé sur Ubuntu, utilisez le dépôt Docker correspondant à la version Ubuntu sous-jacente plutôt que de réutiliser automatiquement le dépôt Debian.
Mise en place de la stack DNS-DoH
Je travaille ici dans un répertoire dédié :
mkdir -p ~/docker/dns-doh/dnscrypt-proxy mkdir -p ~/docker/dns-doh/etc-dnsmasq.d cd ~/docker/dns-doh1. Télécharger les images Docker
Avant de couper l’ancien DNS, je récupère les images nécessaires :
docker pull klutchell/dnscrypt-proxy docker pull pihole/pihole2. docker-compose.yml
Je crée le fichier suivant :
nano docker-compose.ymlVoici le contenu du fichier :
services: dnscrypt-proxy: container_name: dnscrypt-proxy image: klutchell/dnscrypt-proxy restart: unless-stopped volumes: - ./dnscrypt-proxy:/config networks: dnsnet: ipv4_address: 172.22.0.2 mem_limit: 512m mem_reservation: 256m cpus: "1.0" pihole: container_name: pihole image: pihole/pihole:latest restart: unless-stopped depends_on: - dnscrypt-proxy hostname: pihole env_file: - .env environment: TZ: ${TZ} FTLCONF_webserver_api_password: ${PIHOLE_WEBPASSWORD} FTLCONF_dns_upstreams: 172.22.0.2#53 FTLCONF_dns_listeningMode: all FTLCONF_misc_etc_dnsmasq_d: "true" volumes: - ./etc-pihole:/etc/pihole - ./etc-dnsmasq.d:/etc/dnsmasq.d ports: - "127.0.0.1:53:53/tcp" - "127.0.0.1:53:53/udp" - "127.0.0.1:8080:80/tcp" networks: dnsnet: ipv4_address: 172.22.0.3 mem_limit: 512m mem_reservation: 256m cpus: "1.0" networks: dnsnet: ipam: config: - subnet: 172.22.0.0/24Pi-hole est publié uniquement sur la boucle locale de la machine :
127.0.0.1. Il n’est donc pas exposé sur tout le réseau local par défaut.3. Fichier .env
Je crée un fichier
.envavec les variables nécessaires :nano .envContenu :
TZ=Europe/Paris PIHOLE_WEBPASSWORD=mot_de_passe_a_remplacerRemplacez
mot_de_passe_a_remplacerpar un vrai mot de passe pour l’interface web de Pi-hole.4. Configuration de dnscrypt-proxy
Je crée le fichier de configuration :
nano ~/docker/dns-doh/dnscrypt-proxy/dnscrypt-proxy.tomlEt je configure dnscrypt-proxy pour utiliser des résolveurs chiffrés, non filtrants, hors FAI et compatibles avec cette stack :
server_names = [ 'libredns', 'doh.ffmuc.net', 'doh.appliedprivacy.net', 'dns.digitale-gesellschaft.ch', 'uncensoreddns-dk-ipv4', 'uncensoreddns-ipv4', 'fdn' ] listen_addresses = ['0.0.0.0:53'] max_clients = 300 ipv4_servers = true ipv6_servers = false dnscrypt_servers = true doh_servers = true odoh_servers = false require_dnssec = false require_nolog = true require_nofilter = true disabled_server_names = [] force_tcp = false http3 = false timeout = 5000 keepalive = 30 cache = true cache_size = 8192 cache_min_ttl = 2400 cache_max_ttl = 86400 cache_neg_min_ttl = 60 cache_neg_max_ttl = 600 lb_strategy = 'p2' lb_estimator = true ignore_system_dns = true [static]Cette configuration autorise les résolveurs DoH et DNSCrypt. La liste proposée privilégie des résolveurs non filtrants, hors FAI, et compatibles avec dnscrypt-proxy.
Dans Docker, dnscrypt-proxy doit écouter sur
0.0.0.0:53dans son conteneur pour que Pi-hole puisse le joindre via le réseau Docker. Le conteneur dnscrypt-proxy n’expose aucun port directement sur l’hôte.5. Permissions du dossier dnscrypt-proxy
L’image
klutchell/dnscrypt-proxyécrit ses fichiers de cache dans/config. Le dossier monté doit donc être accessible à l’utilisateur non privilégié du conteneur.cd ~/docker/dns-doh sudo chown -R 65532:65532 dnscrypt-proxyAprès cette commande, les fichiers du dossier
dnscrypt-proxyappartiennent à l’utilisateur non privilégié du conteneur. Pour modifier ensuitednscrypt-proxy.toml, utilisez par exemple :sudo nano ~/docker/dns-doh/dnscrypt-proxy/dnscrypt-proxy.toml6. Configuration dnsmasq pour Pi-hole
Je crée un petit fichier de réglage pour Pi-hole :
cat > ~/docker/dns-doh/etc-dnsmasq.d/99-custom.conf <<'EOF' dns-forward-max=300 EOF7. Validation de la configuration Docker Compose
Avant de démarrer, je vérifie la syntaxe :
cd ~/docker/dns-doh docker compose configLa commande doit afficher la configuration complète sans erreur.
8. Démarrage
Une fois tout en place, je lance la stack :
cd ~/docker/dns-doh docker compose up -dSur les systèmes plus anciens, la commande peut être :
docker-compose up -d9. Vérifier les conteneurs
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'NAMES|pihole|dnscrypt'Résultat attendu :
pihole Up ... (healthy) 127.0.0.1:53->53/tcp, 127.0.0.1:53->53/udp, 127.0.0.1:8080->80/tcp dnscrypt-proxy Up ...10. Vérifier les résolveurs détectés
docker logs --tail=120 dnscrypt-proxyLes logs doivent indiquer des résolveurs actifs, par exemple :
[libredns] OK (DoH) [doh.ffmuc.net] OK (DoH) [dns.digitale-gesellschaft.ch] OK (DoH) [uncensoreddns-dk-ipv4] OK (DoH)Pour afficher la liste effective retenue par dnscrypt-proxy :
docker exec dnscrypt-proxy dnscrypt-proxy \ -config /config/dnscrypt-proxy.toml \ -list11. Vérifier que Pi-hole interroge dnscrypt-proxy
docker exec pihole dig @172.22.0.2 kernel.org A +time=3 +tries=1 +shortRésultat attendu :
kernel.org renvoie une adresse IP12. Tester Pi-hole depuis l’hôte
dig @127.0.0.1 kernel.org A +short dig @127.0.0.1 pi.hole A +shortRésultat attendu :
kernel.org renvoie une adresse IP pi.hole renvoie 172.22.0.313. Vérifier le chemin complet avec une requête fraîche
Pour éviter de tester uniquement une réponse déjà en cache, je lance une requête fraîche :
rand="test-$(date +%s).example.com" dig @127.0.0.1 "$rand" A +time=5 +tries=1 docker logs --since=2m dnscrypt-proxyLa commande
digdoit répondre via127.0.0.1#53. Les logs dnscrypt-proxy permettent de vérifier l’activité de la couche chiffrée.14. Utiliser Pi-hole comme DNS local
Il faut maintenant configurer le système pour utiliser Pi-hole comme résolveur DNS local :
127.0.0.1Avec NetworkManager, identifiez la connexion active :
nmcli connection show --activeAppliquez le DNS local à la connexion choisie :
sudo nmcli connection modify "NOM_DE_LA_CONNEXION" ipv4.ignore-auto-dns yes ipv4.dns "127.0.0.1" ipv6.ignore-auto-dns yes sudo nmcli connection down "NOM_DE_LA_CONNEXION" sudo nmcli connection up "NOM_DE_LA_CONNEXION"Vérifiez ensuite le serveur DNS réellement utilisé :
dig kernel.org A | grep SERVERLa sortie doit indiquer :
SERVER: 127.0.0.1#53Si un gestionnaire réseau externe réécrit automatiquement
/etc/resolv.conf, configurez le DNS local via l’outil réseau de votre distribution plutôt qu’en modifiant ce fichier à la main.15. Accéder à l’interface web de Pi-hole
Ouvrez dans votre navigateur :
http://localhost:8080/adminConnectez-vous avec le mot de passe défini dans le fichier
.env.16. Ajouter des listes de blocage recommandées
Pour améliorer le blocage des publicités et des traqueurs, ajoutez des listes de blocage à Pi-hole.
Dans l’interface Pi-hole :
- ouvrez
http://localhost:8080/admin; - allez dans
Group Management, puisAdlists; - ajoutez vos listes ;
- allez dans
Tools, puisUpdate Gravity.
Listes utiles :
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts https://adaway.org/hosts.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main/domains/light.txt https://small.oisd.nl/Résolveurs DoH complémentaires
Ces résolveurs peuvent être ajoutés à
server_namessi vous voulez élargir la liste des résolveurs utilisables par dnscrypt-proxy. Ce ne sont pas les modes fallback du DNS Switcher.dnsforge.de-nofilter mullvad-doh nic.cz doh.ibksturmPour les activer, ajoutez-les à la liste
server_namesdansdnscrypt-proxy.toml, puis recréez le conteneur :cd ~/docker/dns-doh docker compose up -d --force-recreate dnscrypt-proxyRésolveurs à éviter dans cette configuration
Les résolveurs filtrants, familiaux, publicitaires, commerciaux ou trop centralisés ne sont pas retenus dans cette configuration.
google cloudflare adguard nextdns cleanbrowsing quad9 filtré mullvad-adblock* family safe protectiveModes fallback
Si vous utilisez un DNS Switcher pour basculer entre DoT, DoH et des modes de secours, distinguez deux fallbacks.
Fallback neutre
Ce mode sert à retrouver une résolution DNS hors FAI quand les stacks locales sont arrêtées ou cassées. Il ne remplace pas Pi-hole et ne fournit pas de filtrage publicitaire.
91.239.100.100 # UncensoredDNS anycast 80.67.169.12 # FDN ns0Fallback filtrant externe
Ce mode conserve un filtrage DNS minimal quand Pi-hole est indisponible, en déléguant temporairement le filtrage à des résolveurs externes.
94.140.14.14 # AdGuard DNS filtrant 45.90.28.0 # NextDNS filtrant configurableCe mode est un choix explicite. Il n’est pas le chemin normal de résolution.
Tester une liste de résolveurs dnscrypt-proxy
docker exec dnscrypt-proxy dnscrypt-proxy \ -config /config/dnscrypt-proxy.toml \ -listPour voir les latences et les serveurs actifs :
docker logs --tail=160 dnscrypt-proxy | grep -E '\] \[NOTICE\] \[|Sorted latencies|lowest initial latency|WARNING|ERROR|listening'Arrêter la stack
cd ~/docker/dns-doh docker compose downRedémarrer la stack
cd ~/docker/dns-doh docker compose up -dMettre à jour les images
cd ~/docker/dns-doh docker compose pull docker compose up -dDépannage rapide
Pi-hole ne répond pas sur 127.0.0.1
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'NAMES|pihole|dnscrypt' docker logs --tail=80 pihole docker logs --tail=80 dnscrypt-proxyPi-hole répond, mais dnscrypt-proxy ne répond pas
docker exec pihole dig @172.22.0.2 kernel.org A +time=3 +tries=1 +short docker logs --tail=120 dnscrypt-proxyDans Docker, dnscrypt-proxy doit écouter sur
0.0.0.0:53dans son conteneur. S’il écoute seulement sur127.0.0.1:53, Pi-hole ne pourra pas le joindre depuis son propre conteneur.dnscrypt-proxy affiche des erreurs de permission
Si les logs indiquent que dnscrypt-proxy ne peut pas écrire ses fichiers de cache dans
/config, appliquez :cd ~/docker/dns-doh sudo chown -R 65532:65532 dnscrypt-proxy docker compose up -d --force-recreate dnscrypt-proxyDocumentation utile
Conclusion
Cette solution me permet d’utiliser une résolution DNS chiffrée, sans passer par les serveurs DNS de mon FAI, tout en bénéficiant du filtrage local de Pi-hole.
Le chemin de résolution est :
applications -> 127.0.0.1 -> Pi-hole -> dnscrypt-proxy -> résolveurs DNS chiffrésLes listes de blocage restent locales. Les résolveurs amont reçoivent les requêtes transmises après traitement par Pi-hole.
Vous pouvez utiliser cette stack seule, ou l’alterner avec une stack Pi-hole + Unbound DoT selon le degré de contrôle, de discrétion et de résilience recherché.
Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
- AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.