AccueilTechniqueServices → DoH

    DoH

    Notre service DoH, est un résolveur DNS-over-HTTPS ouvert permettant à quiconque qui dispose d’un client adapté de résoudre des requêtes DNS de manière chiffrée à travers notre service. Il répond au besoin de protéger les requêtes DNS de leur interception et de leur modification par des tiers, ou de l’utilisation de résolveurs DNS menteurs. Le protocole DNS-over-HTTPS est défini par le RFC 8484.

    Fonctionnement🔗

    Un client DoH envoie une requête DNS sur https://doh.lacontrevoie.fr/dns-query (l’adresse https://doh.42l.fr/dns-query fonctionne également mais est dépréciée), à travers HTTPS. Sa requête est résolue par notre résolveur DNS interne, dédié à ce service, puis sa réponse est envoyée via HTTPS.

    Historique🔗

    L’ouverture de service DoH est officiellement annoncée le 23 mai 2019, il s’agit du premier service en libre accès de La Contre-Voie, sorti peu après le service Mail (réservé aux membres).

    À la base, il s’agissait d’un proxy DoH : les requêtes DNS-over-HTTPS que nous recevions étaient aléatoirement relayées aux fournisseurs d’accès à Internet associatifs qui proposent un résolveur DNS récursif ouvert. Avant d’utiliser unbound, nous utilisions edgedns, que nous avons finalement abandonné car le logiciel ne semblait plus maintenu.

    Nous avons choisi unbound car il s’agit d’un standard de l’industrie, dont l’ancienneté démontre que le logiciel a fait ses preuves (première version en 2007), tout en ayant bénéficié de maintenances régulières et de l’ajout de nouvelles fonctionnalités, dont DNS-over-HTTPS fait partie. Le support de DoH non chiffré, prérequis pour proposer convenablement un service DoH derrière un reverse-proxy, a été intégré le 19 octobre 2020, ce qui a mené au remplacement de edgedns par unbound le 4 janvier 2022.

    Installation🔗

    Nous utilisons l’image mvance/unbound, légèrement ajustée pour nos besoins (voir notre Dockerfile). Cette instance d’unbound est configurée pour répondre à des requêtes HTTP uniquement, car notre reverse-proxy centralise la gestion des certificats TLS et des journaux d’accès au service.

    Un paramètre dans sa configuration permet également de définir la quantité de RAM dédiée au service, et laisse supposer que la taille du cache DNS peut également être affectée par ce paramètre. Nous avons défini une limite de RAM dans sa configuration en complément de la limite configurée dans notre fichier docker-compose.

    Le conteneur unbound-doh est connecté dans un sous-réseau qui lui est propre, dans lequel seul notre reverse-proxy est atteignable.

    Journaux de connexion🔗

    Nous enregistrons les journaux de connexion de notre reverse-proxy pour une durée de 14 jours, conformément à la législation européenne. Le format de journalisation est le suivant :

    IP - - [DATE:HEURE] "POST /dns-query HTTP/2.0" 200 TAILLE "-" "-" "-"
    

    Le contenu de la requête n’est donc pas enregistré pour les clients utilisant la méthode POST, ce qui correspond à une écrasante majorité des clients qui utilisent notre service.

    Tests🔗

    Il est possible de tester le service à l’aide de curl :

    curl -vvv --doh-url https://doh.lacontrevoie.fr/dns-query afnic.fr
    

    Pour diagnostiquer l’état du service depuis l’hôte, l’outil tcpdump peut être utilisé dans un conteneur auxiliaire :

    docker run -it --rm --net container:unbound-doh nicolaka/netshoot
    $ tcpdump
    

    Pour vérifier la configuration d’unbound, la commande unbound-checkconf peut être exécutée dans le conteneur.

    Statistiques d’utilisation🔗

    Voici quelques statistiques d’utilisation du service DoH de La Contre-Voie.

    Il s’agit de moyennes journalières mesurées pendant la 5e semaine (calendrier ISO) de chaque année listée.

    AnnéeRequêtesUtilisateur·ice·s uniquesBande passante
    2020364 5051 219113 MB
    2021843 6962 018203 MB
    20221 139 255 2 179139 MB
    2023934 3381 602118 MB

    Attention : la bande passante indiquée ne prend pas en compte le trafic du résolveur lui-même, mais seulement celle du reverse-proxy qui interagit avec les clients.

    En production, le conteneur unbound-doh est limité à 290 MB de RAM dans sa configuration, et sa consommation moyenne est de 230 MB de RAM en date de février 2023.

    Précautions🔗

    Quelques conseils pour héberger un service DoH :

    • Ne pas utiliser le même résolveur DNS pour résoudre vos requêtes DoH et vos requêtes internes (liées à d’autres services ou à votre hôte). En cas de saturation de votre service DoH, la résolution DNS de tous vos autres services pourrait s’en retrouver impactée.
    • Ne pas dépendre de services tiers pour la résolution DNS ; le temps de latence dans la résolution DNS augmenterait significativement et vous n’y gagnerez pas grand-chose. Disposer d’un résolveur DNS récursif en interne ne coûte presque rien et offrira une meilleure qualité de service.
    • Configurer un cache DNS afin de résoudre plus rapidement les requêtes les plus courantes (c’est indispensable).
      • Pour augmenter l’efficacité de notre cache, nous forçons le délai minimal de conservation d’une entrée DNS dans le cache (TTL) à une heure. Ce paramètre peut avoir des conséquences non désirées, en particulier si les personnes qui utilisent notre service ont besoin de rafraîchir leur cache ; nous avons toutefois jugé qu’un cache minimal d’une heure était un délai raisonnable.
    • Limiter le nombre de requêtes par client. Cette limitation peut être mise en place depuis le reverse-proxy (limit_req_zone sur nginx ou le module caddy-ratelimit pour Caddy). La stratégie de limitation de requêtes utilisée pourrait toutefois ne pas fonctionner comme prévu (le chargement d’une page web mal conçue peut nécessiter une cinquantaine de requêtes DNS) et nécessite d’être testée.
      • Ces limites pourraient sauver votre service en cas de saturation. Il nous est déjà arrivé que 5 IPs envoient subitement des requêtes en masse vers notre service (à hauteur de 1000 requêtes par seconde pendant plusieurs heures). Ces limites prédéfinies ont permis de préserver notre service.
    • S’assurer que l’hôte dispose d’un espace disque suffisant pour stocker les journaux de connexion : la conservation d’un million d’entrées de journalisation par jour correspond à 100 Mo de stockage journalier en moyenne. Conserver une semaine de journaux sur ce service avec ce trafic nécessite a minima 700 Mo.
    • Surveiller régulièrement ses journaux à la recherche d’utilisation abusive du service, et bien entendu, surveiller également l’utilisation des ressources (CPU/RAM) du reverse-proxy et du résolveur.

    Entretien🔗

    Ce service demande très peu d’entretien, même s’il nécessite d’être supervisé attentivement pour vérifier son fonctionnement et mesurer l’espace disque conséquent que peut consommer ses journaux.

    Mise à jour🔗

    Les nouvelles versions de l’image sont publiées sur son dépôt GitHub. Les notes de version sont consultables sur le dépôt d’Unbound, maintenu par NLnet Labs.

    Des précautions particulières doivent être prises sur les patchs effectués avec notre Dockerfile sur le fichier /unbound.sh, car il spécifie un numéro de ligne auquel un paramètre de configuration doit être ajouté.

    Évolutions envisagées🔗

    Simplification des patchs🔗

    Les patchs effectués par notre Dockerfile risquent de casser régulièrement au fil des mises à jour. Il serait nécessaire de réfléchir à une manière plus propre d’effectuer ces modifications de configuration, tout en restant sur une configuration qui s’adapte aux versions futures du logiciel.

    Serveur DoT🔗

    Il est envisageable à l’avenir de proposer un service DNS-over-TLS sur le port 853 (fonctionnalité supportée par unbound). Pour l’instant, quelques réserves empêchent le déploiement de cette fonctionnalité, concernant le manque de logging et la protection contre le spam.

    Avec DNS-over-HTTPS, notre reverse-proxy s’occupe de limiter le nombre de requêtes et centralise la journalisation. Avec DoT, l’utilisation de notre reverse-proxy à cette fin semble inadaptée à première vue. De la même manière, cette idée soulève la question de la gestion des certificats, qui sont jusqu’à présent essentiellement centralisés sur notre reverse-proxy.