La mascotte ours polaire de NordBastion, debout dans un hall en pierre nordique sombre à côté d'une baie de serveurs, une patte levée vers une pierre runique holographique cyan flottante énumérant des noms de domaine, avec quatre faisceaux de requêtes se déployant en éventail à travers une arche runique vers trois monolithes de serveurs lointains et un cinquième faisceau arrêté par un bouclier ambré à cercle barré, une aurore boréale visible à travers la fenêtre derrière
How-to · Réseau·15 min de lecture · 40 min pratique

Votre propre résolveur DNS.
Le seul journal que personne ne pense à déplacer.

Chaque domaine que vos appareils consultent est une ligne horodatée dans le fichier de quelqu'un d'autre — celui de votre FAI, ou celui d'un résolveur public gratuit. Six étapes pour déplacer ce fichier sur une machine qui vous appartient : Unbound qui résout depuis la racine, AdGuard Home qui filtre en amont, du DNS chiffré sur un vrai certificat, et un port 53 qui ne fait jamais face à internet. La machine coûte $3.90 par mois. Testé sur Debian 12.

Les six étapes
  1. 01

    Forme

    Récursif, pas relais

  2. 02

    Fermer

    Le port 53, avant qu'il ne s'ouvre

  3. 03

    Résoudre

    Unbound, qui valide

  4. 04

    Filtrer

    AdGuard Home, DoH, DoT

  5. 05

    Atteindre

    Le tunnel d'abord, les clients ensuite

  6. 06

    Vérifier

    Fuites, DNSSEC, uptime

Avant de commencer · Ce qui fuit vraiment

Le DNS est l'index de votre vie. Par défaut, ce n'est pas vous qui le détenez.

Chiffrez le disque, faites transiter le trafic par un tunnel, payez en Monero, inscrivez-vous sans email — et laissez ensuite l'ordinateur portable demander à un résolveur auquel vous n'avez jamais pensé de traduire chaque nom d'hôte qu'il touche, une requête à la fois, en clair, toute la journée. Le lookup de noms est la partie de la pile que l'on durcit en dernier, et c'est la partie qui produit l'enregistrement le plus net de ce que quelqu'un fait réellement.

Il vaut la peine d'être précis sur ce que contient cet enregistrement, parce que « le DNS révèle votre navigation » est à la fois vrai et paresseux. Un journal de requêtes est une liste de noms de domaine horodatés, attribués à l'adresse IP qui les a demandés. Ce ne sont pas les pages que vous lisez, et ce n'est généralement pas l'URL exacte. C'est quelque chose de plus discret et, pour le profilage, de meilleur : la forme d'une vie. La banque. L'employeur. L'appli de rencontres qui se manifeste toutes les quatre minutes. Le site médical visité une fois à 02h00. Les trois domaines qui n'apparaissent jamais que groupés parce qu'ils appartiennent au même client de messagerie. Personne n'a besoin du contenu quand l'index est aussi bon.

Quatre parties peuvent détenir cet index, et l'auto-hébergement le fait passer des deux premières à la quatrième :

Mise en place Qui voit chacune de vos requêtes Visible sur le fil Ensemble d'anonymat
Résolveur du FAI, en clair (par défaut)Votre FAI, par nom et par compteTout, pour quiconque est sur le cheminLeurs abonnés
Résolveur public, chiffré (DoH/DoT)Cette seule entreprise, liée à votre IPRien d'autre que la destinationDes millions
Votre propre résolveur, en relais vers un upstreamL'upstream que vous avez choisi — inchangéRien d'autre que la destinationUn
Votre propre résolveur, récursif depuis la racinePersonne — chaque zone ne voit que ses propres nomsRien d'autre que la destinationUn, sur une IP qui n'est pas vous

La troisième ligne est celle qui piège les gens. Installer un résolveur sur votre propre serveur puis lui dire de tout relayer vers 1.1.1.1 change exactement une chose : vos requêtes arrivent désormais chez Cloudflare depuis une adresse IP différente. Le journal existe toujours, il appartient toujours à quelqu'un d'autre, et vous avez ajouté une machine à maintenir en échange de rien.

La dernière colonne est le coût honnête, et ce guide y revient à deux reprises. Un résolveur utilisé par un seul foyer est un résolveur dont les requêtes appartiennent sans ambiguïté à ce foyer. Ce qui rend l'échange intéressant, c'est que l'IP qui pose la question est un serveur nordique loué, sans document d'identité derrière lui — pas une ligne domestique avec un nom d'abonné, et pas un compte chez un hyperscaler avec une carte enregistrée. L'ensemble d'anonymat rétrécit ; ce qui se brise réellement, c'est le lien vers une personne.

Étape 01 · Forme

Récursif, ou simple relais ? Un seul des deux justifie le serveur.

Deux machines complètement différentes se cachent derrière l'expression « mon propre serveur DNS », et presque tous les tutoriels construisent la mauvaise. Décidez-le avant d'installer quoi que ce soit, car c'est la différence entre un outil de confidentialité et un simple relais pour la politique de confidentialité de quelqu'un d'autre.

Un relais prend votre requête et la transmet à un autre résolveur — typiquement Cloudflare, Google, Quad9 ou votre FAI — puis met en cache ce qui revient. C'est simple, c'est rapide, et ça livre l'intégralité de votre flux de requêtes à un tiers unique. Tout guide qui se termine par « réglez maintenant votre upstream sur 1.1.1.1 » en a construit un.

Un résolveur récursif fait le travail lui-même. Pour trouver mail.example.com, il demande à un serveur racine qui gère .com, demande aux serveurs de .com qui gère example.com, puis demande aux propres serveurs de noms d'example.com l'enregistrement. Trois ou quatre courtes conversations avec trois ou quatre opérateurs différents, dont aucun n'apprend quoi que ce soit sur les autres. Avec la minimisation QNAME activée, il va plus loin : la racine n'est interrogée que sur .com, et les serveurs de .com uniquement sur example.com. Le nom complet n'est révélé qu'à une seule partie — celle qui héberge le nom, et qui allait de toute façon recevoir votre connexion trente millisecondes plus tard.

Propriété Unbound, récursif N'importe quel relais AdGuard Home seul
Une seule partie voit chaque requêteNonOuiOui — son upstream
DNSSEC validé localementOuiFait confiance à l'upstreamFait confiance à l'upstream
Listes de blocage et règles par appareilSeulement via des zones localesDépend du démonOui, avec une interface web
Écouteurs DoH / DoT pour les clientsDoT nativement, DoH via un proxyDépend du démonLes deux, intégrés
Latence de démarrage à froid3–4 allers-retours1 aller-retour1 aller-retour
Bonne réponseLa moitié confidentialité de la pileSeulement comme repli délibéréLa moitié filtrage, en amont

Les deux colonnes de droite ne sont pas des concurrentes — ce sont les deux moitiés d'une même construction. AdGuard Home possède le port 53, applique les listes de blocage et termine les transports chiffrés ; Unbound se trouve derrière, sur loopback, et fait la résolution. Aucune des deux moitiés ne fait bien le travail de l'autre, et la chaîne pèse environ une centaine de mégaoctets de RAM au total.

Si vous ne devez retenir qu'une seule chose de cette page, que ce soit celle-ci : un résolveur qui relaie vers un fournisseur DNS public n'a pas rendu votre DNS privé. Il a simplement déplacé le journal d'un saut, et ajouté un serveur à votre liste de maintenance. La récursion est tout l'enjeu.

Étape 02 · Fermer

Fermez le port 53 avant que quoi que ce soit ne l'ouvre. Ce n'est pas l'étape prudente. C'est l'étape nécessaire.

Commandez d'abord la machine. Dans le panneau : Commander → VPS → Sentinel, image Debian 12, dans le bastion le plus proche des appareils qui l'utiliseront — Helsinki, Stockholm, Oslo ou Reykjavík. Aucune adresse email n'est nécessaire pour ouvrir le compte, et la facture se règle en Monero, Bitcoin, Lightning ou tout autre actif pris en charge, ce qui compte ici plus que d'habitude : toute la valeur d'un résolveur personnel repose sur le fait que l'adresse IP qui pose la question ne soit pas traçable jusqu'à un nom.

Passez ensuite en revue la checklist de durcissement de la première heure — clés SSH uniquement, pas de connexion par mot de passe, mises à jour automatiques — parce que tout ce qui suit suppose une machine qui n'est pas déjà compromise.

À lire avant de démarrer le démon

Un résolveur récursif qui répond à tout internet s'appelle un résolveur ouvert, et il sera trouvé par des scanners parcourant tout internet en quelques heures après l'ouverture du port. Le DNS tourne sur UDP, les adresses source UDP sont triviales à falsifier, et une requête de 60 octets peut produire une réponse des dizaines de fois plus grosse — un résolveur ouvert est donc un amplificateur gratuit pour une attaque par déni de service contre un tiers. La séquence qui s'ensuit est toujours la même : le trafic démarre, les signalements d'abus arrivent, et l'IP finit en null-route. C'est la façon la plus courante dont finit un premier serveur DNS. Deux règles l'empêchent entièrement : refuser par défaut dans la configuration du résolveur, et ne jamais autoriser 53/udp depuis 0.0.0.0/0 dans le pare-feu.

Le pare-feu vient donc en premier, pendant que rien n'est encore à l'écoute. Les règles ci-dessous supposent un tunnel WireGuard sur 10.8.0.0/24 — si vous n'en avez pas construit un, le guide WireGuard lié en bas de cette page est un détour de quinze minutes, et c'est le transport avec lequel toute cette conception est la plus à l'aise.

ufw default deny incoming
ufw allow 22/tcp                      # or your moved SSH port
ufw allow 51820/udp                   # WireGuard
ufw allow in on wg0 to any port 53 proto udp
ufw allow in on wg0 to any port 53 proto tcp
ufw enable

# DNS is NOT opened to the world. Confirm it:
ufw status numbered | grep 53

Remarquez ce qui manque délibérément : il n'y a aucune règle qui ouvre le 53 sur l'interface publique. Le port 53 n'existe que sur wg0 et sur loopback. Si vous ajoutez plus tard du DNS-over-TLS ou du DNS-over-HTTPS, ce sont du TCP 853 et du TCP 443, ils sont authentifiés par un certificat, et ils reçoivent leurs propres règles à l'étape 05 — le port UDP en clair reste fermé quoi qu'il arrive.

Maintenant, dégagez le port. Sur Ubuntu — et sur tout Debian où quelqu'un l'a activé — systemd-resolved écoute déjà sur 127.0.0.53:53, et Unbound refusera de démarrer avec une erreur de bind que les gens passent vingt minutes à mal interpréter. Vérifiez d'abord, puis désactivez uniquement le stub listener, en gardant systemd-resolved comme interface locale côté client :

ss -lunp 'sport = :53'                # who owns UDP/53 right now?

mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/no-stub.conf <<'EOF'
[Resolve]
DNSStubListener=no
EOF
systemctl restart systemd-resolved
ss -lunp 'sport = :53'                # should now be empty

Sur un Debian 12 propre, la première commande n'affiche rien et il n'y a rien à faire. Lancez-la quand même — ça prend une seconde, et l'alternative est de diagnostiquer une erreur « address already in use » contre un service dont vous ignoriez l'existence.

Étape 03 · Résoudre

Unbound, depuis la racine. Un paquet, un fichier de configuration, aucun upstream.

Unbound est un résolveur récursif, à cache, qui valide, développé par NLnet Labs. Il est empaqueté partout, c'est ce qu'une grande partie d'internet fait déjà tourner, et par défaut il fait de la récursion — il faut s'en donner la peine pour le transformer en relais. Installez-le avec le paquet des root hints pour qu'il sache où sont les serveurs racine sans aller chercher de liste nulle part :

apt update && apt install -y unbound dns-root-data
unbound -V | head -2

Le paquet dns-root-data installe les root hints dans /usr/share/dns/root.hints et l'ancre de confiance racine DNSSEC dans /usr/share/dns/root.key, et garde les deux à jour via le canal normal des paquets. C'est la façon ennuyeuse mais correcte de les obtenir ; télécharger root.hints depuis une URL dans une tâche cron est la façon qui finit par échouer silencieusement.

/etc/unbound/unbound.conf.d/nb-resolver.conf

server:
    # ---- Who may ask. Deny first, allow narrowly.
    interface: 127.0.0.1@5335
    interface: 10.8.0.1
    access-control: 0.0.0.0/0 refuse
    access-control: ::0/0 refuse
    access-control: 127.0.0.0/8 allow
    access-control: 10.8.0.0/24 allow

    # ---- Privacy of the recursion itself.
    qname-minimisation: yes
    qname-minimisation-strict: no
    hide-identity: yes
    hide-version: yes
    rrset-roundrobin: yes

    # ---- DNSSEC. The anchor is maintained by the dns-root-data package.
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    root-hints: "/usr/share/dns/root.hints"
    harden-dnssec-stripped: yes
    harden-glue: yes
    harden-below-nxdomain: yes
    harden-large-queries: yes
    harden-short-bufsize: yes
    aggressive-nsec: yes
    val-clean-additional: yes

    # ---- Do not be a reflector, even by accident.
    refuse-any: yes
    ratelimit: 1000
    ip-ratelimit: 200
    edns-buffer-size: 1232

    # ---- Cache. This is where the 4 GB actually earns its keep.
    msg-cache-size: 128m
    rrset-cache-size: 256m
    cache-min-ttl: 60
    cache-max-ttl: 86400
    prefetch: yes
    prefetch-key: yes
    serve-expired: yes
    serve-expired-ttl: 3600

    # ---- Never chase a name that has no business being on the internet.
    private-address: 10.0.0.0/8
    private-address: 172.16.0.0/12
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: fd00::/8
    private-address: fe80::/10

    num-threads: 2
    so-reuseport: yes
    verbosity: 0
    logfile: ""

remote-control:
    control-enable: yes
    control-interface: /run/unbound.ctl

Quatre de ces lignes font le vrai travail et méritent chacune une phrase.

  • 01access-control: 0.0.0.0/0 refuse — la réponse par défaut à internet est « non ». Tout ce qui vient après est une exception que vous avez écrite exprès. Cette seule ligne suffit à arrêter le scénario d'amplification de l'étape 02 avant même que le pare-feu n'ait à intervenir.
  • 02qname-minimisation: yes — les serveurs racine ne sont interrogés que sur .com, pas sur le nom d'hôte complet. RFC 9156, activée par défaut dans les versions actuelles d'Unbound, et la raison pour laquelle un résolveur récursif fuit moins que ne le suggère le diagramme. Laissez le mode strict désactivé : un petit nombre de zones mal configurées cassent encore sous ce mode.
  • 03refuse-any: yes — les requêtes ANY renvoient la plus grosse réponse possible pour la plus petite question possible, ce qui est précisément ce que veut une attaque par amplification. Rien de légitime n'en a besoin.
  • 04serve-expired: yes — quand un serveur faisant autorité est injoignable, distribuer la réponse périmée et la rafraîchir en arrière-plan plutôt que d'échouer. C'est le réglage qui empêche une panne lointaine de ressembler, pour tout le monde dans la maison, à une panne d'internet.

Remarquez les deux écouteurs. Le loopback sur le port 5335 est ce qu'utilisera AdGuard Home à l'étape suivante ; 10.8.0.1 est l'adresse du tunnel, pour que les clients sur le VPN puissent interroger Unbound directement si vous décidez de sauter la couche de filtrage. Si vous ne faites pas encore tourner WireGuard, retirez cette seconde ligne d'interface pour l'instant — Unbound ne démarrera pas avec une adresse qui n'existe pas sur la machine.

Démarrez-le et prouvez qu'il fonctionne :

unbound-checkconf
systemctl restart unbound && systemctl enable unbound

apt install -y dnsutils
dig @127.0.0.1 -p 5335 nordbastion.com +short

# DNSSEC: the first must come back with the "ad" flag set,
# the second must FAIL — its signatures are deliberately broken.
dig @127.0.0.1 -p 5335 dnssec-tools.org +dnssec | grep -E 'flags:|status:'
dig @127.0.0.1 -p 5335 dnssec-failed.org  | grep 'status:'

Le drapeau ad sur la première réponse signifie qu'Unbound a vérifié la chaîne de signatures depuis la racine jusqu'à l'enregistrement, et qu'elle a tenu. Le SERVFAIL sur la seconde signifie que la validation a rejeté une réponse falsifiée plutôt que de vous la transmettre. Si la seconde renvoie une adresse à la place, la validation n'est pas activée, et l'ancre de confiance est la première chose à examiner.

Étape 04 · Filtrer

AdGuard Home en amont. Listes de blocage, règles par appareil, et les écouteurs chiffrés.

Cette étape est optionnelle au sens strict — Unbound seul est déjà un résolveur privé — et pourtant presque tout le monde la veut. AdGuard Home vous donne des listes de blocage, des politiques par client, un journal de requêtes lisible pendant que vous déboguez, et, chose la plus utile, des écouteurs DNS-over-TLS et DNS-over-HTTPS natifs pour que les téléphones et les navigateurs puissent parler à votre résolveur depuis des réseaux où un VPN n'est pas pratique.

L'agencement est une chaîne, et bien régler les ports est toute l'astuce : AdGuard Home possède le 53 et fait face aux clients, Unbound se trouve sur 127.0.0.1:5335 et fait face à internet. Rien d'autre sur la machine n'écoute sur le 53.

curl -fsSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# Web interface: http://<vps>:3000 — reach it over the SSH tunnel below,
# never by opening 3000 to the internet.
ssh -N -L 3000:127.0.0.1:3000 root@<vps>

Faites l'assistant de première exécution via ce tunnel. Réglez l'écouteur d'administration sur 127.0.0.1 ou sur l'adresse du tunnel, jamais sur 0.0.0.0, et donnez-lui un mot de passe long — cette interface peut réécrire chaque nom que votre réseau résout, ce qui la rend aussi sensible que le résolveur lui-même.

Puis réglez exactement un upstream : dans Paramètres → Paramètres DNS, videz la liste par défaut et entrez votre instance Unbound. Une ligne, rien d'autre. S'il reste un résolveur public dans cette case, tout ce qui a été fait à l'étape 01 est annulé.

127.0.0.1:5335

Laissez « Parallel requests » désactivé — avec un seul upstream, ça ne fait que dupliquer le trafic — et désactivez « Use private reverse DNS resolvers » à moins que vous ne fassiez tourner une véritable zone interne. Réglez les serveurs bootstrap sur quelque chose en qui vous avez confiance ; ils ne servent qu'à résoudre les noms d'hôte des serveurs upstream, et avec un upstream en IP brute, ils ne seront jamais consultés du tout.

Listes de blocage : commencez petit. L'instinct, c'est d'activer tout sur la page des listes et de profiter du compteur. Résistez-y. Chaque liste est un ensemble de choix de jugement faits par quelqu'un d'autre sur ce que vos appareils sont autorisés à atteindre, et les pannes sont discrètes et déroutantes — une page à moitié chargée, un bouton qui ne fait rien, une appli bancaire qui refuse de s'ouvrir. Commencez avec le filtre DNS par défaut d'AdGuard, ou avec un agrégat unique et bien maintenu comme OISD, vivez avec pendant quinze jours, et ajoutez-en seulement ensuite. Gardez une liste d'autorisation et utilisez-la sans culpabilité.

Le journal des requêtes est la partie gênante

Vous venez de construire une machine dont le but est d'empêcher quelqu'un d'autre de tenir la liste de chaque nom que résolvent vos appareils — et la première chose que fait AdGuard Home, c'est de tenir exactement cette liste, activée par défaut, pendant quatre-vingt-dix jours. C'est réellement utile pendant que vous réglez les listes de blocage, et c'est le fichier le plus sensible du serveur. Décidez délibérément : 24 heures suffisent pour répondre à « qu'est-ce que cet appareil vient de demander ? », zéro est le réglage honnête une fois le réglage terminé, et quatre-vingt-dix jours est une décision que personne ne devrait prendre en laissant un défaut tel quel. Paramètres → Général → Journal des requêtes, et réglez aussi la rétention des statistiques pendant que vous y êtes.

Pointez le pare-feu vers le nouvel agencement — AdGuard Home possède désormais le port 53 sur l'interface du tunnel, et Unbound n'est joignable que sur loopback. Rien ne change du côté de l'interface publique : elle n'a toujours aucun DNS dessus.

Étape 05 · Atteindre

Deux portes d'entrée. Le tunnel est la bonne ; le DNS chiffré est la portable.

Un résolveur que personne ne peut atteindre n'est pas utile, et un résolveur que tout le monde peut atteindre est le mode de défaillance de l'étape 02. Il y a exactement deux bonnes réponses, et la plupart des gens finissent par faire tourner les deux — le tunnel à la maison et sur l'ordinateur portable, le DNS chiffré sur le téléphone et sur les réseaux où l'UDP est filtré.

Option A — via WireGuard. La meilleure des deux, et la raison pour laquelle ce guide continue de pointer vers le guide WireGuard. Le port 53 reste invisible depuis internet, la requête elle-même ne traverse jamais un réseau non fiable sous quelque forme que ce soit, et il n'y a aucun certificat à renouveler. Si le VPS est déjà votre sortie VPN, c'est une seule ligne dans la configuration de chaque pair :

# On the client, in the [Interface] section of the peer config:
DNS = 10.8.0.1

Une subtilité qui piège les gens : sur Linux, wg-quick règle cette adresse via resolvconf ou systemd-resolved, et si aucun des deux n'est installé, il ne fait silencieusement rien pendant que le tunnel se monte parfaitement. Vérifiez avec resolvectl status ou en lisant /etc/resolv.conf une fois le tunnel monté — un tunnel qui fonctionne avec l'ancien résolveur encore configuré est exactement la fuite qui est au cœur de tout cet exercice.

Option B — DNS-over-TLS et DNS-over-HTTPS. Nécessaire quand l'appareil ne peut pas toujours être sur le tunnel. Les deux sont authentifiés par un certificat, ce qui suppose un nom d'hôte : pointez un enregistrement A vers le VPS, puis laissez AdGuard Home détenir le certificat directement, ou placez-le derrière un reverse proxy qui termine déjà le TLS pour vous. Les écouteurs sont 853/tcp pour le DoT et 443/tcp pour le DoH.

ufw allow 853/tcp                     # DNS-over-TLS
ufw allow 443/tcp                     # DNS-over-HTTPS
# 53/udp is still NOT open on the public interface. It never will be.
ufw status

Donnez au point de terminaison DoH un chemin qui ne soit pas devinable — AdGuard Home vous permet de le servir sous /dns-query/<random>, et un chemin différent par personne signifie que l'accès peut être révoqué une personne à la fois sans rien changer pour tous les autres. Ce n'est pas une authentification au sens fort, mais ça évite qu'un écouteur public ne soit rien de plus qu'un résolveur ouvert avec des étapes en plus.

Client Où se trouve le réglage Transport utilisé
Android 9 et versions ultérieuresParamètres → Réseau → DNS privé → nom d'hôteDNS-over-TLS uniquement
iOS et macOSUn profil DNS .mobileconfig signéDoH ou DoT, à l'échelle du système
Windows 11Paramètres → Réseau → Attribution du serveur DNSDoH, par adaptateur
FirefoxParamètres → Vie privée → DNS over HTTPS → PersonnaliséDoH, navigateur uniquement
Routeur (tout le réseau)WAN DNS, ou option DHCP 6DNS en clair — donc à faire passer par un tunnel

La ligne du routeur est celle à laquelle il faut réfléchir. Distribuer votre résolveur via DHCP couvre tous les appareils de la maison d'un coup, y compris ceux qui n'ont pas d'écran de réglages — mais le saut du routeur vers le VPS se fait alors en DNS en clair à travers internet ouvert, ce qui est exactement ce que vous cherchiez à arrêter. Faites tourner le tunnel sur le routeur lui-même, ou acceptez que le dernier kilomètre soit non chiffré et laissez la récursion être le gain.

Une dernière configuration qu'il vaut la peine de connaître : un navigateur qui a le DNS-over-HTTPS activé utilisera son propre résolveur et ignorera tranquillement le réglage système, tunnel ou pas. Firefox et Chrome livrent tous les deux cette option activée par défaut dans certaines régions. Soit vous pointez aussi le navigateur vers votre point de terminaison, soit vous désactivez son DoH pour qu'il suive le système d'exploitation.

Étape 06 · Vérifier

Quatre vérifications. Trois d'entre elles échouent à la première tentative de la plupart des gens.

1. Est-il ouvert sur internet ? Lancez ceci depuis une machine qui n'est pas sur le tunnel — un téléphone en data mobile, un autre VPS, n'importe quoi. Un timeout est la réponse correcte et souhaitable. Une vraie réponse signifie que tous les scanners d'internet le trouveront aussi, et vous devriez retourner à l'étape 02 immédiatement.

dig @<public-ip-of-vps> +timeout=3 example.com
# Expected: ";; connection timed out; no servers could be reached"

2. L'appareil l'utilise-t-il vraiment ? C'est la vérification qui échoue le plus souvent, et la panne est invisible : le tunnel est monté, le réglage a l'air correct, et le système d'exploitation continue d'interroger le résolveur que le café lui a distribué via DHCP. Demandez au résolveur lui-même qui il pense que vous êtes, puis confirmez depuis l'autre côté.

# On the client — which resolver is the system actually using?
resolvectl status | grep -A2 'Current DNS'        # Linux
scutil --dns | grep nameserver                    # macOS

# On the server — does the query actually arrive?
tail -f /var/log/syslog | grep -i unbound &
unbound-control stats_noreset | grep total.num.queries

Chargez ensuite l'une des pages publiques de test de fuite DNS depuis l'appareil et lisez le résultat. Si elle nomme votre prestataire VPS, le chemin est le bon. Si elle nomme votre FAI ou un grand résolveur public, quelque chose en amont du tunnel répond encore.

3. La validation est-elle vraiment activée ? Répétez les deux commandes dig de l'étape 03, mais cette fois à travers toute la chaîne — client, AdGuard Home, Unbound — plutôt que directement contre Unbound. Un nom à la signature cassée doit échouer ici aussi. Si AdGuard Home a été laissé avec un second upstream quelque part dans ses réglages, c'est ici que ça se voit.

4. Le cache fait-il son travail ? Après une journée d'usage normal, le taux de succès devrait se situer quelque part entre soixante-dix et quatre-vingt-dix pour cent. Beaucoup plus bas signifie généralement que le cache est trop petit, ou que cache-min-ttl est ignoré parce que tout ce qui est en amont a un TTL très court ; beaucoup plus haut sur un réseau chargé est un signe encourageant que prefetch fonctionne.

unbound-control stats_noreset | grep -E 'total.num.(queries|cachehits)'
# hit rate = cachehits / queries

Et puis les deux décisions opérationnelles. Premièrement : ce qui se passe quand cette machine redémarre. Chaque appareil qui pointe vers elle perd la résolution de noms, ce que tout le monde dans le foyer signalera comme un internet cassé. Réglez le service pour qu'il redémarre en cas d'échec et démarre au boot, puis redémarrez le VPS une fois exprès et regardez-le revenir. Deuxièmement : un repli. Soit vous listez un résolveur public comme secondaire sur vos clients et acceptez que ces requêtes échappent à votre contrôle pendant une panne, soit vous faites tourner une seconde instance sur un second VPS dans un autre bastion. Les deux se défendent. Découvrir la question à 23h00 un dimanche, non.

systemctl enable unbound AdGuardHome
systemctl show unbound -p Restart -p RestartUSec
reboot        # then, from a client: dig nordbastion.com +short
La partie honnête · Ce que ça ne fait pas

Ça ferme un canal. Quatre autres restent ouverts.

Un résolveur privé est une réelle amélioration, et ce n'est pas une cape d'invisibilité. Quiconque le vend comme telle vous vend quelque chose. Voici la liste de ce qui reste visible une fois tout ce qui précède fait, parce que connaître la forme de l'exposition restante fait toute la différence entre une défense et une couverture de sécurité illusoire.

La connexion, elle, a toujours lieu. Une milliseconde après le lookup, votre appareil ouvre une connexion TCP vers l'adresse qu'il vient d'apprendre. Quiconque surveille votre ligne voit cette adresse. Pour un site sur sa propre IP, l'adresse, c'est le site. Le DNS chiffré supprime la question ; il ne supprime pas la réponse.

La poignée de main TLS nomme généralement le site. Le Server Name Indication est envoyé en clair au début de presque chaque connexion HTTPS, donc un observateur passif lit le nom d'hôte de toute façon. L'Encrypted Client Hello corrige cela et est déployé de façon inégale — là où le navigateur et le site le prennent en charge tous les deux, le nom est caché, et là où ce n'est pas le cas, il ne l'est pas. Ne présumez pas qu'il est activé.

L'opérateur du résolveur, c'est désormais vous, et vous n'êtes qu'une seule personne. Chaque serveur faisant autorité auquel parle votre résolveur voit une unique adresse IP l'interroger sur sa zone. À travers de nombreuses zones, cette IP a un motif distinctif, et ce motif, c'est un foyer. C'est le coût en ensemble d'anonymat évoqué dans le premier chapitre, et la seule chose qui l'atténue, c'est que l'IP ne soit pas traçable jusqu'à un nom — un VPS sans KYC payé en crypto — et, idéalement, que ce soit la même IP dont sort déjà votre trafic.

Le prestataire peut voir les paquets, comme toujours. Le VPS tourne sur le matériel de quelqu'un, dans le datacentre de quelqu'un. NordBastion n'inspecte pas le trafic des clients, et le rapport de transparence ainsi que le warrant canary décrivent ce qui se passerait si on le demandait — mais l'énoncé architectural honnête, c'est qu'une machine que vous louez est une machine que quelqu'un d'autre peut atteindre physiquement. Ce que change l'auto-hébergement, c'est qu'il n'y a aucun journal de requêtes au niveau du produit, aucun pipeline d'analytique et aucune politique de confidentialité qui puisse être modifiée ; il n'y a qu'un processus qui tient un cache en RAM, configuré par vous, dans une juridiction que vous avez choisie exprès.

Ce que vous avez réellement acheté, précisément : la source de données comportementales sur vous la plus riche et la moins chère qui soit n'est plus collectée par une partie dont le modèle économique consiste à la collecter. C'est une affirmation étroite, et c'est une affirmation réelle. Rien sur cette page ne remplace Tor quand le modèle de menace exige Tor — et pour cela, le guide sur les services onion ci-dessous est la lecture suivante honnête.

Dimensionnement · Que commander

Le DNS, c'est petit. Commandez pour tout ce qui vit aussi sur la machine.

Niveau Mensuel Ressources Ce qu'elle fait tourner confortablement
Sentinel$3.902 vCPU · 4 GB · 120 GBRésolveur + WireGuard pour un foyer. La bonne réponse.
Garrison$7.904 vCPU · 8 GB · 240 GBIdem, plus un Vaultwarden, un SearXNG et une cible de sauvegarde
Ravelin$16.908 vCPU · 16 GB · 480 GBUne petite équipe, vingt-cinq pairs de tunnel, d'autres services à côté
Un second Sentinel$3.90Dans un autre bastionLe résolveur de repli, pour qu'une panne ne soit pas une panne d'internet

Rien dans ce tableau n'est choisi pour le DNS. Un résolveur pour trente appareils utilise quelques centaines de mégaoctets de cache et une fraction d'un seul cœur, et déplace quelques centaines de mégaoctets de trafic par mois. Choisissez le tier pour les pairs WireGuard, les autres services et le disque — puis laissez le résolveur suivre gratuitement.

Notes de terrain · Six pièges

Six façons que ça tourne mal. Cinq d'entre elles sont silencieuses.

Piège 01 · Bruyant

Le résolveur ouvert, et le null route une semaine plus tard

Une règle de pare-feu de trop, ou une ligne access-control laissée à allow. Les scanners trouvent le port en quelques heures, le trafic d'amplification démarre, le signalement d'abus arrive, l'IP s'éteint. Refusez par défaut, n'autorisez que le tunnel, et testez depuis l'extérieur du réseau.

Piège 02 · Inutile

Un résolveur privé qui relaie vers un résolveur public

AdGuard Home installé, upstream laissé sur la liste par défaut, tout fonctionne à merveille — et le journal des requêtes continue de s'accumuler chez une entreprise dont le nom figure dans la case des réglages. Réglez un seul upstream, et faites que ce soit votre Unbound.

Piège 03 · Invisible

Le tunnel est monté et l'appareil ne vous a jamais rien demandé

wg-quick n'a pas pu pousser le réglage DNS parce que resolvconf n'est pas installé, ou un navigateur fait son propre DNS-over-HTTPS. Tout a l'air correct, et chaque lookup part encore vers le réseau sur lequel vous êtes assis. Vérifiez depuis le côté du résolveur, pas depuis l'écran de réglages du client.

Piège 04 · Déroutant

La liste de blocage a cassé l'appli bancaire, trois semaines plus tard

Rien ne s'annonce comme une panne DNS — une page se charge à moitié, un bouton ne fait rien. Six listes agressives activées dès le premier jour rendent ça introuvable. Commencez avec une seule, ajoutez lentement, gardez une liste d'autorisation, et gardez assez de journal de requêtes pour répondre à la question.

Piège 05 · Ironique

Quatre-vingt-dix jours de journal de requêtes, conservés par défaut

Toute cette construction existe pour empêcher quelqu'un de tenir cette liste, et la couche de filtrage la garde dès l'installation, sur disque, pendant trois mois. Réglez la rétention exprès — 24 heures pendant le réglage, zéro ensuite — et rappelez-vous que ça couvre tout le monde sur le réseau, pas seulement vous.

Piège 06 · Soudain

Un redémarrage, et la maison n'a plus internet

Un résolveur devient une infrastructure dès l'instant où d'autres personnes en dépendent. Activez les deux services au démarrage, réglez Restart=on-failure, redémarrez une fois exprès pour le prouver, et décidez du repli avant d'en avoir besoin plutôt que pendant.

FAQ · DNS privé

Questions, réponses.

Onze questions qui se posent en construisant cela — dont les deux qui déterminent si ça vaut même la peine d'être construit.

Faire tourner mon propre résolveur est-il vraiment plus privé que d'utiliser Quad9 ou Cloudflare ?

C'est différent, et c'est mieux là où ça compte le plus — mais la réponse honnête a deux volets. Ce que vous gagnez : avec un résolveur récursif, aucune partie ne voit jamais l'intégralité de votre flux de requêtes. Les serveurs racine apprennent que quelqu'un a demandé .com, les serveurs de .com apprennent que quelqu'un a demandé example.com, et seul l'opérateur d'example.com apprend le nom complet — et aucun d'eux ne voit les mille noms suivants que vous consultez. Un résolveur public, à l'inverse, voit chacun d'entre eux, dans l'ordre, horodaté, pour toujours, et sa politique de confidentialité est la seule chose qui se dresse entre cette liste et quelqu'un d'autre. Ce que vous perdez : un résolveur personnel a un ensemble d'anonymat réduit à une seule personne. Les requêtes qui sortent d'un grand résolveur public se mélangent à celles de millions d'autres personnes ; celles qui sortent du vôtre sont sans ambiguïté les vôtres. Cet échange vaut la peine d'être fait quand l'IP du résolveur n'est pas liée à votre identité — ce qu'offre précisément un VPS sans KYC payé en crypto, et ce qu'un hyperscaler avec votre carte enregistrée n'offre justement pas. Placez le résolveur derrière le même VPS d'où sort déjà votre VPN, et l'ensemble d'anonymat ne rétrécit pas du tout, puisque cette IP gérait déjà votre navigation.

L'auto-hébergement du DNS va-t-il accélérer ma navigation ?

Légèrement plus lent au premier lookup d'un nom, nettement plus rapide à chaque répétition, et globalement à peu près neutre. Un résolveur récursif qui démarre à froid doit parcourir la chaîne de délégation — racine, TLD, autorité — soit trois ou quatre allers-retours au lieu de l'unique aller-retour vers un résolveur public qui avait déjà la réponse en cache grâce à la requête de quelqu'un d'autre. Une fois votre cache chaud, ce qui prend environ une journée pour un foyer, les noms courants sont servis depuis la RAM en bien moins d'une milliseconde, et vous êtes gagnant. Activez prefetch pour que les enregistrements populaires soient rafraîchis avant d'expirer, et le cas du démarrage à froid disparaît presque entièrement. Le seul endroit où vous pouvez réellement perdre en performance est la géolocalisation CDN : les grands résolveurs publics transmettent une version tronquée de votre localisation réseau au serveur faisant autorité (EDNS Client Subnet) pour que le CDN choisisse un point de présence proche. Unbound ne l'envoie pas, par conception. Si votre résolveur se trouve dans la même région que vous, cela ne change rien de mesurable. Si le résolveur est à Reykjavík et que vous êtes à Singapour, certains CDN vous donneront un point de présence européen, et vous le sentirez.

Ai-je besoin d'un nom de domaine pour cela ?

Seulement pour le transport chiffré. Le DNS en clair via un tunnel WireGuard n'a besoin d'aucun domaine, d'aucun certificat et d'aucune exposition publique — le résolveur écoute sur une adresse privée comme 10.8.0.1 et ne répond qu'aux pairs présents sur le tunnel. Cette configuration est à la fois la plus simple et la plus privée de ce guide. Vous avez besoin d'un domaine dès l'instant où vous voulez du DNS-over-TLS ou du DNS-over-HTTPS, car les deux sont authentifiés par un certificat, et un certificat est émis pour un nom. C'est la configuration à choisir quand les appareils ne peuvent pas toujours être sur le VPN — un ordinateur portable professionnel, un téléphone sur un réseau qui bloque l'UDP, un membre de la famille qui ne maintiendra pas de tunnel. Si vous en enregistrez un, faites-le quelque part qui n'exige pas la même identité dont vous avez pris soin ailleurs, et gardez la confidentialité WHOIS activée.

Unbound ou AdGuard Home — ai-je besoin des deux ?

Ils résolvent des problèmes différents, et l'association n'est pas redondante. Unbound est le résolveur : il parcourt le DNS depuis la racine, valide les signatures DNSSEC et met les résultats en cache. AdGuard Home n'est pas du tout un résolveur — c'est une façade de filtrage avec une interface web et des écouteurs chiffrés, qui relaie vers un upstream tout ce qu'elle ne bloque pas. Faites tourner AdGuard Home seul et son upstream est un résolveur public, ce qui remet tout votre flux de requêtes dans le journal de quelqu'un d'autre. Faites tourner Unbound seul et vous obtenez un résolveur réellement privé, sans listes de blocage, sans règles par appareil et sans interface. Enchaînés — AdGuard sur le 53, Unbound sur 127.0.0.1:5335 comme seul upstream — vous obtenez le filtrage et le transport chiffré devant un résolveur qui répond depuis la racine. Si vous voulez la plus petite surface d'attaque possible et que le blocage de publicités ne vous importe pas, Unbound seul est une réponse tout à fait respectable, et c'est la moitié de la pile qui apporte réellement la confidentialité.

Qu'est-ce qu'un résolveur ouvert, et pourquoi est-ce si grave ?

Un résolveur ouvert est un résolveur récursif qui répond aux requêtes venant de n'importe quelle adresse source sur internet. C'est grave parce que le DNS tourne sur UDP, que les adresses source UDP se falsifient trivialement, et qu'une petite requête peut produire une grosse réponse. Un attaquant envoie à votre serveur une requête de 60 octets avec l'adresse d'une victime falsifiée comme source ; votre serveur envoie consciencieusement à la victime une réponse des dizaines de fois plus grosse. Multipliez par des milliers de résolveurs ouverts et c'est un DDoS par réflexion et amplification, et votre serveur est l'un des canons. En pratique, la séquence est rapide et prévisible : des scanners qui parcourent tout internet trouvent un port 53 nouvellement ouvert en quelques heures, le trafic démarre, les plaintes pour abus arrivent, et le prestataire applique un null-route à l'IP pour protéger son réseau. Ce n'est pas une hypothèse et ce n'est pas rare — c'est la façon la plus courante dont un premier serveur DNS finit mal. Le correctif coûte une règle de pare-feu et une ligne de configuration : refuser par défaut, n'autoriser que votre tunnel.

Le DNS chiffré cache-t-il à mon FAI les sites que je visite ?

Il cache le lookup, pas la visite. Le DNS-over-TLS et le DNS-over-HTTPS signifient que votre FAI ne voit plus une question en clair du genre example.com. Ce qu'il voit encore, c'est la connexion que vous établissez une milliseconde plus tard : l'adresse IP de destination, et — sauf si les deux extrémités prennent en charge l'Encrypted Client Hello — le nom du serveur dans la poignée de main TLS, en clair. Pour un site sur une IP dédiée, l'adresse seule l'identifie ; pour un site derrière un grand CDN, l'adresse est partagée et le SNI est ce qui trahit. Le DNS chiffré augmente donc le coût de la journalisation passive et supprime la surface de surveillance la plus facile et la moins chère qui soit, mais il ne rend pas votre navigation invisible. Si le modèle de menace, c'est votre FAI ou un réseau hostile qui voit tout, l'outil pour ça, c'est le tunnel — le DNS chiffré referme la fuite qu'un VPN seul peut encore avoir, quand le système d'exploitation continue d'utiliser le résolveur du FAI en dehors du tunnel.

Quelle taille de VPS faut-il ?

Beaucoup plus petit que ce que l'on imagine. Les réponses DNS font quelques centaines d'octets et le travail par requête consiste en une recherche de hachage, si bien que le résolveur d'un foyer ou d'une petite équipe est inactif presque tout le temps. Un Sentinel — 2 vCPU, 4 GB, $3.90 par mois — servira des dizaines d'appareils sans que la charge moyenne ne quitte jamais zéro, et l'essentiel de ces 4 GB peut être consacré au cache, qui est la seule ressource qui améliore réellement l'expérience. Donnez à Unbound quelques centaines de mégaoctets de cache de messages et de RRset, et votre taux de succès se situera entre quatre-vingts et quatre-vingt-dix pour cent. La raison de voir plus grand n'est jamais le DNS : c'est que la même machine termine aussi votre tunnel WireGuard, ou fait tourner un Vaultwarden, ou héberge un dépôt de sauvegarde. La bande passante n'est pas un problème — un résolveur de foyer très actif ne déplace que quelques centaines de mégaoctets par mois.

Que se passe-t-il quand le VPS redémarre ou que le résolveur plante ?

Chaque appareil configuré pour l'utiliser cesse de résoudre les noms, ce que les gens qui les utilisent décriront comme « internet est en panne ». C'est le vrai coût opérationnel de l'auto-hébergement du DNS, et il mérite une décision plutôt qu'une découverte. Trois défenses, par ordre croissant d'effort. Configurez un résolveur secondaire sur vos clients — un résolveur public comme Quad9 ou dns0.eu — et acceptez que pendant une panne ces requêtes échappent à votre contrôle ; c'est ce que la plupart des gens devraient faire. Ou faites tourner une seconde instance sur un second VPS dans un autre bastion et listez les deux, ce qui garde tout en interne au prix d'une seconde machine à $3.90. Ou, sur le tunnel, faites tourner un minuscule cache local sur chaque client pour qu'une courte panne soit invisible. Quel que soit votre choix, réglez Restart=on-failure sur l'unité, activez-la au démarrage, et testez le redémarrage une fois exprès — un résolveur qui ne revient pas tout seul choisira toujours le pire moment pour le prouver.

Les listes de blocage vont-elles casser des choses ?

Oui, occasionnellement, et la façon dont vous gérez ça fait toute la différence entre une installation qui dure et une qu'on arrache au bout de quinze jours. Les listes de blocage sont maintenues par des gens qui font des choix de jugement, et de temps en temps un choix bloque quelque chose dont vous avez besoin : le point de terminaison anti-fraude d'une banque, un widget de suivi de livraison, un parcours de connexion qui redirige via un domaine d'analytique. La panne est déroutante parce qu'elle ne ressemble pas à du DNS — la page se charge à moitié, ou un bouton ne fait rien. Trois habitudes y remédient. Commencez par une seule liste prudente plutôt que six agressives. Gardez une liste d'autorisation et ajoutez-y sans culpabilité. Et gardez le journal des requêtes actif assez longtemps pour répondre à « qu'est-ce que cet appareil vient de demander, et qu'avons-nous refusé ? » — c'est le moment où vous découvrez qu'un résolveur filtrant est lui-même un appareil qui journalise tout, et que son paramètre de rétention est une décision de confidentialité que vous prenez pour tout le monde sur le réseau.

Puis-je partager le résolveur avec ma famille ou des amis ?

Oui, et c'est même l'une des meilleures raisons de le construire — une seule machine à $3.90 peut assainir le DNS pour tout un foyer ou une poignée d'amis. Deux règles rendent ça sûr. D'abord, partagez-le via le tunnel ou via un point de terminaison chiffré et authentifié, jamais en ouvrant le port 53 au monde entier ; avec le DNS-over-HTTPS, vous pouvez donner à chaque personne un chemin distinct pour que l'accès puisse être révoqué individuellement, et AdGuard Home peut ensuite appliquer un filtrage différent par client. Ensuite, soyez clair avec vous-même sur ce que vous assumez : vous détenez désormais le journal des requêtes de tous ceux qui l'utilisent. Réglez la rétention à zéro ou à un jour, dites-leur quel est ce paramètre, et rappelez-vous que si c'est votre propre confidentialité que vous protégez, un résolveur utilisé par cinq personnes est aussi un résolveur où n'importe quelle requête est plus difficile à attribuer à l'une d'entre elles en particulier.

NordBastion voit-il un inconvénient à ce que je fasse tourner un résolveur DNS sur un VPS ?

Pas du tout — un résolveur privé, à accès contrôlé, est une charge de travail normale et la politique d'usage acceptable n'a rien à en dire. Ce qui préoccupe la politique, et ce qui préoccupe tout réseau sérieux, c'est un résolveur ouvert utilisé comme réflecteur d'amplification contre un tiers, parce que le trafic d'attaque quitte notre réseau pour atterrir sur celui de quelqu'un d'autre. Suivez l'étape 02 et cela n'arrive jamais : refuser par défaut, autoriser le tunnel, limiter le débit du reste. Si vous voulez faire tourner délibérément un résolveur public comme service pour d'autres, c'est une conversation qui vaut la peine d'être eue à l'avance plutôt qu'après le premier signalement d'abus — les exigences techniques (limitation du débit de réponse, pas de ANY, supervision) sont bien connues, et le problème, c'est d'en faire tourner un par accident, pas d'en faire tourner un exprès.

Obtenir la machine

Un résolveur bien à vous, sur une IP qui n'est pas votre nom. Sans KYC, payé en crypto.

Sentinel — 2 vCPU et 4 GB pour $3.90 par mois, à Helsinki, Stockholm, Oslo ou Reykjavík. Suffisant pour le résolveur, le tunnel WireGuard derrière lequel il devrait vivre, et tout ce que vous déciderez d'arrêter de louer ailleurs. Aucun email à l'inscription, aucun document d'identité, et aucun journal au niveau du produit de quoi que ce soit que vous consultiez.

Dernière révision · 2026-10-12 · Références · Documentation d'Unbound et d'AdGuard Home, RFC 9156 (minimisation QNAME), RFC 7858 (DNS-over-TLS), RFC 8484 (DNS-over-HTTPS), systemd-resolved(8) · Fréquence · annuellement

Hébergement privé, conçu dans le Nord.