Pourquoi auto-héberger Pi-hole sur un VPS
La plupart des guides Pi-hole supposent un Raspberry Pi sur votre réseau local. Un VPS change radicalement l'équation : votre DNS bloqueur est joignable depuis n'importe quel appareil, n'importe où dans le monde. Configurez votre smartphone en déplacement pour pointer vers votre VPS, et les publicités disparaissent y compris sur les réseaux mobiles et les Wi-Fi publics.
Bénéfices concrets de Pi-hole sur VPS
- Protection universelle : couvre tous vos appareils (PC, téléphones, tablettes) sans configuration par appareil
- Réduction de la bande passante : les requêtes bloquées ne consomment aucun octet de téléchargement
- Logs DNS centralisés : visibilité complète sur les domaines contactés par chaque appareil
- Indépendance vis-à-vis des FAI : votre DNS ne transite plus par le résolveur de votre opérateur
- Blocage des traceurs IoT : les objets connectés ne peuvent pas contacter leurs serveurs de télémétrie
- Personnalisable : ajoutez vos propres règles, whitelistez ce dont vous avez besoin, choisissez vos listes
Pi-hole v5 vs Pi-hole v6 : ce qui a changé
Pi-hole v5 vs v6
Faites défiler le tableau
| Critère | Pi-hole v5 | Pi-hole v6 (2025) |
|---|---|---|
| Interface web | PHP + lighttpd | Application intégrée dans FTL, sans lighttpd |
| Moteur DNS | dnsmasq séparé | FTL unifié (Faster Than Light) embarque le DNS |
| API | API limitée, clé dans l'URL | API REST complète avec authentification par token |
| Configuration | Fichiers /etc/pihole/* | Fichier TOML unique pihole.toml |
| Installation | Script curl | bash | Script curl | bash (identique, même URL) |
| Docker | Image pihole/pihole | Image pihole/pihole (mise à jour, même nom) |
Pi-hole v6 est sorti le 18 février 2025. La migration depuis la v5 passe par le script d'installation habituel lancé sur un système déjà en v5 : Pi-hole détecte la version existante, propose la mise à jour et convertit la configuration au format TOML (/etc/pihole/pihole.toml). Si vous partez de zéro, installez directement la v6.
Deux changements comptent pour un VPS. D'abord, chaque réglage de pihole.toml a son équivalent en variable d'environnement FTLCONF_<section>_<clé> : WEBPASSWORD de la v5 devient FTLCONF_webserver_api_password, et les serveurs amont s'écrivent FTLCONF_dns_upstreams, séparés par des points-virgules. Une variable posée ainsi passe en lecture seule dans l'interface : c'est la source de vérité. Ensuite, aux listes de blocage s'ajoutent des listes d'autorisation par abonnement (antigravity), pratiques pour neutraliser des faux positifs connus.
Au 7 novembre 2026, les versions courantes sont Pi-hole Core v6.5, FTL v6.8 et Web v6.6.1 (17 octobre 2026) ; l'image Docker correspondante est pihole/pihole:2026.10.1, publiée le 31 octobre 2026 pour mettre à jour sa base Alpine.
Prérequis techniques
Ce dont vous avez besoin
- Un VPS sous Ubuntu 22.04/24.04 ou Debian 12 avec au moins 512 Mo de RAM (1 Go recommandé)
- Une adresse IPv4 statique et idéalement une adresse IPv6
- Accès SSH root ou sudo
- Le port 53 (TCP et UDP) fermé à Internet : ouvert seulement à l'interface WireGuard ou à vos propres adresses IP, jamais à tous
- Port 80 ou 443 pour l'interface web (optionnel, mais recommandé avec HTTPS)
Sécurité d'abord : pas de résolveur ouvert, et des mises à jour suivies
Sur un Raspberry Pi derrière une box, le port 53 n'est joignable que depuis la maison. Sur un VPS, il est sur Internet : un résolveur qui répond à tout le monde sert de relais aux attaques DDoS par amplification DNS, et votre IP finit sur des listes noires. Pi-hole le sait. Son mode d'écoute par défaut, « Allow only local requests », n'accepte que les hôtes d'un sous-réseau dont une interface existe sur le serveur ; le mode ALL « permet toutes les origines », et la documentation de FTL prévient qu'il peut faire de votre Pi-hole un résolveur ouvert s'il n'est pas protégé par un pare-feu.
La bonne architecture découle de là : vos appareils rejoignent le VPS par un tunnel WireGuard, dont le sous-réseau est local pour Pi-hole, et le port 53 reste fermé au reste du monde. Vérifiez-le depuis l'extérieur avec nmap -sU -p 53 IP_DE_VOTRE_VPS : le port doit apparaître closed ou filtered.
Suivez aussi les correctifs. Pi-hole a publié en 2026 plusieurs séries d'avis de sécurité (avril, mai, juillet, septembre et octobre), dont des exécutions de code à distance par injection dans la configuration, comme CVE-2026-35517 via dns.upstreams, et des élévations de privilèges locales. Le dernier lot est corrigé dans les versions du 17 octobre 2026. Lancez pihole -up en installation native, ou docker compose pull && docker compose up -d en Docker, et appliquez en parallèle les mises à jour de sécurité automatiques du système. Enfin, ne laissez pas le mot de passe vide : sans valeur fixée, Pi-hole en génère un aléatoire qu'il écrit dans les logs au premier démarrage. Pour un script ou un exporteur, créez un mot de passe d'application dans Settings → Web interface / API plutôt que d'y copier le mot de passe administrateur.
Déployer Pi-hole pas à pas
Installation complète sur Ubuntu/Debian
Désactiver le stub resolver de systemd-resolved
Sur Ubuntu et Debian récents, systemd-resolved occupe le port 53 en écoute locale. Pi-hole ne peut pas démarrer tant que ce port est pris. Éditez /etc/systemd/resolved.conf et ajoutez DNSStubListener=no sous la section [Resolve]. Rechargez ensuite : sudo systemctl reload systemd-resolved. Vérifiez que le port est libre avec : ss -tulpn | grep ':53'.
Installer Pi-hole
Lancez le script officiel :
curl -sSL https://install.pi-hole.net | bashL'installateur vous demande l'interface réseau (souvent
eth0) et le DNS amont (choisissez Custom si vous installez Unbound ensuite). Gardez le mode d'écoute par défaut, « Allow only local requests » : avec WireGuard, c'est celui qui convient. Notez le mot de passe admin affiché à la fin, ou fixez-le avecpihole setpassword.Configurer le pare-feu
N'ouvrez pas le port 53 à tout Internet. Ouvrez le port de WireGuard, autorisez le DNS depuis le sous-réseau du tunnel, et refusez le reste :
sudo ufw allow 51820/udp sudo ufw allow from 10.8.0.0/24 to any port 53 sudo ufw deny 53Adaptez
10.8.0.0/24au sous-réseau de votre tunnel. Si vous utilisez CSF ou firewalld, transposez les mêmes règles. L'interface web ne doit pas non plus être publique : passez par le tunnel ou par un reverse proxy HTTPS restreint à vos IP.Vérifier le fonctionnement
Testez la résolution, puis le blocage, depuis le VPS lui-même ; vérifiez ensuite depuis l'extérieur que le port n'est pas joignable hors tunnel :
# depuis le VPS dig @127.0.0.1 google.com dig @127.0.0.1 doubleclick.net # depuis un poste extérieur, HORS tunnel : doit échouer nmap -sU -p 53 IP_DE_VOTRE_VPSgoogle.comdoit renvoyer une adresse,doubleclick.netdoit répondre0.0.0.0, etnmapdoit afficher le portclosedoufiltered.Pointer vos appareils vers le VPS
Le plus simple est de passer par WireGuard : dans la configuration de chaque client, indiquez l'adresse de Pi-hole dans le tunnel comme serveur DNS, selon la méthode du guide WireGuard de Pi-hole :
[Interface] Address = 10.8.0.2/32 DNS = 10.8.0.1Sur Android, le « DNS privé » ne convient pas : il attend le nom d'hôte d'un fournisseur DNS-over-TLS, pas une adresse IP (cf. l'aide Android), et Pi-hole ne sert pas le DNS chiffré. Sur iOS et sur ordinateur, l'application WireGuard applique la même ligne
DNS. Le tunnel protège aussi en 4G et sur les Wi-Fi publics.Accéder à l'interface web
En v6, l'interface est servie par FTL lui-même sur
http://IP/admin(et en HTTPS avec un certificat auto-signé). Ouvrez-la à travers le tunnel, par exemplehttp://10.8.0.1/admin, et connectez-vous avec le mot de passe défini à l'installation. Le tableau de bord affiche en temps réel le nombre de requêtes, le taux de blocage, les domaines les plus sollicités et les clients les plus actifs.
Ajouter des listes de blocage recommandées
Pi-hole est livré avec une liste de base. Pour un blocage efficace, ajoutez des listes communautaires éprouvées depuis le menu Adlists de l'interface web (dans Group Management → Adlists).
Listes recommandées
- StevenBlack Unified (publicités + traceurs) : https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts — la référence, ~100 000 domaines
- OISD Big : https://big.oisd.nl — liste agressive mais peu de faux positifs, ~500 000 domaines
- Firebog Ticked (coche verte uniquement) : visitez firebog.net et ajoutez uniquement les listes cochées en vert pour minimiser les faux positifs
- HaGeZi Multi PRO : https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt — excellente couverture malwares
- Perflyst Smart-TV : pour bloquer la télémétrie des téléviseurs connectés
Après avoir ajouté des listes, cliquez sur Tools → Update Gravity (ou lancez pihole -g en SSH) pour télécharger et compiler toutes les listes. L'opération prend une à trois minutes selon le nombre de listes, et Pi-hole reste fonctionnel pendant ce temps. Ensuite, Gravity se met à jour seul une fois par semaine, dans la nuit du samedi au dimanche : inutile d'ajouter votre propre tâche cron.
Gérer les faux positifs et le whitelisting
Un blocage trop agressif finit par casser des services légitimes. Pi-hole fournit des outils de diagnostic précis pour identifier et corriger les faux positifs sans affaiblir votre protection.
Diagnostiquer et corriger un faux positif
Identifier le domaine bloqué
Dans l'interface, ouvrez Query Log (temps réel) ou Long-term data → Query Log. Filtrez par client ou par status Blocked. Chaque entrée indique le domaine exact et la liste qui le bloque. En v6, vous pouvez cliquer sur l'entrée pour voir les détails complets.
Ajouter à la liste d'autorisation
Cliquez sur le domaine puis sur Allow, ou allez dans Domains et ajoutez-le en type Allow. Pour autoriser un domaine et tous ses sous-domaines, utilisez l'option Wildcard. Une entrée autorisée l'emporte toujours sur les listes de blocage. Si un même faux positif revient sur beaucoup de domaines, abonnez-vous plutôt à une liste d'autorisation maintenue par la communauté, dans Lists, en type Allow.
Autoriser en ligne de commande
La v6 a renommé les commandes :
pihole -wet--white-wildn'existent plus. Depuis SSH :pihole allow exemple.com pihole --allow-wild exemple.com pihole allow -lLa première autorise un domaine exact, la deuxième le domaine et ses sous-domaines, la troisième affiche la liste d'autorisation.
Cas courants de faux positifs
Microsoft Teams et Office 365 bloquent parfois sur des listes agressives (domaines live.com, microsoft.com). Apple utilise des CDN partagés avec des traceurs. Les mises à jour automatiques de Windows peuvent être bloquées par certaines listes. Le site firebog.net maintient une liste verte précisément pour réduire ces problèmes.
Pi-hole dans Docker, et les conflits du port 53
Si votre VPS fait déjà tourner des conteneurs, Pi-hole peut lui-même être un conteneur, et servir de résolveur à tous les autres. Deux pièges reviennent : un autre processus occupe déjà le port 53 de l'hôte, et les conteneurs ne joignent pas l'adresse sur laquelle Pi-hole écoute. Le résolveur embarqué de Docker (127.0.0.11) vit, lui, à l'intérieur de chaque conteneur : il ne prend pas le port 53 de l'hôte.
Déployer Pi-hole avec Docker Compose et y brancher vos conteneurs
Écrire le docker-compose.yml
Le fichier suit la documentation Docker de Pi-hole, avec un tag daté plutôt que
latestpour maîtriser les mises à jour. Le DNS n'est publié que sur la boucle locale et sur l'adresse du pont Docker172.17.0.1, jamais sur l'IP publique ; l'interface web ne l'est que sur127.0.0.1:8080, pour un reverse proxy.mkdir -p /opt/pihole/etc-pihole && cd /opt/pihole cat > docker-compose.yml << 'EOF' services: pihole: container_name: pihole image: pihole/pihole:2026.10.1 ports: - "127.0.0.1:53:53/tcp" - "127.0.0.1:53:53/udp" - "172.17.0.1:53:53/tcp" - "172.17.0.1:53:53/udp" - "127.0.0.1:8080:80/tcp" environment: TZ: 'Europe/Paris' FTLCONF_webserver_api_password: 'un-mot-de-passe-long' FTLCONF_dns_listeningMode: 'ALL' FTLCONF_dns_upstreams: '9.9.9.9;1.1.1.1' volumes: - './etc-pihole:/etc/pihole' restart: unless-stopped EOF docker compose up -d && docker compose logs pihole | tail -20FTLCONF_dns_listeningMode: 'ALL'est requis sur le réseau bridge, parce que les requêtes arrivent de l'extérieur du sous-réseau du conteneur ; c'est le mapping de ports qui empêche l'exposition publique. Ajoutezcap_add: NET_ADMINseulement si Pi-hole fait aussi serveur DHCP, ce qui n'a pas de sens sur un VPS.Brancher les autres conteneurs sur Pi-hole
Dans chaque service de vos autres stacks, indiquez l'adresse du pont Docker :
services: mon-app: image: mon-image dns: - 172.17.0.1N'écrivez pas
127.0.0.1: la documentation de Docker rappelle que, dans un conteneur,--dns=127.0.0.1désigne la boucle locale du conteneur lui-même, pas celle de l'hôte. Pour un réglage global, la même adresse va dans/etc/docker/daemon.jsonsous la clédns, suivie d'unsystemctl restart docker.Vérifier qu'aucun autre processus n'écoute
Commande de diagnostic :
sudo ss -tulpn | grep ':53'. Le seul processus attendu estpihole-FTL(oudocker-proxypour les ports publiés par le conteneur). Si vous voyez systemd-resolved, named ou bind9, désactivez le service concurrent. Pour systemd-resolved,DNSStubListener=nodans/etc/systemd/resolved.confsuffit, comme en installation native.Contrôler le résolveur vu par un conteneur
Depuis un conteneur, lisez sa configuration DNS :
docker exec mon-app cat /etc/resolv.conf sudo ss -tulpn | grep ':53'Un conteneur d'un réseau Compose personnalisé affiche
127.0.0.11, le résolveur embarqué de Docker, qui relaie vers les serveursdns:déclarés : c'est normal. La preuve se lit dans le Query Log de Pi-hole, où le conteneur doit apparaître comme client. Si la mise à jour de Gravity échoue avec « Could not access the internet », le conteneur Pi-hole se résout probablement lui-même en boucle : vérifiez queFTLCONF_dns_upstreamsvise bien un résolveur externe ou Unbound.
Pi-hole + Unbound : récursion DNS complète sans tiers
Par défaut, Pi-hole transfère les requêtes non bloquées vers un résolveur public (Cloudflare 1.1.1.1, Google 8.8.8.8). Ce résolveur voit alors l'ensemble de vos requêtes DNS. Unbound résout ce problème en interrogeant directement les serveurs racine et d'autorité — sans intermédiaire.
Installer et configurer Unbound
Installer Unbound
sudo apt install unbound. Unbound est disponible dans les dépôts officiels Ubuntu et Debian. Il démarre automatiquement mais nous allons le configurer pour qu'il écoute uniquement en local.
Créer la configuration Pi-hole + Unbound
Créez
/etc/unbound/unbound.conf.d/pi-hole.confd'après la configuration du guide Unbound de Pi-hole : écoute sur127.0.0.1port5335, durcissement DNSSEC, tampon EDNS à 1232 octets.sudo tee /etc/unbound/unbound.conf.d/pi-hole.conf > /dev/null << 'EOF' server: verbosity: 0 interface: 127.0.0.1 port: 5335 do-ip4: yes do-udp: yes do-tcp: yes do-ip6: no harden-glue: yes harden-dnssec-stripped: yes edns-buffer-size: 1232 prefetch: yes EOF sudo systemctl restart unboundInstallé depuis les dépôts Debian ou Ubuntu, Unbound connaît déjà les serveurs racine : le téléchargement de
root.hintsdepuis internic.net n'est utile que pour une installation compilée à la main.Pointer Pi-hole vers Unbound
Dans l'interface Pi-hole, allez dans Settings → DNS. Désactivez tous les DNS upstream cochés. Dans le champ Custom DNS, entrez 127.0.0.1#5335. Sauvegardez. Pi-hole enverra maintenant toutes les requêtes non bloquées à Unbound, qui les résoudra en direct depuis les serveurs racine.
Vérifier la récursion et DNSSEC
Testez Unbound directement :
dig pi-hole.net @127.0.0.1 -p 5335 dig fail01.dnssec.works @127.0.0.1 -p 5335 dig +ad dnssec.works @127.0.0.1 -p 5335La première requête doit renvoyer une adresse. La deuxième doit échouer en
SERVFAIL, sans adresse : la signature du domaine est volontairement cassée. La troisième doit répondreNOERRORavec le drapeauad, qui confirme la validation DNSSEC. Dans le Query Log de Pi-hole, les requêtes doivent apparaître transmises à127.0.0.1#5335.Neutraliser openresolv sur Debian
Debian installe d'office
openresolv, et le serviceunbound-resolvconfécrit alorsnameserver 127.0.0.1sans le port5335dans/etc/resolv.conf: le système interroge Pi-hole, qui interroge Unbound, qui n'est plus joint. Le guide Unbound de Pi-hole recommande de désactiver ce service :sudo systemctl disable --now unbound-resolvconf.service # puis commenter la ligne unbound_conf= dans /etc/resolvconf.confRedémarrez ensuite Unbound et refaites les tests de l'étape précédente.
Surveiller les métriques Pi-hole
Le tableau de bord Pi-hole v6 affiche les métriques clés en temps réel. Voici comment les interpréter et ce qu'il faut surveiller.
Métriques importantes et valeurs de référence
- Taux de blocage (Ads blocked today) : entre 10 % et 30 % est normal. Un taux en dessous de 5 % suggère que vos listes sont incomplètes. Un taux supérieur à 40 % peut signaler trop de faux positifs.
- Queries/24h : donne une idée de la charge. Un réseau familial génère typiquement 5 000 à 50 000 requêtes par jour.
- Top Blocked Domains : si un domaine publicitaire revient en tête chaque jour, c'est que l'application correspondante est particulièrement intrusive.
- Top Clients : identifiez les appareils les plus bavards — les objets IoT sont souvent en tête.
- DNS cache size : en v6, FTL gère le cache interne. Un hit rate élevé (>60 %) réduit la latence perçue.
- Query Types : un volume anormal de requêtes PTR (résolution inverse) peut indiquer un scan réseau ou un logiciel mal configuré.
Pour exporter les métriques vers Prometheus et Grafana, l'API REST de la v6 expose notamment /api/stats/summary et /api/info/metrics. L'exporteur communautaire pihole-exporter s'y connecte avec un mot de passe d'application (Settings → Web interface / API) et alimente un tableau de bord existant sans toucher à la configuration de Pi-hole.
Pi-hole v6 ou AdGuard Home ?
AdGuard Home est l'autre DNS filtrant à auto-héberger, écrit en Go (version v0.107.80 du 3 novembre 2026). Le tableau reprend les différences que l'on vérifie dans la documentation des deux projets ; pour un VPS relié à vos appareils par WireGuard, le chiffrement DNS natif d'AdGuard Home compte moins, puisque le tunnel chiffre déjà le trafic.
Pi-hole v6 et AdGuard Home, critère par critère
Faites défiler le tableau
| Critère | Pi-hole v6 | AdGuard Home |
|---|---|---|
| Architecture | FTL (C) avec serveur web et API intégrés, sans PHP ni lighttpd | Binaire Go unique, multiplateforme |
| Servir du DNS chiffré (DoH, DoT) aux clients | Non, il faut un logiciel en plus (ou un tunnel WireGuard) | Oui, nativement |
| Amont chiffré (DoH, DoT, DNSCrypt) | Non natif (cloudflared ou Unbound en complément) | Oui, nativement |
| Règles par client | Oui, par groupes de clients | Oui |
| Contrôle parental et SafeSearch forcé | Via des listes dédiées ; pas de SafeSearch forcé | Intégrés |
| Configuration déclarative | Fichier `pihole.toml` et variables `FTLCONF_*` | Fichier YAML et interface web |
Sauvegarder et restaurer la configuration Pi-hole
Une sauvegarde régulière de Pi-hole est essentielle : elle préserve vos listes personnalisées, votre whitelist, vos groupes et la configuration DNS, que vous ne voudrez pas reconfigurer manuellement après une migration ou une réinstallation.
Sauvegarde et restauration
Créer une sauvegarde Teleporter
Dans l'interface web, ouvrez Settings → Teleporter et exportez l'archive : Pi-hole génère un fichier ZIP avec la configuration, les listes, les groupes et les domaines autorisés ou bloqués. En ligne de commande, la v6 passe par le binaire FTL :
mkdir -p /root/pihole-backups && cd /root/pihole-backups sudo pihole-FTL --teleporterL'archive est créée dans le répertoire courant, et son nom est affiché.
Automatiser la sauvegarde
Ajoutez ces deux tâches avec
crontab -e: une archive chaque nuit, et le ménage des archives de plus de 30 jours.0 2 * * * cd /root/pihole-backups && pihole-FTL --teleporter >/dev/null 2>&1 0 3 * * * find /root/pihole-backups -name '*.zip' -mtime +30 -deleteEn Docker, préfixez la commande par
docker exec piholeet écrivez l'archive dans le volume monté, par exemple/etc/pihole.Restaurer depuis une sauvegarde
Après une réinstallation, ouvrez Settings → Teleporter et importez votre fichier ZIP, ou passez par la ligne de commande :
sudo pihole-FTL --teleporter /root/pihole-backups/ARCHIVE.zipPi-hole importe réglages, groupes et listes. En v6, le format Teleporter diffère de la v5 : les sauvegardes v5 ne sont que partiellement reprises (listes importées, configuration réseau à refaire à la main).
Sauvegarder la configuration Unbound
Si vous utilisez Unbound, ajoutez ses fichiers à votre sauvegarde : tar -czf /root/unbound-config-$(date +%Y%m%d).tar.gz /etc/unbound/. La configuration Unbound ne change pas entre les versions et peut être restaurée directement.
Hébergez vos sauvegardes hors du VPS : copiez-les vers un bucket S3, un serveur distant ou votre poste local. Si votre VPS devient inaccessible, vous pourrez reconfigurer Pi-hole sur un nouveau serveur en quelques minutes en important simplement le fichier Teleporter.