
Ensemble d'outils de mesure DNS, de dépannage et d'audit de sécurité
[](https://pypi.python.org/pypi/dnsdiag/) []() [](https://pepy.tech/project/dnsdiag) [](https://pepy.tech/project/dnsdiag) []() [](https://hub.docker.com/r/farrokhi/dnsdiag) [](https://github.com/farrokhi/dnsdiag/stargazers)
Ensemble d'outils de mesure, de dépannage et d'audit de sécurité DNS
===============================================================
Vous êtes-vous déjà demandé si votre FAI [interceptait votre trafic
DNS](https://medium.com/decentralize-today/is-your-isp-hijacking-your-dns-traffic-f3eb7ccb0ee7) ?
Avez-vous remarqué un comportement inhabituel dans vos réponses DNS, ou avez-vous été redirigé vers
une mauvaise adresse et soupçonné 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
à 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 la route de votre requête DNS jusqu'à sa destination à l'aide de
`dnstraceroute`, en vérifiant 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
toute différence dans les chemins empruntés, vous alertant d'éventuels problèmes.
`dnseval` évalue plusieurs résolveurs DNS pour vous aider à choisir le meilleur résolveur DNS
pour votre réseau. Bien que l'utilisation de votre propre résolveur DNS soit recommandée pour éviter
de dépendre de résolveurs DNS tiers, `dnseval` peut vous aider à sélectionner le
résolveur DNS optimal lorsque cela est nécessaire. Il vous permet de comparer les serveurs DNS en fonction de leurs performances (latence) et de leur fiabilité (perte de paquets), vous offrant une vue complète 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 depuis le code source pour une flexibilité et un contrôle optimaux. L'exécution depuis
les sources ou l'installation avec pip nécessite Python 3.11 ou une version plus récente.
## Code source
1. Récupérez 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
```
2. Vous pouvez également installer le paquet avec pip :
```
pip3 install dnsdiag
```
## Utilisation de uv (recommandé)
[uv](https://docs.astral.sh/uv/) est un gestionnaire de paquets Python rapide qui peut exécuter des outils directement sans installation :
```bash
# Exécuter dnsping directement sans installation
uvx --from dnsdiag dnsping google.com
# Exécuter avec des options spécifiques
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com
# Exécuter dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com
# Exécuter dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com
```
Pour installer dnsdiag de manière persistante :
```bash
# Installer les outils dnsdiag
uv tool install dnsdiag
# Mettre à niveau vers la dernière version
uv tool upgrade dnsdiag
```
## Paquet binaire
De temps à autre, des paquets binaires sont publiés pour Windows, Mac OS X et Linux. Vous pouvez récupérer la dernière version depuis la [page des releases](https://github.com/farrokhi/dnsdiag/releases).
### Plateformes prises en charge
Des binaires précompilés 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 compilation 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 via le sous-système Windows pour Linux (WSL2) ou l'installer directement depuis les 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 « pinger » 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 sont mutuellement exclusives ; 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](https://www.rfc-editor.org/rfc/rfc8914)) 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](https://www.rfc-editor.org/rfc/rfc5001)).
- Utilisez `--ecs` pour inclure les informations EDNS Client Subnet pour l'optimisation du routage géographique.
- Utilisez `--cookie` pour afficher les cookies DNS ([RFC 7873](https://www.rfc-editor.org/rfc/rfc7873)) lorsqu'ils sont présents dans les réponses.
```shell
./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 d'EDNS Client Subnet pour des réponses géolocalisées :
```shell
./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 à l'aide de l'option NSID :
```shell
./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 :
```shell
./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 liés à la sécurité
Lors de l'utilisation de `--dnssec` et `--flags`, `dnsping` expose des champs du protocole DNS
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 validants lorsque la réponse a été validée
cryptographiquement à l'aide de DNSSEC. C'est un signal fort que la validation DNSSEC est active
et réussie.
Schémas typiques :
| Résultat | Signification |
|-------|--------|
| `NOERROR` avec l'indicateur `AD` | La validation DNSSEC a réussi |
| `SERVFAIL` avec l'indicateur `DO` | La validation DNSSEC a échoué (souvent en raison de signatures cassées ou d'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 performance, 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 vouloir comparer cela avec votre traceroute réseau réel pour
vous assurer que votre trafic DNS n'est pas acheminé par des chemins indésirables.
`dnstraceroute` prend en charge plusieurs protocoles de transport (mutuellement exclusifs) :
- UDP (par défaut) - Requêtes DNS traditionnelles
- TCP (`--tcp`) - DNS sur TCP
- DoQ (`--quic`) - DNS sur QUIC (pris en charge par AdGuard DNS)
- DoH3 (`--http3`) - DNS sur HTTP/3 (pris en charge par Google DNS et Cloudflare)
```shell
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com
```
Vous pouvez également tester les protocoles DNS modernes :
```shell
# Tester DNS sur QUIC avec AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# Tester DNS sur 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 des
conseils d'expert, y compris des avertissements sur un éventuel détournement de 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 sur TLS), DoH (DNS sur
HTTPS), DoQ (DNS sur QUIC) et DoH3 (DNS sur HTTP/3) en utilisant respectivement les options `--tcp`,
`--tls`, `--doh`, `--quic` et `--http3`. Ces options de protocole sont mutuellement exclusives ; une seule peut être spécifiée par commande.
## Récapitulatif de la prise en charge des protocoles
| Outil | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|------|-----|-----|-----------|-----|-----|------|
| `dnsping` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| `dnstraceroute` | ✓ | ✓ | - | - | ✓ | ✓ |
| `dnseval` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
*DoQ : DNS sur QUIC, DoH3 : DNS sur HTTP/3*
```shell
./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.
```shell
./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 standard comme `jq`.
```shell
cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'
```
### Auteur
Babak Farrokhi
- github: [github.com/farrokhi](https://github.com/farrokhi/)
- website: [farrokhi.net](https://farrokhi.net/)
- mastodon: [@[email protected]](https://unix.family/@farrokhi)
- twitter: [@farrokhi](https://twitter.com/farrokhi)
### Licence
dnsdiag est publié sous une licence BSD à 2 clauses.