
dnsdiag v2.9.4
Набор инструментов для измерения DNS, устранения неполадок и аудита безопасности
Набор инструментов для измерения DNS, устранения неполадок и аудита безопасности
Вы когда-нибудь задумывались, не перехватывает ли ваш провайдер ваш DNS-трафик? Замечали ли вы необычное поведение в своих DNS-ответах или были перенаправлены на неправильный адрес и подозревали, что с вашим DNS что-то не так? Мы предлагаем набор инструментов для базового аудита ваших DNS-запросов и ответов, помогая вам убедиться, что ваш DNS работает как ожидается.
С помощью dnsping вы можете измерить время ответа любого DNS-сервера для произвольных запросов. Подобно обычной утилите ping, dnsping предоставляет аналогичную функциональность для DNS-запросов, помогая отслеживать отзывчивость сервера.
Вы также можете проследить маршрут вашего DNS-запроса к его месту назначения с помощью dnstraceroute, проверяя, не перенаправляется ли он и не перехватывается ли он. Сравнивая DNS-запросы, отправленные на один и тот же сервер, dnstraceroute позволяет вам заметить любые различия в пройденных путях, предупреждая о возможных проблемах.
dnseval оценивает несколько DNS-резолверов, помогая вам выбрать лучший DNS-резолвер для вашей сети. Хотя рекомендуется использовать собственный DNS-резолвер, чтобы избежать зависимости от сторонних DNS-резолверов, dnseval может помочь в выборе оптимального DNS-резолвера при необходимости. Он позволяет сравнивать DNS-серверы на основе производительности (задержки) и надежности (потери пакетов), предоставляя всестороннее представление для принятия обоснованных решений.
Установка
Существует несколько способов использования этого набора инструментов, хотя мы рекомендуем запускать его непосредственно из исходного кода для оптимальной гибкости и контроля.
Исходный код
- Клонируйте git-репозиторий и установите зависимости:
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
- Вы также можете установить пакет с помощью pip:
pip3 install dnsdiag
Использование uv (рекомендуется)
uv — это быстрый менеджер пакетов Python, который позволяет запускать инструменты напрямую без установки:
# Запуск dnsping напрямую без установки
uvx --from dnsdiag dnsping google.com
# Запуск с определенными параметрами
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com
# Запуск dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com
# Запуск dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com
Для постоянной установки dnsdiag:
# Установка инструментов dnsdiag
uv tool install dnsdiag
# Обновление до последней версии
uv tool upgrade dnsdiag
Бинарные пакеты
Время от времени будут выпускаться бинарные пакеты для Windows, Mac OS X и Linux. Вы можете загрузить последний релиз на странице релизов.
Поддерживаемые платформы
Предварительно собранные бинарные файлы доступны для:
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64)
Windows ARM64 в настоящее время не поддерживается из-за зависимостей сборки, требующих нативных цепочек инструментов компиляции, которые не всегда доступны. Если вы используете Windows на ARM, вы можете запустить dnsdiag с помощью Windows Subsystem for Linux (WSL2) или установить напрямую из исходного кода.
Docker
Если вы предпочитаете не устанавливать dnsdiag на локальную машину, вы можете использовать образ Docker для запуска инструментов в контейнеризированной среде. Например:
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
dnsping
dnsping позволяет вам «пинговать» DNS-резолвер, отправляя произвольный DNS-запрос несколько раз. Полный список поддерживаемых параметров командной строки можно получить с помощью --help. Вот несколько ключевых флагов:
- Используйте
--tcp,--tls,--doh,--quicили--http3для выбора транспортного протокола (по умолчанию UDP). Эти параметры взаимоисключающие; можно указать только один протокол за команду. - Используйте
--flagsдля отображения флагов ответа, включая флаги EDNS, для каждого ответа. - Используйте
--dnssecдля запроса проверки DNSSEC, если она доступна. - Расширенные сообщения об ошибках DNS (RFC 8914) отображаются автоматически при их наличии.
- Используйте
--nsidдля отображения идентификатора сервера имен (NSID), если он доступен (RFC 5001). - Используйте
--ecsдля включения информации EDNS Client Subnet для оптимизации географической маршрутизации. - Используйте
--cookieдля отображения DNS-куки (RFC 7873), если они присутствуют в ответах.
./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 также предоставляет статистику, такую как минимальное, максимальное и среднее время ответа, а также джиттер (стандартное отклонение) и потерю пакетов.
Вот несколько интересных вариантов использования dnsping:
- Сравнение времени ответа для разных транспортных протоколов (например, UDP vs DoH).
- Оценка надежности вашего DNS-сервера с помощью измерения джиттера и потери пакетов.
- Измерение времени ответа с включенным DNSSEC с помощью флага
--dnssec. - Тестирование поведения EDNS Client Subnet для ответов, учитывающих географическое положение:
./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
- Определение DNS-серверов с помощью опции 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
- Тестирование DNS-куки для повышения безопасности и оптимизации кэша:
./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
Интерпретация DNSSEC и связанных с безопасностью флагов
При использовании --dnssec и --flags, dnsping отображает поля протокола DNS, которые напрямую связаны с проверкой безопасности DNS. Эти значения указывают, способен ли резолвер проверять DNSSEC и был ли ответ успешно подтвержден.
Общие флаги:
-
DO (DNSSEC OK)
Указывает, что клиент запрашивает записи, связанные с DNSSEC. Его наличие показывает, что резолвер поддерживает запросы DNSSEC. -
AD (Authenticated Data)
Устанавливается проверяющими резолверами, когда ответ был криптографически подтвержден с помощью DNSSEC. Это сильный сигнал того, что проверка DNSSEC активна и успешна.
Типичные шаблоны:
| Результат | Значение |
|---|---|
NOERROR с флагом AD | Проверка DNSSEC прошла успешно |
SERVFAIL с флагом DO | Проверка DNSSEC не удалась (часто из-за поврежденных подписей или неправильной конфигурации) |
Отсутствие флага AD | Резолвер не выполняет проверку DNSSEC |
Расширенные ошибки DNS (EDE, RFC 8914) предоставляют дополнительную диагностическую информацию, когда проверка DNSSEC не удается. Например:
- EDE:10 – DNSSEC Bogus (недействительные или поврежденные данные DNSSEC)
- EDE:6 – DNSSEC Signature Expired (срок действия подписи DNSSEC истек)
- EDE:7 – DNSSEC Signature Not Yet Valid (подпись DNSSEC еще не действительна)
Эти индикаторы делают dnsping полезным не только для тестирования производительности, но и для проверки того, правильно ли резолверы применяют DNSSEC, и для диагностики проблем развертывания DNSSEC.
dnstraceroute
dnstraceroute — это утилита, которая отслеживает путь ваших DNS-запросов к их месту назначения. Вы можете захотеть сравнить это с фактической трассировкой вашей сети, чтобы убедиться, что ваш DNS-трафик не направляется через нежелательные пути.
dnstraceroute поддерживает множество транспортных протоколов (взаимоисключающие):
- UDP (по умолчанию) — традиционные DNS-запросы
- TCP (
--tcp) — DNS через TCP - DoQ (
--quic) — DNS через QUIC (поддерживается AdGuard DNS) - DoH3 (
--http3) — DNS через HTTP/3 (поддерживается Google DNS и Cloudflare)
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com
Вы также можете протестировать современные DNS-протоколы:
# Тестирование DNS через QUIC с AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# Тестирование DNS через HTTP/3 с 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)
Использование флага --expert с dnstraceroute включает отображение экспертных подсказок, включая предупреждения о возможном перехвате DNS-трафика.
dnseval
dnseval — это утилита массового пинга, которая отправляет произвольные DNS-запросы к указанному списку DNS-серверов, позволяя сравнивать их время ответа одновременно.
Вы можете использовать dnseval для оценки времени ответа для различных транспортных протоколов, включая UDP (по умолчанию), TCP, DoT (DNS через TLS), DoH (DNS через HTTPS), DoQ (DNS через QUIC) и DoH3 (DNS через HTTP/3), используя флаги --tcp, --tls, --doh, --quic и --http3 соответственно. Эти параметры протокола взаимоисключающие; можно указать только один за команду.
Сводка поддержки протоколов
| Инструмент | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|---|---|---|---|---|---|---|
dnsping | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
dnstraceroute | ✓ | ✓ | - | - | ✓ | ✓ |
dnseval | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
DoQ: DNS через QUIC, DoH3: DNS через 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
Вы также можете сохранять результаты в формате JSONL для дальнейшей обработки. Каждая строка в выходном файле представляет собой валидный JSON-объект, содержащий полные результаты измерений для одного DNS-сервера.
./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com
Вывод можно построчно анализировать с помощью стандартных инструментов JSON, таких как jq.
cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'
Автор
Babak Farrokhi
- github: github.com/farrokhi
- website: farrokhi.net
- mastodon: @[email protected]
- twitter: @farrokhi
Лицензия
dnsdiag распространяется под лицензией BSD с 2 пунктами.