Retour aux mises à jour
New releaseJul 21, 2026

dnsdiag v2.9.4

Ensemble d'outils de mesure DNS, de dépannage et d'audit de sécurité

Partager

PyPI PyPI Downloads Downloads PyPI Docker Pulls GitHub stars

Ensemble d'outils de mesure DNS, de dépannage et d'audit de sécurité

Vous êtes-vous déjà demandé si votre FAI interceptait votre trafic DNS) ? Avez-vous remarqué un comportement inhabituel dans vos réponses DNS, ou avez-vous été redirigé vers une adresse erronée en soupçonnant un problème avec votre DNS ? Nous proposons une suite d'outils pour effectuer des audits de base sur vos requêtes et réponses DNS, vous aidant ainsi à garantir que votre DNS fonctionne comme prévu.

Avec dnsping, vous pouvez mesurer le temps de réponse de n'importe quel serveur DNS pour des requêtes arbitraires. Semblable à l'utilitaire ping classique, dnsping offre des fonctionnalités comparables pour les requêtes DNS, vous aidant à surveiller la réactivité du serveur.

Vous pouvez également tracer le chemin de votre requête DNS jusqu'à sa destination en utilisant dnstraceroute, vérifiant ainsi qu'elle n'est pas redirigée ou interceptée. En comparant les requêtes DNS envoyées au même serveur, dnstraceroute vous permet d'observer les différences dans les chemins empruntés, vous alertant ainsi d'éventuels problèmes.

dnseval évalue plusieurs résolveurs DNS pour vous aider à choisir le meilleur résolveur DNS pour votre réseau. Bien qu'il soit recommandé d'utiliser votre propre résolveur DNS pour éviter de dépendre de résolveurs tiers, dnseval peut vous aider à sélectionner le résolveur DNS optimal si nécessaire. Il vous permet de comparer les serveurs DNS en fonction des performances (latence) et de la fiabilité (perte de paquets), vous offrant une vue d'ensemble pour une prise de décision éclairée.

Installation

Il existe plusieurs façons d'utiliser cet ensemble d'outils, bien que nous recommandions de l'exécuter directement à partir du code source pour une flexibilité et un contrôle optimaux.

Code source

  1. Clonez le dépôt git et installez les dépendances :
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
  1. Vous pouvez également installer le paquet à l'aide de pip :
pip3 install dnsdiag

Utilisation de uv (Recommandé)

uv est un gestionnaire de paquets Python rapide qui permet d'exécuter des outils directement sans installation :

# Exécutez dnsping directement sans installation
uvx --from dnsdiag dnsping google.com

# Exécutez avec des options spécifiques
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com

# Exécutez dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com

# Exécutez dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com

Pour installer dnsdiag de manière permanente :

# Installez les outils dnsdiag
uv tool install dnsdiag

# Mettez à niveau vers la dernière version
uv tool upgrade dnsdiag

Paquet binaire

De temps en temps, des paquets binaires seront publiés pour Windows, Mac OS X et Linux. Vous pouvez récupérer la dernière version sur la page des versions.

Plateformes prises en charge

Les binaires pré-construits sont disponibles pour :

  • Linux (x86_64, ARM64)
  • macOS (Intel, Apple Silicon)
  • Windows (x86_64)

Windows ARM64 n'est actuellement pas pris en charge en raison de dépendances de construction nécessitant des chaînes d'outils de compilation natives qui ne sont pas facilement disponibles. Si vous utilisez Windows sur ARM, vous pouvez exécuter dnsdiag en utilisant le sous-système Windows pour Linux (WSL2) ou l'installer directement à partir des sources.

Docker

Si vous préférez ne pas installer dnsdiag sur votre machine locale, vous pouvez utiliser l'image Docker pour exécuter les outils dans un environnement conteneurisé. Par exemple :

docker run --network host -it --rm farrokhi/dnsdiag dnsping.py

dnsping

dnsping vous permet de « pinguer » un résolveur DNS en envoyant une requête DNS arbitraire plusieurs fois. Pour une liste complète des options de ligne de commande prises en charge, utilisez --help. Voici quelques options clés :

  • Utilisez --tcp, --tls, --doh, --quic ou --http3 pour sélectionner le protocole de transport (par défaut UDP). Ces options s'excluent mutuellement ; un seul protocole peut être spécifié par commande.
  • Utilisez --flags pour afficher les indicateurs de réponse, y compris les indicateurs EDNS, pour chaque réponse.
  • Utilisez --dnssec pour demander la validation DNSSEC, si disponible.
  • Les messages d'erreur DNS étendus (RFC 8914) sont automatiquement affichés lorsqu'ils sont présents.
  • Utilisez --nsid pour afficher l'identifiant du serveur de noms (NSID) s'il est disponible (RFC 5001).
  • Utilisez --ecs pour inclure les informations de sous-réseau client EDNS pour l'optimisation du routage géographique.
  • Utilisez --cookie pour afficher les cookies DNS (RFC 7873) lorsqu'ils sont présents dans les réponses.
./dnsping.py -c 5 --dnssec --flags --tls -t AAAA -s 8.8.8.8 brokendnssec.net
dnsping.py DNS: 8.8.8.8:853, hostname: brokendnssec.net, proto: TLS, class: IN, type: AAAA, flags: [RD]
75  bytes from 8.8.8.8: seq=1   time=73.703 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=2   time=69.523 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=3   time=58.058 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=4   time=54.235 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=5   time=57.806 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]

--- 8.8.8.8 dnsping statistics ---
5 requests transmitted, 5 responses received, 0% lost
min=54.235 ms, avg=22.665 ms, max=69.523 ms, stddev=38.202 ms

dnsping fournit également des statistiques telles que les temps de réponse minimum, maximum et moyen, ainsi que la gigue (écart type) et la perte de paquets.

Voici quelques cas d'utilisation intéressants pour dnsping :

  • Comparer les temps de réponse entre différents protocoles de transport (par exemple, UDP vs DoH).
  • Évaluer la fiabilité de votre serveur DNS en mesurant la gigue et la perte de paquets.
  • Mesurer les temps de réponse avec DNSSEC activé à l'aide de l'option --dnssec.
  • Tester le comportement EDNS Client Subnet pour les réponses géo-localisées :
./dnsping.py -c 3 --ecs 203.0.113.0/24 -s 94.140.14.14 google.com
dnsping.py DNS: 94.140.14.14:53, hostname: google.com, proto: UDP, class: IN, type: A, flags: [RD]
66  bytes from 94.140.14.14: seq=1   time=31.407 ms  NOERROR [ECS:203.0.113.0/24/24]
66  bytes from 94.140.14.14: seq=2   time=29.156 ms  NOERROR [ECS:203.0.113.0/24/24]
66  bytes from 94.140.14.14: seq=3   time=30.892 ms  NOERROR [ECS:203.0.113.0/24/24]

--- 94.140.14.14 dnsping statistics ---
3 requests transmitted, 3 responses received, 0% lost
min=29.156 ms, avg=30.485 ms, max=31.407 ms, stddev=1.176 ms
  • Identifier les serveurs DNS utilisant l'option NSID :
./dnsping.py -c 2 --nsid -s 8.8.8.8 google.com
dnsping.py DNS: 8.8.8.8:53, hostname: google.com, proto: UDP, class: IN, type: A, flags: [RD]
68  bytes from 8.8.8.8: seq=1   time=36.399 ms  NOERROR [NSID:gpdns-ams]
68  bytes from 8.8.8.8: seq=2   time=32.156 ms  NOERROR [NSID:gpdns-ams]

--- 8.8.8.8 dnsping statistics ---
2 requests transmitted, 2 responses received, 0% lost
min=32.156 ms, avg=34.278 ms, max=36.399 ms, stddev=2.122 ms
  • Tester les cookies DNS pour une sécurité renforcée et une optimisation du cache :
./dnsping.py -c 2 --cookie -s anyns.pch.net quad9.net
dnsping.py DNS: anyns.pch.net:53, hostname: quad9.net, proto: UDP, class: IN, type: A, flags: [RD]
82  bytes from anyns.pch.net: seq=1   time=30.552  ms  NOERROR [COOKIE:27f609c017bb2ec4ea70de5c68eec3fc39f6a53ee49c55f8]
82  bytes from anyns.pch.net: seq=2   time=24.794  ms  NOERROR [COOKIE:719631dd9fcce722d3ac859b68eec3fd2e5430b5c8a7f8cf]

--- anyns.pch.net dnsping statistics ---
2 requests transmitted, 2 responses received, 0% lost
min=24.794 ms, avg=27.673 ms, max=30.552 ms, stddev=4.072 ms

Interprétation des indicateurs DNSSEC et de sécurité

Lors de l'utilisation de --dnssec et --flags, dnsping expose les champs du protocole DNS qui sont directement pertinents pour la validation de la sécurité DNS. Ces valeurs indiquent si un résolveur est capable de valider DNSSEC et si une réponse a été vérifiée avec succès.

Indicateurs courants :

  • DO (DNSSEC OK)
    Indique que le client demande des enregistrements liés à DNSSEC. Sa présence montre que le résolveur prend en charge les requêtes DNSSEC.

  • AD (Authenticated Data)
    Défini par les résolveurs de validation lorsque la réponse a été cryptographiquement validée à l'aide de DNSSEC. C'est un signal fort que la validation DNSSEC est active et réussie.

Modèles typiques :

RésultatSignification
NOERROR avec indicateur ADLa validation DNSSEC a réussi
SERVFAIL avec indicateur DOLa validation DNSSEC a échoué (souvent dû à des signatures cassées ou à une mauvaise configuration)
Aucun indicateur AD présentLe résolveur n'effectue pas de validation DNSSEC

Les erreurs DNS étendues (EDE, RFC 8914) fournissent des informations de diagnostic supplémentaires lorsque la validation DNSSEC échoue. Par exemple :

  • EDE:10DNSSEC Bogus (données DNSSEC invalides ou cassées)
  • EDE:6DNSSEC Signature Expired
  • EDE:7DNSSEC Signature Not Yet Valid

Ces indicateurs rendent dnsping utile non seulement pour les tests de performances, mais aussi pour valider si les résolveurs appliquent correctement DNSSEC et pour diagnostiquer les problèmes de déploiement DNSSEC.

dnstraceroute

dnstraceroute est un utilitaire qui trace le chemin de vos requêtes DNS jusqu'à leur destination. Vous pouvez comparer cela avec votre traceroute réseau réel pour vous assurer que votre trafic DNS n'est pas acheminé via des chemins indésirables.

dnstraceroute prend en charge plusieurs protocoles de transport (s'excluant mutuellement) :

  • UDP (par défaut) - Requêtes DNS traditionnelles
  • TCP (--tcp) - DNS over TCP
  • DoQ (--quic) - DNS over QUIC (pris en charge par AdGuard DNS)
  • DoH3 (--http3) - DNS over HTTP/3 (pris en charge par Google DNS et Cloudflare)
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com

Vous pouvez également tester les protocoles DNS modernes :

# Testez DNS over QUIC avec AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com

# Testez DNS over HTTP/3 avec Google DNS
./dnstraceroute.py --http3 -s 8.8.8.8 -c 3 google.com
dnstraceroute.py DNS: 8.8.4.4:53, hostname: facebook.com, rdatatype: A
1	192.168.0.1 (192.168.0.1) 1 ms
2	192.168.28.177 (192.168.28.177) 4 ms
3	192.168.0.1 (192.168.0.1) 693 ms
4	172.19.4.17 (172.19.4.17) 3 ms
5	dns.google (8.8.4.4) [AS15169 GOOGLE, US] 8 ms

=== Expert Hints ===
 [*] public DNS server is next to a private IP address (possible hijacking)

L'utilisation de l'option --expert avec dnstraceroute activera l'affichage de conseils d'expert, y compris des avertissements concernant un éventuel détournement du trafic DNS.

dnseval

dnseval est un utilitaire de ping en masse qui envoie des requêtes DNS arbitraires à une liste spécifiée de serveurs DNS, vous permettant de comparer leurs temps de réponse simultanément.

Vous pouvez utiliser dnseval pour évaluer les temps de réponse sur différents protocoles de transport, notamment UDP (par défaut), TCP, DoT (DNS over TLS), DoH (DNS over HTTPS), DoQ (DNS over QUIC) et DoH3 (DNS over HTTP/3) en utilisant respectivement les options --tcp, --tls, --doh, --quic et --http3. Ces options de protocole s'excluent mutuellement ; un seul peut être spécifié par commande.

Résumé de la prise en charge des protocoles

OutilUDPTCPTLS (DoT)DoHDoQDoH3
dnsping
dnstraceroute--
dnseval

DoQ : DNS over QUIC, DoH3 : DNS over HTTP/3

./dnseval.py --skip-warmup --dnssec -c10 -f public-servers.txt ripe.net
server                   avg(ms)  min(ms)  max(ms)  stddev(ms)  lost(%)  ttl      flags                      response
---------------------------------------------------------------------------------------------------------------------
1.0.0.1                  29.01    14.15    45.36    8.60        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.1.1.1                  23.90    18.14    42.07    7.83        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.0.0.2                  25.90    21.36    31.58    4.26        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.1.1.2                  22.68    18.36    32.15    3.96        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.0.0.3                  22.53    18.98    32.52    3.94        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.1.1.3                  21.70    20.25    22.97    0.77        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1001     21.70    19.13    27.50    2.28        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1111     22.63    20.42    30.18    3.13        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1002     24.97    20.89    44.63    7.16        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1112     23.24    21.37    25.87    1.48        %0       298      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1003     21.68    19.28    24.88    1.65        %0       298      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1113     22.61    19.86    26.09    1.73        %0       299      QR -- -- RD RA AD -- DO     NOERROR
195.46.39.39             25.56    16.42    55.37    15.37       %0       300      QR -- -- RD RA -- -- --     NOERROR
195.46.39.40             19.08    16.51    23.86    2.24        %0       300      QR -- -- RD RA -- -- --     NOERROR
2a05:d014:939:3300::39   0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
2a05:d014:939:3300::40   0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
208.67.220.220           30.60    14.54    120.64   31.88       %0       300      QR -- -- RD RA AD -- DO     NOERROR
208.67.222.222           21.78    17.42    36.45    6.06        %0       50       QR -- -- RD RA AD -- DO     NOERROR
2620:0:ccc::2            29.48    19.23    98.29    24.22       %0       299      QR -- -- RD RA AD -- DO     NOERROR
2620:0:ccd::2            22.36    17.90    30.18    3.98        %0       299      QR -- -- RD RA AD -- DO     NOERROR
216.146.35.35            172.53   114.46   360.87   71.47       %0       299      QR -- -- RD RA AD -- DO     NOERROR
216.146.36.36            187.36   118.21   324.32   59.08       %0       110      QR -- -- RD RA AD -- DO     NOERROR
209.244.0.3              46.49    25.23    115.86   28.19       %0       300      QR -- -- RD RA -- -- DO     NOERROR
209.244.0.4              58.33    28.09    109.18   29.20       %0       299      QR -- -- RD RA -- -- DO     NOERROR
4.2.2.1                  64.58    30.21    86.79    30.19       %25      299      QR -- -- RD RA -- -- DO     NOERROR
4.2.2.2                  40.54    22.69    74.80    20.76       %0       70       QR -- -- RD RA -- -- DO     NOERROR
4.2.2.3                  90.62    90.62    90.62    0.00        %50      70       QR -- -- RD RA -- -- DO     NOERROR
4.2.2.4                  31.53    23.80    70.93    14.51       %0       294      QR -- -- RD RA -- -- DO     NOERROR
4.2.2.5                  24.11    24.05    24.18    0.09        %33      294      QR -- -- RD RA -- -- DO     NOERROR
80.80.80.80              0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
80.80.81.81              0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
8.8.4.4                  28.35    20.85    39.14    7.24        %0       300      QR -- -- RD RA AD -- DO     NOERROR
8.8.8.8                  21.22    16.22    24.93    2.39        %0       299      QR -- -- RD RA AD -- DO     NOERROR

Vous pouvez également enregistrer les résultats au format JSONL pour un traitement ultérieur. Chaque ligne du fichier de sortie est un objet JSON valide contenant les résultats de mesure complets pour un serveur DNS.

./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com

La sortie peut être analysée ligne par ligne avec des outils JSON standards comme jq.

cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'

Auteur

Babak Farrokhi

Licence

dnsdiag est distribué sous licence BSD à 2 clauses.

Catégories