Назад к обновлениям
New releaseJul 21, 2026

dnsdiag v2.9.4

Набор инструментов для измерения DNS, устранения неполадок и аудита безопасности

Поделиться

PyPI PyPI Downloads Downloads PyPI Docker Pulls GitHub stars

Набор инструментов для измерения DNS, устранения неполадок и аудита безопасности

Вы когда-нибудь задумывались, не перехватывает ли ваш провайдер ваш DNS-трафик? Замечали ли вы необычное поведение в своих DNS-ответах или были перенаправлены на неправильный адрес и подозревали, что с вашим DNS что-то не так? Мы предлагаем набор инструментов для базового аудита ваших DNS-запросов и ответов, помогая вам убедиться, что ваш DNS работает как ожидается.

С помощью dnsping вы можете измерить время ответа любого DNS-сервера для произвольных запросов. Подобно обычной утилите ping, dnsping предоставляет аналогичную функциональность для DNS-запросов, помогая отслеживать отзывчивость сервера.

Вы также можете проследить маршрут вашего DNS-запроса к его месту назначения с помощью dnstraceroute, проверяя, не перенаправляется ли он и не перехватывается ли он. Сравнивая DNS-запросы, отправленные на один и тот же сервер, dnstraceroute позволяет вам заметить любые различия в пройденных путях, предупреждая о возможных проблемах.

dnseval оценивает несколько DNS-резолверов, помогая вам выбрать лучший DNS-резолвер для вашей сети. Хотя рекомендуется использовать собственный DNS-резолвер, чтобы избежать зависимости от сторонних DNS-резолверов, dnseval может помочь в выборе оптимального DNS-резолвера при необходимости. Он позволяет сравнивать DNS-серверы на основе производительности (задержки) и надежности (потери пакетов), предоставляя всестороннее представление для принятия обоснованных решений.

Установка

Существует несколько способов использования этого набора инструментов, хотя мы рекомендуем запускать его непосредственно из исходного кода для оптимальной гибкости и контроля.

Исходный код

  1. Клонируйте git-репозиторий и установите зависимости:
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
  1. Вы также можете установить пакет с помощью 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:10DNSSEC Bogus (недействительные или поврежденные данные DNSSEC)
  • EDE:6DNSSEC Signature Expired (срок действия подписи DNSSEC истек)
  • EDE:7DNSSEC 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 соответственно. Эти параметры протокола взаимоисключающие; можно указать только один за команду.

Сводка поддержки протоколов

ИнструментUDPTCPTLS (DoT)DoHDoQDoH3
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

Лицензия

dnsdiag распространяется под лицензией BSD с 2 пунктами.

Категории