
Toolset per misurazione DNS, risoluzione dei problemi e audit di sicurezza
[](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)
Set di strumenti per la misurazione, la risoluzione dei problemi e l'audit di sicurezza del DNS
===============================================================
Ti sei mai chiesto se il tuo ISP sta [intercettando il tuo traffico
DNS](https://medium.com/decentralize-today/is-your-isp-hijacking-your-dns-traffic-f3eb7ccb0ee7)?
Hai notato comportamenti insoliti nelle tue risposte DNS, o sei stato reindirizzato a
un indirizzo sbagliato e hai sospettato che qualcosa non andasse con il tuo DNS? Offriamo una
suite di strumenti per eseguire audit di base sulle tue richieste e risposte DNS, aiutandoti
a garantire che il tuo DNS funzioni come previsto.
Con `dnsping`, puoi misurare il tempo di risposta di qualsiasi server DNS per query
arbitrarie. Simile alla normale utility ping, dnsping offre funzionalità
comparabili per le richieste DNS, aiutandoti a monitorare la reattività del server.
Puoi anche tracciare il percorso della tua richiesta DNS fino alla sua destinazione usando
`dnstraceroute`, verificando che non venga reindirizzata o intercettata. Confrontando le query DNS inviate allo stesso server, `dnstraceroute` ti permette di
osservare eventuali differenze nei percorsi seguiti, avvisandoti di possibili problemi.
`dnseval` valuta più resolver DNS per aiutarti a scegliere il miglior resolver DNS
per la tua rete. Sebbene sia consigliato utilizzare il tuo resolver DNS per evitare
di dipendere da resolver DNS di terze parti, `dnseval` può assisterti nella selezione del
resolver DNS ottimale quando necessario. Ti consente di confrontare i server DNS in base
alle prestazioni (latenza) e all'affidabilità (perdita di pacchetti), offrendoti una visione completa per un processo decisionale informato.
# Installazione
Ci sono diversi modi per utilizzare questo set di strumenti, anche se consigliamo di eseguirlo
direttamente dal codice sorgente per la massima flessibilità e controllo. L'esecuzione dal
sorgente o l'installazione con pip richiede Python 3.11 o versioni successive.
## Codice sorgente
1. Clona il repository git e installa le dipendenze:
```
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
```
2. In alternativa, puoi installare il pacchetto usando pip:
```
pip3 install dnsdiag
```
## Utilizzo di uv (consigliato)
[uv](https://docs.astral.sh/uv/) è un gestore di pacchetti Python veloce che può eseguire strumenti direttamente senza installazione:
```bash
# Esegui dnsping direttamente senza installazione
uvx --from dnsdiag dnsping google.com
# Esegui con opzioni specifiche
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com
# Esegui dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com
# Esegui dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com
```
Per installare dnsdiag in modo permanente:
```bash
# Installa gli strumenti dnsdiag
uv tool install dnsdiag
# Aggiorna all'ultima versione
uv tool upgrade dnsdiag
```
## Pacchetto binario
Di tanto in tanto, vengono rilasciati pacchetti binari per Windows, Mac OS X e Linux. Puoi scaricare l'ultima release dalla [pagina delle release](https://github.com/farrokhi/dnsdiag/releases).
### Piattaforme supportate
I binari precompilati sono disponibili per:
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64)
Windows ARM64 non è attualmente supportato a causa di dipendenze di build che richiedono toolchain di compilazione native non prontamente disponibili. Se utilizzi Windows su ARM, puoi eseguire dnsdiag usando Windows Subsystem for Linux (WSL2) o installarlo direttamente dal sorgente.
## Docker
Se preferisci non installare `dnsdiag` sulla tua macchina locale, puoi usare
l'immagine Docker per eseguire gli strumenti in un ambiente containerizzato. Ad esempio:
```
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
```
# dnsping
`dnsping` ti permette di fare "ping" a un resolver DNS inviando una query DNS arbitraria più volte. Per un elenco completo delle opzioni da riga di comando supportate, usa `--help`. Ecco alcune opzioni chiave:
- Usa `--tcp`, `--tls`, `--doh`, `--quic` o `--http3` per selezionare il protocollo di trasporto (il predefinito è UDP). Queste opzioni sono mutuamente esclusive; è possibile specificare un solo protocollo per comando.
- Usa `--flags` per visualizzare i flag di risposta, inclusi i flag EDNS, per ogni risposta.
- Usa `--dnssec` per richiedere la validazione DNSSEC, se disponibile.
- I messaggi Extended DNS Error ([RFC 8914](https://www.rfc-editor.org/rfc/rfc8914)) vengono visualizzati automaticamente quando presenti.
- Usa `--nsid` per visualizzare il Name Server Identifier (NSID) se disponibile ([RFC 5001](https://www.rfc-editor.org/rfc/rfc5001)).
- Usa `--ecs` per includere le informazioni EDNS Client Subnet per l'ottimizzazione del routing geografico.
- Usa `--cookie` per visualizzare i DNS cookie ([RFC 7873](https://www.rfc-editor.org/rfc/rfc7873)) quando presenti nelle risposte.
```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` fornisce anche statistiche come i tempi di risposta minimo, massimo e medio,
insieme al jitter (deviazione standard) e alla perdita di pacchetti.
Ecco alcuni casi d'uso interessanti per `dnsping`:
- Confrontare i tempi di risposta tra diversi protocolli di trasporto (ad es., UDP vs. DoH).
- Valutare l'affidabilità del tuo server DNS misurando jitter e perdita di pacchetti.
- Misurare i tempi di risposta con DNSSEC abilitato usando il flag `--dnssec`.
- Testare il comportamento di EDNS Client Subnet per risposte basate sulla geolocalizzazione:
```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
```
- Identificare i server DNS usando l'opzione 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
```
- Testare i DNS cookie per una maggiore sicurezza e ottimizzazione della 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
```
## Interpretazione dei flag DNSSEC e relativi alla sicurezza
Quando si utilizzano `--dnssec` e `--flags`, `dnsping` espone campi del protocollo DNS
direttamente rilevanti per la validazione della sicurezza DNS. Questi valori indicano se un
resolver è in grado di validare DNSSEC e se una risposta è stata verificata con successo.
Flag comuni:
- **DO (DNSSEC OK)**
Indica che il client sta richiedendo record relativi a DNSSEC. La sua presenza
mostra che il resolver supporta le query DNSSEC.
- **AD (Authenticated Data)**
Impostato dai resolver che validano quando la risposta è stata validata
crittograficamente usando DNSSEC. Questo è un forte segnale che la validazione DNSSEC è attiva
e ha avuto successo.
Pattern tipici:
| Risultato | Significato |
|-------|--------|
| `NOERROR` con flag `AD` | Validazione DNSSEC riuscita |
| `SERVFAIL` con flag `DO` | Validazione DNSSEC fallita (spesso a causa di firme non valide o errata configurazione) |
| Nessun flag `AD` presente | Il resolver non esegue la validazione DNSSEC |
Gli Extended DNS Errors (EDE, RFC 8914) forniscono informazioni diagnostiche aggiuntive quando
la validazione DNSSEC fallisce. Ad esempio:
- **EDE:10** – *DNSSEC Bogus* (dati DNSSEC non validi o corrotti)
- **EDE:6** – *DNSSEC Signature Expired*
- **EDE:7** – *DNSSEC Signature Not Yet Valid*
Questi indicatori rendono `dnsping` utile non solo per i test di prestazioni, ma anche
per validare se i resolver applicano correttamente DNSSEC e per diagnosticare
problemi di deployment DNSSEC.
# dnstraceroute
`dnstraceroute` è un'utility che traccia il percorso delle tue richieste DNS fino alla loro
destinazione. Potresti volerlo confrontare con il tuo traceroute di rete effettivo per
assicurarti che il tuo traffico DNS non venga instradato attraverso percorsi indesiderati.
`dnstraceroute` supporta più protocolli di trasporto (mutuamente esclusivi):
- UDP (predefinito) - Query DNS tradizionali
- TCP (`--tcp`) - DNS over TCP
- DoQ (`--quic`) - DNS over QUIC (supportato da AdGuard DNS)
- DoH3 (`--http3`) - DNS over HTTP/3 (supportato da Google DNS e Cloudflare)
```shell
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com
```
Puoi anche testare protocolli DNS moderni:
```shell
# Testa DNS over QUIC con AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# Testa DNS over HTTP/3 con 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)
```
Usare il flag `--expert` con `dnstraceroute` abiliterà la visualizzazione di suggerimenti
esperti, incluse avvertenze su potenziali dirottamenti del traffico DNS.
# dnseval
`dnseval` è un'utility di ping in blocco che invia query DNS arbitrarie a una lista
specificata di server DNS, permettendoti di confrontare i loro tempi di risposta
simultaneamente.
Puoi usare `dnseval` per valutare i tempi di risposta tra diversi protocolli di trasporto,
inclusi UDP (predefinito), TCP, DoT (DNS over TLS), DoH (DNS over
HTTPS), DoQ (DNS over QUIC) e DoH3 (DNS over HTTP/3) usando rispettivamente i flag `--tcp`,
`--tls`, `--doh`, `--quic` e `--http3`. Queste opzioni di protocollo sono mutuamente esclusive; se ne può specificare solo una per comando.
## Riepilogo del supporto ai protocolli
| Strumento | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|------|-----|-----|-----------|-----|-----|------|
| `dnsping` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| `dnstraceroute` | ✓ | ✓ | - | - | ✓ | ✓ |
| `dnseval` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
*DoQ: DNS over QUIC, DoH3: DNS over 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
```
Puoi anche salvare i risultati in formato JSONL per ulteriori elaborazioni. Ogni riga nel file di output è un oggetto JSON valido contenente i risultati completi della misurazione per un server DNS.
```shell
./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com
```
L'output può essere analizzato riga per riga con strumenti JSON standard come `jq`.
```shell
cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'
```
### Autore
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)
### Licenza
dnsdiag è rilasciato sotto licenza BSD a 2 clausole.