Tutoriel Linux : Installer un serveur DNS récursif sur son VPS avec Unbound

Le DNS (Domain Name System) est un service fondamental sur Internet, puisque c’est lui qui permet à notre ordinateur de joindre une machine dont on ne connait que le nom.

Dans une configuration typique, si l’on ne touche à aucun paramétrage particulier, le fait de taper par exemple https://cnn.com dans la barre d’URL du navigateur de notre laptop va entraîner la séquence suivante :

– Le laptop va faire une requête DNS (protocole UDP, port 53) à la Livebox (« Quelle est l’adresse IP de la machine cnn.com ? »)

– La Livebox (adresse IP 192.168.1.1 généralement) va répercuter cette demande à l’infrastructure du FAI (exemple d’Orange dans la figure ci-dessus)

– Soit l’infrastructure du FAI a déjà la réponse, parce qu’elle a déjà questionné les serveurs racines du DNS sur Internet, auquel cas elle répond. Soit elle n’a pas la réponse et elle questionne récursivement les serveurs DNS racine sur Internet, qui eux vont fournir la réponse

– La réponse (l’adresse IP de la machine cnn.com) fait le trajet en sens inverse jusqu’au laptop

– Le laptop ouvre une connexion avec la machine en utilisant l’adresse IP qu’elle a reçue en réponse.

Les serveurs racine du DNS sur Internet sont des serveurs qui sont les points d’entrée d’un système hiérarchique, c’est pourquoi on parle de récursivité. Concrètement, si l’on souhaite l’adresse IP de la machine toto.cnn.com, le serveur racine du domaine .com sera consulté en premier, puis le serveur du domaine cnn.com.

Bref, on utilise ainsi le DNS en permanence sans même s’en douter.

Cependant cette configuration pose problème. En effet, le FAI est régulièrement sommé par les autorités d’effacer certaines machines du DNS. Techniquement c’est facile à faire : si les autorités demandent d’effacer la machine cnn.com (exemple fictif), alors le FAI paramètre son architecture DNS pour renvoyer comme réponse 127.0.0.1 en IPv4, ::1 en IPv6, au lieu de la vraie adresse IP, quand une requête DNS demandant l’adresse IP de cette machine est reçue.

127.0.0.1 et ::1 sont des adresses IP locales, qui ne permettront pas au laptop demandeur d’en faire quoi que ce soit. La machine cnn.com est ainsi invisibilisée (mais elle est toujours là) d’Internet.

Bien que les autorités se sentent fondées à s’autoriser à invisibiliser des sites web, beaucoup de citoyens ne leur reconnaissent pas ce droit, et du coup changent de fournisseur de DNS, ce qui est tout à fait légal. On peut encore choisir le fournisseur de DNS que l’on souhaite.

En changeant le paramétrage DNS du laptop, on peut donc facilement shunter le resolveur DNS du FAI et en choisir un alternatif, chez Quad9, Google ou autres. Le laptop ne questionnera plus la Livebox (192.168.1.1) pour résoudre les noms de domaines mais enverra ses requêtes aux serveurs alternatifs (sur 1.1.1.1 ou 8.8.8.8 ou 9.9.9.9, etc. selon le paramétrage choisi).

Le problème de cette nouvelle approche, c’est que ces fournisseurs de DNS alternatifs reçoivent aussi les injonctions des autorités pour invisibiliser des adresses IP de machines et donc des sites web. Il semble qu’ils obéissent un peu moins que les FAI, mais ce n’est pas non plus la panacée.

Il n’y a en réalité que deux méthodes garanties à 100% pour n’être exposé à aucun filtrage de DNS.

La première consiste à renseigner les adresses IP dans le fichier /etc/hosts du laptop. Cette méthode rencontre vite une limite de volumétrie, et ne marche que si les machines concernées ont une adresse IP fixe.

La deuxième, qui est ce que nous allons faire, consiste à disposer de son propre resolveur DNS, c’est-à-dire son propre équivalent de Quad9.

Pour cela on utilise un programme appelé unbound.

Les puristes répondront qu’il existe une troisième méthode qui consiste à passer par un VPN commercial. En effet, généralement les requêtes DNS passent dans ce tunnel VPN une fois qu’il est activé et ce sont les serveurs DNS du fournisseur de VPN qui donne les réponses aux requêtes DNS. Cette méthode ne fait que décaler le problème un peu plus loin, mais le problème qu’on n’a pas un accès direct aux serveurs racine du DNS sur Internet perdure.

Revenons donc à notre serveur DNS perso qui utilise unbound.

Unbound peut être installé directement sur le laptop et c’est réglé. Sauf qu’il faut le faire sur chaque machine, c’est rasant.

Nous allons donc plutôt monter unbound sur notre VPS. L’avantage de cette approche est que plusieurs laptops pourront utiliser ce service de DNS direct privé. L’inconvénient est que, si l’on ne fait pas attention, on crée au passage un serveur DNS public (du même type que Quad9), utilisable par n’importe qui. Or on souhaite un serveur DNS privé.

Pour le rendre privé, il y a deux méthodes.

La première consiste à lui demander de ne répondre qu’aux machines situées dans une plage d’adresses IP précise (ou à une adresse IP précise). Cette méthode est difficilement utilisable dès lors que le laptop a une adresse IP variable sur Internet, ce qui est le cas avec une Livebox ou via une connexion 5G.

La deuxième consiste à cacher le serveur DNS privé sur le VPS derrière une connexion VPN wireguard qui existe déjà. Ainsi seuls les laptops connectés au réseau wireguard peuvent accéder au service de DNS privé. C’est cette méthode que nous allons utiliser ici, en considérant que la connexion wireguard existe déjà. Le lecteur qui ne saurait pas la mettre en place peut apprendre à le faire ici.

Etape 1 : Installation et configuration d’unbound sur le VPS

sudo apt update
sudo apt install unbound

Créer ou remplacer le contenu du fichier /etc/unbound/unbound.conf :

server: 
# Ecoute sur l'IP wireguard du VPS, pas sur localhost, ni sur l'IP publique du VPS 
interface: 10.8.0.1
# Port DNS standard 
port: 53
# Refuser tout accès par défaut 
access-control: 0.0.0.0/0 refuse 
access-control: ::0/0 refuse 
# Autoriser uniquement les requêtes via le réseau wireguard 
access-control: 10.8.0.0/24 allow 
# Sécurité et cache 
hide-identity: yes 
hide-version: yes 
auto-trust-anchor-file: "/var/lib/unbound/root.key" 
val-permissive-mode: no 
# Cache pour de meilleures performances 
cache-min-ttl: 3600 
cache-max-ttl: 86400 
msg-cache-size: 100m 
rrset-cache-size: 200m 
# Log minimal 
verbosity: 1

Nous allons maintenant vérifier et démarrer unbound :

Vérifier la configuration :

sudo unbound-checkconf

Démarrer unbound :

sudo systemctl enable unbound
sudo systemctl restart unbound

Vérifions qu’il écoute bien sur 10.8.0.1:53 (adresse wireguard du VPS) :

sudo ss -tuln | grep :53

On doit voir une ligne contenant 10.8.0.1:53

Etape 2 : Empêcher le VPS d’utiliser son propre unbound

L’idée est de faire en sorte que le VPS propose à ses clients (laptops distants) un service de résolution de noms DNS non censuré (puiqu’interrogeant directement les serveurs DNS racines sur Internet), sans que le VPS lui-même n’utilise ce service (aucun intérêt).

Le fichier /etc/systemd/resolved.conf doit contenir :

[Resolve]
DNS=8.8.8.8 1.1.1.1

Puis on tape la commande :

sudo systemctl restart systemd-resolved

Il reste à vérifier que le VPS n’utilise pas unbound :

dig google.com | grep "SERVER:"

Le résultat doit montrer un serveur comme 8.8.8.8 ou l’IP du DNS du FAI, mais pas 10.8.0.1

Etape 3 : Vérifier la configuration de wireguard sur le VPS

Le fichier /etc/wireguard/wg0.conf doit contenir :

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <La clé privée du serveur>

Puis on tape la commande :

sudo systemctl restart wg-quick@wg0

Etape 4 : Vérifier la configuration de wireguard sur chaque client

Le fichier /etc/wireguard/wg0.conf de chaque laptop client doit contenir :

[Interface]
PrivateKey = <La clé privée du client>
Address = 10.8.0.2/32 # Choisir une adresse IP unique par client
DNS = 10.8.0.1 # Le VPS sera le serveur DNS uniquement quand wireguard sera actif
[Peer]
PublicKey = <La clé publique du serveur>
AllowedIPs = 10.8.0.0/24 # Seuls le surf vers le réseau VPN passe par le VPN wireguard
End‐Point = <IP publique du VPS>:51820
PersistentKeepalive = 25

La configuration serveur et clients est terminée.

Pour bénéficier du service de DNS non censuré qu’offre le VPS depuis un laptop, il suffit de démarrer wireguard sur le laptop :

sudo wg-quick up wg0

A ce moment-là, le laptop utilise comme DNS le serveur VPS, mais surfe sur les sites internet sans passerpar le VPS. On a recréé ainsi un service équivalent à Quad9 mais avec la garantie qu’aucun site ne sera censuré.

On peut vérifier que le DNS utilisé par le laptop est bien 10.8.0.1 par la commande :

resolvectl status wg0

De même, on peut vérifier que le trafic internet du laptop ne passe pas par le VPS via le tunnel VPN, mais se fait en direct. Ainsi la commande suivante doit ramener l’adresse IP publique du laptop, pas celle du VPS :

curl ifconfig.me

Pour arrêter wireguard lorsqu’on ne veut plus utiliser ce service de DNS non censuré :

sudo wg-quick down wg0

Le laptop reprend alors automatiquement son serveur DNS habituel.

La méthode de configuration du client laptop présentée ci-dessus fonctionne également sur un smartphone Android.

Avec ce service de DNS non censuré hébergé sur votre VPS, accessible uniquement par vous via le tunnel wireguard, vous bénéficiez d’un surf de luxe, garanti sans censure, et légal.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *