Ce didacticiel vous montrera comment configurer votre propre DNS sur TLS (DoT) sur Ubuntu avec Nginx, afin que vos requêtes DNS puissent être cryptées et protégées des regards indiscrets.
Qu'est-ce que le DNS sur TLS et pourquoi est-ce important ?
DNS (Domain Name System) est responsable de la traduction des noms de domaine en adresses IP. Il a été conçu en 1987 sans souci de sécurité ni de confidentialité. Par défaut, les requêtes DNS ne sont pas chiffrées. Ils sont envoyés en clair sur le fil et peuvent être exploités par des entités intermédiaires. Par exemple, le Grand Firewall de Chine (GFW ) utilise une technique appelée poison de cache DNS pour censurer l'Internet chinois. (Ils utilisent également d'autres méthodes, qui sortent du cadre de cet article.)
GFW vérifie chaque requête DNS envoyée à un serveur DNS en dehors de la Chine. Étant donné que le protocole DNS en texte brut est basé sur UDP, qui est un protocole sans connexion, GFW peut usurper à la fois l'IP du client et l'IP du serveur. Lorsque GFW trouve un nom de domaine sur sa liste de blocage, il modifie la réponse DNS. Par exemple, si un internaute chinois souhaite visiter google.com, GFW renvoie une adresse IP située en Chine au lieu de l'adresse IP réelle de Google, au résolveur DNS de l'utilisateur. Ensuite, le résolveur DNS renvoie la fausse adresse IP à l'ordinateur de l'utilisateur, de sorte que l'utilisateur ne peut pas visiter google.com.
DNS sur TLS signifie que les requêtes DNS sont envoyées via une connexion sécurisée cryptée avec TLS, la même technologie qui crypte le trafic HTTP.
Pourquoi exécuter votre propre résolveur DoT ?
Il existe déjà des résolveurs DNS publics tels que 1.1.1.1 et 9.9.9.9 qui prennent en charge DNS sur TLS, vous pouvez donc les utiliser si vous n'avez pas les compétences ou le temps pour exécuter le vôtre. Cependant, certaines personnes affirment que cela permet toujours aux grands fournisseurs de services DNS de collecter des informations sur les utilisateurs. Ils semblent avoir plus confiance en leur FAI. Mais je pense que si vous êtes paranoïaque à propos de la confidentialité, vous devriez utiliser votre propre résolveur DoT, afin que ni les grands fournisseurs de services DNS ni votre FAI ne puissent vous espionner.
Actuellement, tous les résolveurs DNS (BIND, Unbound, Knot resolver, PowerDNS recursor, etc.) ne prennent pas en charge DNS sur TLS. Au lieu de faire un guide pour un résolveur spécifique, je vais vous montrer comment configurer le proxy Nginx TLS pour votre résolveur DNS existant afin de fournir le service DoT, donc quel que soit le résolveur DNS que vous utilisez, vous pouvez suivre ce tutoriel.
Prérequis
Il est supposé que vous avez un résolveur DNS en cours d'exécution sur votre serveur Ubuntu. Vous pouvez utiliser n'importe quel résolveur DNS (BIND, Unbound, Knot resolver…) J'utilise personnellement BIND.
- Configurez votre propre résolveur DNS BIND9 sur Ubuntu 16.04/18.04
- Configurez votre propre résolveur DNS BIND9 sur Ubuntu 20.04
Vous avez également besoin d'un nom de domaine, car les clients DNS devront établir une connexion TLS sécurisée avec notre résolveur DNS. J'ai enregistré mon nom de domaine auprès de NameCheap parce que le prix est bas et qu'ils offrent une protection de la confidentialité whois gratuite à vie.
Une fois que vous remplissez les conditions ci-dessus, suivez les instructions ci-dessous.
Étape 1 :Installez Nginx sur le serveur Ubuntu
C'est très facile à faire. Exécutez simplement la commande suivante.
sudo apt install nginx
Étape 2 :Obtenir un certificat TLS de confiance auprès de Let's Encrypt
Le DNS sur TLS nécessite l'installation d'un certificat TLS côté serveur. Nous obtiendrons et installerons le certificat Let’s Encrypt. L'avantage d'utiliser le certificat Let's Encrypt est qu'il est gratuit, plus facile à configurer et approuvé par le logiciel client.
Exécutez les commandes suivantes pour installer le client Let's Encrypt (certbot) à partir du référentiel Ubuntu par défaut.
sudo apt install certbot
Pour obtenir un certificat Let's Encrypt TLS, nous pouvons créer un hôte virtuel Nginx avec la commande suivante. Remplacer dot.example.com
avec votre propre nom de domaine. N'oubliez pas de créer un enregistrement DNS A pour ce sous-domaine.
sudo nano /etc/nginx/conf.d/dot.example.com.conf
Copiez le texte suivant et collez-le dans le fichier de l'hôte virtuel.
server { listen 80; server_name dot.example.com; root /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
Enregistrez et fermez le fichier. Rechargez Nginx pour que les modifications prennent effet.
sudo systemctl reload nginx
Une fois l'hôte virtuel créé et activé, exécutez la commande suivante pour obtenir le certificat Let's Encrypt à l'aide du plug-in Webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/
Étape 3 :Créer un proxy DNS sur TLS dans Nginx
Modifiez le fichier de configuration principal de Nginx.
sudo nano /etc/nginx/nginx.conf
Ajoutez les lignes suivantes au bas de ce fichier. Notez qu'ils doivent être placés en dehors du http
contexte.
stream { # DNS upstream pool upstream dns { zone dns 64k; server 127.0.0.1:53; } # DoT server for decryption server { listen 853 ssl; ssl_certificate /etc/letsencrypt/live/dot.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dot.example.com/privkey.pem; proxy_pass dns; } }
Dans la configuration ci-dessus, nous faisons en sorte que Nginx termine la connexion TLS sur le port 853, puis il redirigera les requêtes DNS vers le résolveur DNS local écoutant sur 127.0.0.1:53
.
Enregistrez et fermez le fichier. Testez ensuite la configuration de Nginx et redémarrez.
sudo nginx -t sudo systemctl restart nginx
Si un pare-feu s'exécute sur le serveur Ubuntu, vous devez ouvrir le port TCP 853. Par exemple, si vous utilisez le pare-feu UFW, exécutez la commande suivante.
sudo ufw allow 853/tcp
Puisque nous utilisons DNS sur TLS, il n'y a pas lieu de s'inquiéter de l'attaque par amplification DNS.
Étape 5 :Configurer le client Stubby DoT sur le bureau Ubuntu
Stubby est un résolveur de stub DNS open source développé par l'équipe getdns. Un résolveur de stub est un petit client DNS sur l'ordinateur de l'utilisateur final qui reçoit les requêtes DNS d'applications telles que Firefox et transmet les requêtes à un résolveur récursif comme 1.1.1.1 ou 8.8.8.8. Stubby est spécial en ce sens qu'il prend en charge DNS sur TLS. Par défaut, il n'enverra que des requêtes DNS cryptées.
Installez Stubby sur le bureau Ubuntu à partir du référentiel par défaut.
sudo apt install stubby
Une fois installé, stubby s'exécute en arrière-plan. vérifiez son statut avec :
systemctl status stubby
Stubby écoute sur le port TCP et UDP 53 de localhost (127.0.0.1). Par défaut, Stubby utilise des DNS tiers sur des résolveurs TLS. Nous devons le configurer pour utiliser le nôtre.
sudo nano /etc/stubby/stubby.yml
Faites défiler jusqu'à upstream_recursive_servers:
section et ajoutez le texte suivant au-dessus des autres serveurs DNS. Remplacez 12.34.56.78 par l'adresse IP de votre résolveur DoT.
# My Own DNS over TLS resolver - address_data: 12.34.56.78 tls_auth_name: "dot.example.com"
Recherchez ensuite la ligne suivante :
round_robin_upstreams: 1
Modifier 1
à 0
. Ainsi, stubby utilisera toujours votre propre résolveur DNS sur TLS. S'il n'est pas disponible, stubby utilisera d'autres serveurs DNS. Enregistrez le fichier et redémarrez stubby pour que les modifications prennent effet.
sudo systemctl restart stubby
Étape 6 :Configurer Ubuntu Desktop pour utiliser Stubby
Bien que Stubby soit en cours d'exécution, il n'est pas utilisé par le système d'exploitation. Cliquez sur l'icône Network Manager dans le coin supérieur droit de votre bureau. Sélectionnez ensuite les paramètres filaires. (Si vous utilisez le Wi-Fi, sélectionnez Paramètres Wi-Fi.)
Cliquez sur le bouton d'engrenage.
Sélectionnez IPv4
puis dans les paramètres DNS, basculez sur Automatic
sur OFF, ce qui empêchera votre système Ubuntu d'obtenir l'adresse du serveur DNS de votre routeur. Saisissez 127.0.0.1
dans le champ DNS. Cliquez sur Apply
bouton pour enregistrer vos modifications.
Redémarrez ensuite NetworkManager pour que les modifications prennent effet.
sudo systemctl restart NetworkManager
Une fois que vous êtes reconnecté, vous pouvez voir que votre système Ubuntu utilise maintenant 127.0.0.1 comme serveur DNS dans les Details
onglet.
Comment vérifier si votre trafic DNS est chiffré
Nous pouvons utiliser WireShark pour surveiller le trafic DNS. Installez WireShark sur le bureau Ubuntu.
sudo apt install wireshark
Si on vous demande « Les non-superutilisateurs devraient-ils pouvoir capturer des paquets ? », répondez Oui. Une fois installé, exécutez la commande suivante pour ajouter votre compte d'utilisateur au groupe wireshark afin de pouvoir capturer des paquets.
sudo adduser your-username wireshark
Déconnectez-vous et reconnectez-vous pour que les modifications prennent effet. Ouvrez ensuite WireShark à partir du menu de votre application, sélectionnez votre interface réseau dans WireShark. Par exemple, le nom de mon interface Ethernet est enp5s0. Saisissez ensuite port 853
comme filtre de capture. Ainsi, WireShark ne capturera que le trafic sur le port 853, qui est le port utilisé par DNS sur TLS.
Cliquez sur le bouton dans le coin supérieur gauche pour commencer la capture. Après cela, dans la fenêtre du terminal, exécutez la commande suivante pour interroger le nom de domaine en utilisant le dig
utilitaire. Par exemple, je peux interroger l'enregistrement A de mon nom de domaine.
dig A linuxbabe.com
Vous pouvez maintenant voir le trafic DNS capturé dans WireShark. Les connexions ont été établies via TCP et cryptées avec TLS, ce que nous voulons. Vous devez vérifier si la colonne Destination inclut l'adresse IP de votre résolveur DoT.
Si les requêtes DNS sont envoyées sans cryptage, l'ordinateur contactera le serveur DNS sur le port 53. Vous pouvez à nouveau capturer des paquets avec le port 53
comme filtre de capture, mais vous ne verrez aucun paquet dans WireShark, ce qui signifie que stubby chiffre vos requêtes DNS.