
Набор инструментов для измерения DNS, устранения неполадок и аудита безопасности
Вы когда-нибудь задумывались, не перехватывает ли ваш провайдер ваш DNS-трафик? Замечали ли вы необычное поведение в своих DNS-ответах или были перенаправлены на неправильный адрес и подозревали, что с вашим DNS что-то не так? Мы предлагаем набор инструментов для базового аудита ваших DNS-запросов и ответов, помогая вам убедиться, что ваш DNS работает как ожидается.
С помощью dnsping вы можете измерить время ответа любого DNS-сервера для произвольных запросов. Подобно обычной утилите ping, dnsping предоставляет аналогичную функциональность для DNS-запросов, помогая отслеживать отзывчивость сервера.
Вы также можете проследить маршрут вашего DNS-запроса к его месту назначения с помощью dnstraceroute, проверяя, не перенаправляется ли он и не перехватывается ли он. Сравнивая DNS-запросы, отправленные на один и тот же сервер, dnstraceroute позволяет вам заметить любые различия в пройденных путях, предупреждая о возможных проблемах.
dnseval оценивает несколько DNS-резолверов, помогая вам выбрать лучший DNS-резолвер для вашей сети. Хотя рекомендуется использовать собственный DNS-резолвер, чтобы избежать зависимости от сторонних DNS-резолверов, dnseval может помочь в выборе оптимального DNS-резолвера при необходимости. Он позволяет сравнивать DNS-серверы на основе производительности (задержки) и надежности (потери пакетов), предоставляя всестороннее представление для принятия обоснованных решений.
Существует несколько способов использования этого набора инструментов, хотя мы рекомендуем запускать его непосредственно из исходного кода для оптимальной гибкости и контроля.
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
pip3 install dnsdiag
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. Вы можете загрузить последний релиз на странице релизов.
Предварительно собранные бинарные файлы доступны для:
Windows ARM64 в настоящее время не поддерживается из-за зависимостей сборки, требующих нативных цепочек инструментов компиляции, которые не всегда доступны. Если вы используете Windows на ARM, вы можете запустить dnsdiag с помощью Windows Subsystem for Linux (WSL2) или установить напрямую из исходного кода.
Если вы предпочитаете не устанавливать dnsdiag на локальную машину, вы можете использовать образ Docker для запуска инструментов в контейнеризированной среде. Например:
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
dnsping позволяет вам «пинговать» DNS-резолвер, отправляя произвольный DNS-запрос несколько раз. Полный список поддерживаемых параметров командной строки можно получить с помощью --help. Вот несколько ключевых флагов:
--tcp, --tls, --doh, --quic или --http3 для выбора транспортного протокола (по умолчанию UDP). Эти параметры взаимоисключающие; можно указать только один протокол за команду.--flags для отображения флагов ответа, включая флаги EDNS, для каждого ответа.--dnssec для запроса проверки DNSSEC, если она доступна.--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:
--dnssec../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
./dnsping.py -c 2 --nsid -s 8.8.8.8 google.com