Monter son serveur DNS over HTTPS

Bonjour à toutes et à tous,

Étant passionné de sécurité et de vie privée numérique, les nouveaux protocoles et les nouvelles technologies me fascinent. Cela fait maintenant quelques mois que je voyais des articles sur le DoH (DNS over HTTPS). En ces temps de confinement, l’occasion est parfaite pour m’y intéresser de plus près.

Si vous avez commencé à lire cet article, c’est que vous savez sûrement déjà ce qu’est le protocole DNS et le protocole HTTPS. Je ne vais donc pas faire un cours sur ces deux protocoles qui règnent en grande partie sur Internet 🙂

Le protocole DoH est, contrairement au protocole DoT (DNS over TLS), un protocole d’encapsulation. La principale différence entre le DoH et le DoT est que le DoT implémente une gestion du chiffrement par dessus DNS, alors que le DoH est un procédé d’encapsulation mémé à un nouveau formatage du protocole DNS.

En effet, dans une trame DoH, les données ne sont pas sous la même forme que DNS. Les données sont alors transmises au format JSON. Pour les personnes voulant creuser le sujet, voici un lien vers une excellente documentation traitant du sujet.

Je pense écrire un article sur la controverse du DoH. En effet, le DoH amène son lot de nouveautés et surtout son lot de protections. En passant les requêtes DNS sous HTTPS, il est donc plus difficile d’en inspecter le contenu. Pour les enthousiastes comme vous et moi, le DoH est une couche de confidentialité supplémentaire dans nos vies virtuelles.

Maintenant que je vous ai convaincu que le DoH était un excellent protocole (Non ? Comment ça !?), passons au choses sérieuses: Installons notre propre serveur DoH !

Vous êtes prêts ? C’est parti !

Prérequis

  • Une machine Linux basée sur Ubuntu (Ne me tapez pas et lisez jusqu’à la fin) (I use Arch btw)
  • Un accès root à la machine
  • Si vous souhaitez utiliser votre DNS depuis Internet, la machine doit être accessible depuis l’extérieur (port 443)
  • Un nom de domaine pointant vers votre machine

Architecture

Un beau diagramme vaut mieux que 1000 mots.

Voici comment notre installation va être mise en place:

  • Nous utiliserons dnscrypt en tant que serveur DNS “classique” qui se basera sur des DNS publiques. Il écoutera sur le port 53.
  • doh-server est un paquet Linux permettant de faire la traduction de HTTPS vers DNS. Il écoutera sur le port 8053.
  • Nginx nous servira de reverse-proxy. C’est lui qui traitera les données HTTPS et les renverra au doh-server. Il écoutera sur le port 443.

Installation

Commencez par mettre à jours votre machine

Installation de dnscrypt

J’ai choisi d’utiliser dnscrypt pour son interfaçage intuitif et sa grande variété de serveur DNS fournis par la communauté.

Ajoutons la PPA de dnscrypt puis lançons son installation.

Une fois installé, dnscrypt se lancera automatiquement lors du boot.

Afin de garder se tutoriel simple, je vais utiliser Cloudflare en tant que fournisseur DNS. Si cela ne vous convient pas (ce que je comprends amplement), vous avez le choix entre des centaines d’autres serveurs sur le site de dnscrypt.

Afin de le configurer, il suffit de modifier le fichier /etc/dnscrypt-proxy/dnscrypt-proxy.toml

Cherchez la section “General” et changez la valeur de la variable server_names.

Une fois modifié, redémarrons le service.

Par défaut, dnscrypt utilise la librairie socket de systemd afin d’écouter sur 127.0.2.1:53

Nous en avons fini avec dnscrypt !

Installation du serveur DNS-over-HTTPS

La manière la plus simple d’installer le serveur DoH est de l’installer à partir du paquet .deb disponible à cette adresse.

(Ce .deb peut être aussi installé sur n’importe quelle machine basée sous Debian. Par soucis de simplicité, je vous ai demandé en début d’article une machine Ubuntu car je n’ai pas testé ce .deb sous Debian.)

Une fois téléchargé, il vous suffit de l’installer avec la commande suivante.

Si vous préférez le compiler vous-même, vous pouvez suivre le guide fourni dans le repo GitHub.

En ce qui concerne la configuration, cela se passe dans le fichier /etc/dns-over-https/doh-server.conf

Il vous suffit de changer la valeur des variables listen & upstream afin de coordonner avec notre architecture.

Cette configuration va permettre de spécifier au serveur DoH d’utiliser dnscrypt pour nos requêtes DNS.

Une fois terminé, il nous suffit de redémarrer le service.

Installation de Nginx

Nous allons ajouter la PPA de Nginx qui contient sa dernière version. Cette dernière supporte le TLS 1.3, version recommandée d’utilisation à ce jour.

Pour la configuration, il vous suffit de créer le fichier /etc/nginx/sites-available/dns-over-https et d’y mettre le contenu suivant.

La seule chose à changer est la valeur de la variable server_name. Ici, vous devez spécifier le nom de domaine attribué à votre serveur DoH.

Faites ensuite un lien symbolique vers la configuration que nous allons activer. Demandez à Nginx de vérifier que la configuration fonctionne et rechargez-le.

Désormais, Nginx est configuré de telle sorte à ce que tous les paquets HTTPS reçus seront redirigés vers votre serveur DoH.

Génération de certificat HTTPS avec Let’s Encrypt

Qu’est ce que le HTTP sans S ? Pour être franc, un véritable cauchemar…

Nous allons donc devoir fournir à notre Nginx son propre certificat HTTPS tout beau, tout fraîchement généré par Let’s Encrypt.

Tout d’abord, nous devons installer certbot, qui nous permettra de configurer notre Nginx de manière totalement automatique.

Il ne nous reste plus qu’à demander gentiment à Let’s Encrypt de nous donner un certificat HTTPS, et certbot se chargera de l’installation et de la configuration de Nginx. Veuillez remplacer “dns.example.com” par votre propre domaine.

Si c’est la première fois que vous exécutez certbot, vous serez invité à saisir une adresse e-mail et à accepter les conditions d’utilisation. Après cela, certbot communiquera avec le serveur Let’s Encrypt, puis lancera un défi pour vérifier que vous contrôlez le domaine pour lequel vous demandez un certificat.

Hardening SSL

Certbot est livré avec des valeurs par défaut SSL “pas mal”, mais elles n’ont pas été mises à jour depuis un certain temps. Cette configuration conserve le support de TLS 1.0 qui est obsolète depuis quelques années. Aucun appareil ne devrait l’utiliser. De plus, la liste de chiffrement choisie contient des cyphers faibles. En tant que bon nerd, nous nous devons de faire les choses bien. Pour cela, voici un fichier de configuration améliorant les valeurs par défaut de Certbot.

Il suffit d’éditer le fichier /etc/letsencrypt/options-ssl-nginx.conf et d’y mettre le contenu suivant.

Ensuite, rechargeons Nginx.

Conclusion

Bravo !  Vous êtes maintenant l’heureux détenteur d’un serveur DoH ! Il vous suffit de pointer votre navigateur internet préféré vers l’adresse suivante, en veillant à bien avoir activé le DoH sur ce dernier.

Si vous avez aimé cet article, n’hésitez pas à me le dire, ça fait toujours très plaisir 🙂

Je tiens à préciser que cet article est volontairement en grande partie repris de l’excellent site d’Antoine Aflalo qui fait du super travail ! N’hésitez pas à visiter son site web qui vaux le coup d’œil 🙂

À très bientôt pour un nouvel article !