
dnsdiag v2.9.4
Conjunto de ferramentas de medição, solução de problemas e auditoria de segurança de DNS
Conjunto de Ferramentas para Medição, Diagnóstico e Auditoria de Segurança de DNS
Você já se perguntou se seu ISP está interceptando seu tráfego DNS? Notou algum comportamento incomum nas respostas DNS, ou foi redirecionado para o endereço errado e suspeitou que algo estivesse errado com seu DNS? Oferecemos um conjunto de ferramentas para realizar auditorias básicas em suas consultas e respostas DNS, ajudando você a garantir que seu DNS esteja funcionando conforme o esperado.
Com o dnsping, você pode medir o tempo de resposta de qualquer servidor DNS para consultas arbitrárias. Similar ao utilitário ping tradicional, o dnsping oferece funcionalidade comparável para requisições DNS, ajudando a monitorar a capacidade de resposta do servidor.
Você também pode rastrear a rota da sua requisição DNS até seu destino usando o dnstraceroute, verificando se ela não está sendo redirecionada ou interceptada. Ao comparar consultas DNS enviadas ao mesmo servidor, o dnstraceroute permite observar quaisquer diferenças nos caminhos percorridos, alertando-o sobre possíveis problemas.
O dnseval avalia múltiplos resolvedores DNS para ajudá-lo a escolher o melhor resolvedor DNS para sua rede. Embora seja recomendado usar seu próprio resolvedor DNS para evitar dependência de resolvedores terceiros, o dnseval pode auxiliar na seleção do resolvedor DNS ideal quando necessário. Ele permite comparar servidores DNS com base em desempenho (latência) e confiabilidade (perda de pacotes), fornecendo uma visão abrangente para tomada de decisões informadas.
Instalação
Existem várias formas de usar este conjunto de ferramentas, embora recomendamos executá-lo diretamente a partir do código fonte para maior flexibilidade e controle.
Código Fonte
- Clone o repositório git e instale as dependências:
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
- Alternativamente, você pode instalar o pacote usando pip:
pip3 install dnsdiag
Usando uv (Recomendado)
uv é um gerenciador de pacotes Python rápido que pode executar ferramentas diretamente sem instalação:
# Executar dnsping diretamente sem instalação
uvx --from dnsdiag dnsping google.com
# Executar com opções específicas
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com
# Executar dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com
# Executar dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com
Para instalar o dnsdiag permanentemente:
# Instalar ferramentas dnsdiag
uv tool install dnsdiag
# Atualizar para a versão mais recente
uv tool upgrade dnsdiag
Pacote Binário
De tempos em tempos, pacotes binários serão lançados para Windows, Mac OS X e Linux. Você pode obter a versão mais recente na página de releases.
Plataformas Suportadas
Binários pré-compilados estão disponíveis para:
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64)
Windows ARM64 não é suportado atualmente devido a dependências de compilação que exigem toolchains de compilação nativos não prontamente disponíveis. Se você estiver usando Windows em ARM, pode executar o dnsdiag usando o Subsistema Windows para Linux (WSL2) ou instalar diretamente a partir do código fonte.
Docker
Se preferir não instalar o dnsdiag em sua máquina local, você pode usar a imagem Docker para executar as ferramentas em um ambiente containerizado. Por exemplo:
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
dnsping
O dnsping permite que você "pingue" um resolvedor DNS enviando uma consulta DNS arbitrária várias vezes. Para uma lista completa de opções de linha de comando suportadas, use --help. Aqui estão algumas flags principais:
- Use
--tcp,--tls,--doh,--quicou--http3para selecionar o protocolo de transporte (o padrão é UDP). Essas opções são mutuamente exclusivas; apenas um protocolo pode ser especificado por comando. - Use
--flagspara exibir flags de resposta, incluindo flags EDNS, para cada resposta. - Use
--dnssecpara solicitar validação DNSSEC, se disponível. - Mensagens de Erro DNS Estendido (RFC 8914) são exibidas automaticamente quando presentes.
- Use
--nsidpara exibir o Identificador do Servidor de Nomes (NSID) se disponível (RFC 5001). - Use
--ecspara incluir informações de Sub-rede do Cliente EDNS para otimização de roteamento geográfico. - Use
--cookiepara exibir cookies DNS (RFC 7873) quando presentes nas respostas.
./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
O dnsping também fornece estatísticas como tempos mínimo, máximo e médio de resposta, juntamente com jitter (desvio padrão) e perda de pacotes.
Aqui estão alguns casos de uso interessantes para o dnsping:
- Comparar tempos de resposta entre diferentes protocolos de transporte (ex.: UDP vs. DoH).
- Avaliar a confiabilidade do seu servidor DNS medindo jitter e perda de pacotes.
- Medir tempos de resposta com DNSSEC ativado usando a flag
--dnssec. - Testar o comportamento do EDNS Client Subnet para respostas com reconhecimento geográfico:
./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
- Identificar servidores DNS usando a opção 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
- Testar cookies DNS para segurança aprimorada e otimização de 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
Interpretando Flags Relacionadas a DNSSEC e Segurança
Ao usar --dnssec e --flags, o dnsping expõe campos do protocolo DNS que são diretamente relevantes para a validação de segurança DNS. Esses valores indicam se um resolvedor é capaz de validar DNSSEC e se uma resposta foi verificada com sucesso.
Flags comuns:
-
DO (DNSSEC OK)
Indica que o cliente está solicitando registros relacionados a DNSSEC. Sua presença mostra que o resolvedor suporta consultas DNSSEC. -
AD (Authenticated Data)
Definido por resolvedores validadores quando a resposta foi criptograficamente validada usando DNSSEC. É um sinal forte de que a validação DNSSEC está ativa e bem-sucedida.
Padrões típicos:
| Resultado | Significado |
|---|---|
NOERROR com flag AD | Validação DNSSEC bem-sucedida |
SERVFAIL com flag DO | Falha na validação DNSSEC (geralmente devido a assinaturas quebradas ou configuração incorreta) |
Nenhum flag AD presente | O resolvedor não está realizando validação DNSSEC |
Os Erros DNS Estendidos (EDE, RFC 8914) fornecem informações diagnósticas adicionais quando a validação DNSSEC falha. Por exemplo:
- EDE:10 – DNSSEC Inválido (dados DNSSEC inválidos ou quebrados)
- EDE:6 – Assinatura DNSSEC Expirada
- EDE:7 – Assinatura DNSSEC Ainda Não Válida
Esses indicadores tornam o dnsping útil não apenas para testes de desempenho, mas também para validar se os resolvedores aplicam corretamente o DNSSEC e para diagnosticar problemas de implantação do DNSSEC.
dnstraceroute
O dnstraceroute é um utilitário que rastreia o caminho das suas requisições DNS até o destino. Você pode querer comparar isso com o traceroute real da sua rede para garantir que seu tráfego DNS não está sendo roteado por caminhos indesejados.
O dnstraceroute suporta múltiplos protocolos de transporte (mutuamente exclusivos):
- UDP (padrão) - Consultas DNS tradicionais
- TCP (
--tcp) - DNS sobre TCP - DoQ (
--quic) - DNS sobre QUIC (suportado pelo AdGuard DNS) - DoH3 (
--http3) - DNS sobre HTTP/3 (suportado pelo Google DNS e Cloudflare)
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com
Você também pode testar protocolos DNS modernos:
# Testar DNS sobre QUIC com AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# Testar DNS sobre HTTP/3 com 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)
Usar a flag --expert com o dnstraceroute ativará a exibição de dicas de especialista, incluindo avisos sobre possível sequestro de tráfego DNS.
dnseval
O dnseval é um utilitário de ping em massa que envia consultas DNS arbitrárias para uma lista especificada de servidores DNS, permitindo comparar seus tempos de resposta simultaneamente.
Você pode usar o dnseval para avaliar tempos de resposta em diferentes protocolos de transporte, incluindo UDP (padrão), TCP, DoT (DNS sobre TLS), DoH (DNS sobre HTTPS), DoQ (DNS sobre QUIC) e DoH3 (DNS sobre HTTP/3) usando as flags --tcp, --tls, --doh, --quic e --http3, respectivamente. Essas opções de protocolo são mutuamente exclusivas; apenas uma pode ser especificada por comando.
Resumo de Suporte a Protocolos
| Ferramenta | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|---|---|---|---|---|---|---|
dnsping | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
dnstraceroute | ✓ | ✓ | - | - | ✓ | ✓ |
dnseval | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
DoQ: DNS sobre QUIC, DoH3: DNS sobre 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
Você também pode salvar os resultados no formato JSONL para processamento posterior. Cada linha no arquivo de saída é um objeto JSON válido contendo os resultados completos da medição para um servidor DNS.
./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com
A saída pode ser analisada linha por linha com ferramentas JSON padrão, como jq.
cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'
Autor
Babak Farrokhi
- github: github.com/farrokhi
- website: farrokhi.net
- mastodon: @[email protected]
- twitter: @farrokhi
Licença
O dnsdiag é distribuído sob uma licença BSD de 2 cláusulas.