
dnsdiag v2.9.4
Ensemble d'outils de mesure DNS, de dépannage et d'audit de sécurité
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
- 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
- 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,--quicou--http3pour 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
--flagspour afficher les indicateurs de réponse, y compris les indicateurs EDNS, pour chaque réponse. - Utilisez
--dnssecpour demander la validation DNSSEC, si disponible. - Les messages d'erreur DNS étendus (RFC 8914) sont automatiquement affichés lorsqu'ils sont présents.
- Utilisez
--nsidpour afficher l'identifiant du serveur de noms (NSID) s'il est disponible (RFC 5001). - Utilisez
--ecspour inclure les informations de sous-réseau client EDNS pour l'optimisation du routage géographique. - Utilisez
--cookiepour 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ésultat | Signification |
|---|---|
NOERROR avec indicateur AD | La validation DNSSEC a réussi |
SERVFAIL avec indicateur DO | La validation DNSSEC a échoué (souvent dû à des signatures cassées ou à une mauvaise configuration) |
Aucun indicateur AD présent | Le 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:10 – DNSSEC Bogus (données DNSSEC invalides ou cassées)
- EDE:6 – DNSSEC Signature Expired
- EDE:7 – DNSSEC 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
| Outil | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|---|---|---|---|---|---|---|
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
- github : github.com/farrokhi
- site web : farrokhi.net
- mastodon : @[email protected]
- twitter : @farrokhi
Licence
dnsdiag est distribué sous licence BSD à 2 clauses.