🇺🇸 English | 🇷🇺 Русский | 🇨🇳 中文 | 🇮🇷 فارسی
Высокопроизводительный многопоточный инструмент для тестирования DNS-over-HTTPS (DoH) эндпоинтов с интеллектуальным определением протоколов, настраиваемой фильтрацией и автоматическим управлением списками.
DoH-Tester проверяет DoH‑эндпоинты в большом масштабе, тестируя TCP‑соединение, TLS‑рукопожатие и фактическое разрешение DNS по нескольким протоколам (Wire‑формат GET/POST, JSON API). Инструмент предназначен для сетевых администраторов, защитников приватности и разработчиков, которым необходимо поддерживать надёжное и нецензурируемое DNS‑разрешение в враждебных сетевых средах.
-
✅ Тестирование TCP‑соединения (IPv4 и IPv6)
-
🔐 Проверка TLS‑рукопожатия (опциональный небезопасный режим)
-
🌐 Разрешение DNS через:
- DoH GET (wire‑формат)
- DoH POST (wire‑формат)
- DoH GET (JSON API)
-
⚡ Параллельное тестирование с использованием пулов потоков
-
🧠 Интеллектуальная классификация (WORKING / FLAKY / BLOCKED)
-
📊 Измерение задержки (мс)
-
🧾 Табличный вывод, удобный для чтения
-
🧹 Режим чистого вывода (только URL)
-
📦 Опциональный вывод в JSON (с авто‑таймстампом или пользовательским именем)
-
📁 Настройка через
config.json -
🗂 Опциональная автоматическая очистка рабочих эндпоинтов из исходного файла
| Сценарий | Как помогает DoH-Tester |
|---|---|
| Обход цензуры | Быстро определяет, какие DoH‑резолверы реально работают для обхода DNS‑блокировок и доступа к фильтрованным платформам |
| Поддержка инструментов приватности | Формирование надёжных списков DoH для VPN, прокси, туннелей или конфигураций браузеров |
| Оптимизация производительности | Измерение задержек для выбора самого быстрого резолвера в вашем регионе |
| Аудит сети | Проверка DoH‑инфраструктуры в корпоративных сетях и сетях провайдеров |
| Мониторинг инфраструктуры | Автоматизированные проверки состояния частных DoH‑серверов |
🔓 Обход цензуры (нажмите, чтобы раскрыть)
Подключайтесь к заблокированным платформам, таким как YouTube, Instagram, Twitter/X и новостные сайты, разрешая их домены через зашифрованные HTTPS‑соединения и обходя DNS‑фильтрацию и DNS‑подмену. gfw resist HTTPS proxy
Как это работает:
-
Стандартные DNS‑запросы (UDP порт 53) не шифруются и легко перехватываются межсетевыми экранами
-
DoH инкапсулирует DNS‑запросы в HTTPS‑трафик (порт 443), делая их неотличимыми от обычного веб‑серфинга
-
Полезно в сильно цензурируемых сетях, где:
- Стандартный DNS отравлен (возвращает неверные IP‑адреса)
- Доменные имена блокируются на уровне DNS‑резолвера
- Применяется фильтрация по SNI, но шифрование DNS ещё не заблокировано
Важное примечание: например, если VPN‑сервисы или IP‑адреса Cloudflare заблокированы на IP‑уровне (фаервол отбрасывает пакеты к этим IP), одного DoH недостаточно для восстановления доступа к этим конкретным IP. Однако DoH может помочь вам:
- Найти альтернативные рабочие эндпоинты, которые ещё не заблокированы
- Разрешить доменные имена VPN в IP‑адреса (если заблокирован только DNS, а не сами IP)
- Получить доступ к «domain‑fronted» или альтернативным CDN‑эндпоинтам, которые не заблокированы по IP
🔐 Поддержка инструментов приватности (нажмите, чтобы раскрыть)
Поддерживайте доступ к вашей инфраструктуре приватности, когда стандартные механизмы обнаружения не работают:
-
Доступ к заблокированным VPN‑доменам: если домен вашего VPN‑провайдера (например,
vpn-provider.com) заблокирован через DNS‑подмену, но сами серверы не заблокированы по IP, используйте рабочие DoH‑эндпоинты для получения реальных адресов серверов и сохранения соединения. -
DNS‑туннелирование: используйте проверенные рабочие DoH‑эндпоинты как транспортный уровень для инструментов DNS‑туннелирования, таких как:
- dnstt — TCP‑over‑DNS туннель, работающий через DoH‑резолверы
- DNSCrypt-proxy — может работать через DoH с анонимизированными релеями
- Iodine — IP‑over‑DNS туннелирование (требует UDP, но может использовать DoH для начальной загрузки)
-
Инструменты обхода блокировок на этапе инициализации: многие антицензурные инструменты (Tor‑мосты, Shadowsocks, WireGuard) сначала должны разрешить домен bootstrap‑сервера. Если этот DNS‑запрос отравлен, инструмент не сможет подключиться. Предварительное разрешение через DoH предоставляет корректные IP‑адреса для запуска таких инструментов.
⚡ Оптимизация производительности (нажмите, чтобы раскрыть)
Найдите оптимальный резолвер для ваших сетевых условий:
- Измерение задержек до нескольких DoH‑эндпоинтов одновременно
- Определение географической оптимизации маршрутизации (некоторые провайдеры направляют трафик к ближайшим PoP)
- Сравнение скорости разрешения между wire‑форматом и JSON API
- Создание списков резолверов с учётом местоположения и автоматическим выбором самого быстрого варианта
🏢 Аудит сети (нажмите, чтобы раскрыть)
Проверка доступности и соответствия DoH‑инфраструктуры:
- Тестирование доступности публичных DoH‑резолверов из корпоративных сетей
- Проверка корректной работы частных/внутренних DoH‑серверов
- Обнаружение перехвата TLS (middlebox‑устройств, нарушающих DoH‑соединения)
- Генерация отчётов о соответствии требованиям, показывающих уровень DNS‑приватности в сегментах сети
🔍 Основные возможности тестирования
- Поддержка DoH‑протоколов: DNS wire‑формат по RFC 8484 через GET и POST, а также JSON API (совместимо с Google / Cloudflare)
- Многоуровневая проверка: TCP‑соединение → TLS‑рукопожатие → DoH‑разрешение на уровне приложения
- Интеллектуальное определение протокола: автоматическое тестирование wire‑формата и JSON API при возможности
- Двухстековая сеть: поддержка IPv4 и IPv6 с автоматическим откатом
- Безопасное для провайдера тестирование: выполняет реальное DNS‑разрешение без вызова DNS‑загрязнения или фильтрации
⚡ Производительность и надёжность
- Параллельный движок тестирования: настраиваемый пул потоков для высокоскоростного тестирования эндпоинтов
- Устойчивый механизм повторов: несколько попыток для каждого эндпоинта с настраиваемыми порогами успеха
- Измерение задержек: высокоточное измерение времени каждого запроса в миллисекундах
- Безопасный выход по Ctrl+C: корректное завершение с сохранением частичных результатов
- Интеллектуальная классификация: эндпоинты помечаются как WORKING, FLAKY или BLOCKED
🔐 Безопасность и диагностика
- Проверка TLS: валидация сертификатов и рукопожатия с опциональным небезопасным режимом
- Анализ сертификатов: сбор информации о субъекте TLS‑сертификата и параметрах шифра
- Классификация ошибок: различение TCP‑блокировок, TLS‑перехвата и ошибок DoH на уровне приложения
- Отчёт о разрешённых IP: отображение фактических результатов DNS‑разрешения для проверки
📊 Вывод и отчётность
-
Гибкие форматы вывода:
- Таблицы, удобные для чтения
- Чистые списки URL (удобно для скриптов)
- Машиночитаемый JSON
-
Вывод с таймстампами: автоматические метки времени ISO 8601 (или пользовательские имена файлов)
-
Сортировка результатов: JSON‑вывод сортируется по задержке (самые быстрые — первыми)
-
Фильтрация только рабочих: возможность отображать или экспортировать только рабочие эндпоинты
🗂 Управление списками и файлами
- Режим автоматической очистки: удаление рабочих эндпоинтов из исходного списка
- Защита резервными копиями: создание файлов
.backupперед изменением входных данных - Сохранение комментариев: сохранение комментариев и форматирования в списках эндпоинтов
- Самовосстанавливающиеся списки: помогает поддерживать свежие и надёжные коллекции DoH‑эндпоинтов
🧠 Конфигурация и удобство использования
- Полная настраиваемость: все значения по умолчанию управляются через
config.json - Гибкие таймауты и лимиты: тонкая настройка повторов, потоков и порогов
- Режим чистого вывода: минимальный вывод для автоматизации и shell‑конвейеров
- Python 3.8+ (рекомендуется)
git clone https://github.com/BLACKGAMER1221/doh_tester.git
cd doh_testerВы также можете скачать Windows-exe файл со страницы релизов
pip install requests dnspythonpython test_doh.py --helppython test_doh.py <домен> [параметры]| Аргумент | По умолчанию | Описание |
|---|---|---|
domain |
(обязательно) | Домен для разрешения (например, example.com) |
--config |
config.json |
Путь к файлу конфигурации |
--doh-file |
doh.txt |
Путь к файлу со списком DoH‑URL |
--timeout |
8.0 |
Таймаут на операцию в секундах |
--workers |
20 |
Количество параллельных потоков |
--attempts |
3 |
Количество попыток DNS‑запроса на эндпоинт |
--min-success |
2 |
Минимум успешных ответов для статуса WORKING |
--insecure |
False |
Пропустить проверку TLS‑сертификатов |
--output |
(с таймстампом) | Путь к выходному файлу |
--working-only |
False |
Показывать только WORKING‑результаты |
--no-working-only |
- | Показывать все результаты (переопределяет конфиг) |
--clean-output |
False |
Выводить только рабочие URL (по одному в строке) |
--json-output |
False |
Записать JSON‑вывод (авто‑таймстамп или указанный путь) |
python test_doh.py example.compython test_doh.py example.com --working-onlypython test_doh.py example.com --clean-outputpython test_doh.py example.com \
--doh-file my_doh_list.txt \
--timeout 10 \
--workers 30 \
--attempts 5 \
--min-success 3# JSON‑файл с авто‑таймстампом
python test_doh.py example.com --json-output
# Указание имени JSON‑файла
python test_doh.py example.com --json-output results.jsonpython test_doh.py internal.domain --insecurepython test_doh.py example.com --working-only --clean-output --json-output --output results.txtИнструмент использует JSON‑файл конфигурации (config.json по умолчанию) для управления всеми параметрами по умолчанию.
{
"doh_file": "doh.txt",
"output_file": "",
"timeout": 8.0,
"workers": 20,
"attempts": 3,
"min_success": 2,
"remove_working_from_doh_file": false,
"working_only": false,
"json_output": false,
"show_headers": true,
"show_status": true,
"show_doh_url": true,
"show_host": true,
"show_doh_ip": true,
"show_target_ip": false,
"show_ping": true
}| Параметр | Тип | Описание |
|---|---|---|
doh_file |
string | Путь к файлу со списком DoH‑URL |
output_file |
string | Файл вывода по умолчанию (пусто = с таймстампом) |
| Параметр | Тип | Описание |
|---|---|---|
timeout |
float | Таймаут операции в секундах |
workers |
integer | Количество параллельных потоков |
attempts |
integer | Попытки запроса на эндпоинт |
min_success |
integer | Минимум успехов для статуса WORKING |
| Параметр | Тип | Описание |
|---|---|---|
remove_working_from_doh_file |
boolean | Удалять WORKING‑эндпоинты из исходного файла |
working_only |
boolean | По умолчанию показывать только WORKING |
| Параметр | Тип | Описание |
|---|---|---|
json_output |
boolean/string | false (без JSON), true/"auto" (с таймстампом) или имя файла |
| Параметр | Тип | Описание |
|---|---|---|
show_headers |
boolean | Показывать заголовки столбцов |
show_status |
boolean | Показывать столбец STATUS |
show_doh_url |
boolean | Показывать столбец URL |
show_host |
boolean | Показывать столбец HOST |
show_doh_ip |
boolean | Показывать столбец DOH_IP |
show_target_ip |
boolean | Показывать столбец TARGET_IP |
show_ping |
boolean | Показывать столбец PING_MS |
Файл со списком DoH‑URL (doh.txt по умолчанию) поддерживает комментарии и пустые строки:
# Публичные DoH‑серверы
https://cloudflare-dns.com/dns-query
https://dns.google/dns-query
https://dns.quad9.net/dns-query
# Частные / внутренние
https://doh.internal.company/dns-query
# Generated: 2026-02-4 08:50:45
STATUS URL HOST DOH_IP PING_MS
------------------------------------------------------------------------------------------------
WORKING https://cloudflare-dns.com/dns-query cloudflare-dns.com 104.16.249.249 45.2
WORKING https://dns.google/dns-query dns.google 8.8.8.8 32.1
BLOCKED https://blocked.doh.server/dns-query blocked.server - -
FLAKY https://unreliable.doh/dns-query unreliable.doh 192.0.2.1 120.5
При использовании --clean-output:
https://cloudflare-dns.com/dns-query
https://dns.google/dns-query
[
{
"status": "WORKING",
"url": "https://cloudflare-dns.com/dns-query",
"host": "cloudflare-dns.com",
"port": 443,
"tcp_ok": true,
"tls_ok": true,
"tls_info": "cipher=('TLS_AES_256_GCM_SHA384', 'TLSv1.3', 256)...",
"successes": 3,
"attempts": 3,
"target_ips": "93.184.216.34",
"doh_server_ip": "104.16.249.249",
"method": "GET-wire",
"latency_ms": "45.2",
"notes": ""
}
]| Статус | Значение |
|---|---|
| WORKING | Эндпоинт прошёл все тесты (TCP, TLS и не менее min_success DNS‑запросов) |
| FLAKY | Эндпоинт работает частично (часть DNS‑запросов успешна, но меньше min_success) |
| BLOCKED | Эндпоинт не работает (ошибка TCP/TLS или нет успешных DNS‑запросов) |
-
Подбирайте количество потоков под ваше соединение:
- Медленное/нестабильное:
--workers 5 - Быстрое/стабильное:
--workers 50
- Медленное/нестабильное:
-
Увеличивайте таймаут для медленных сетей:
python test_doh.py example.com --timeout 15
-
Уменьшайте число попыток для быстрой проверки:
python test_doh.py example.com --attempts 1 --min-success 1
-
Используйте больше попыток для продакшн‑проверок:
python test_doh.py example.com --attempts 5 --min-success 4
-
Тестируйте несколько доменов:
for domain in example.com google.com cloudflare.com; do python test_doh.py $domain --json-output --output ${domain}.txt done
-
Cron‑задача для мониторинга:
# Запуск ежедневно в 3:00 0 3 * * * cd /path/to/test_doh && python test_doh.py monitor.domain --json-output >> cron.log 2>&1
-
Скрипт для генерации чистых списков:
#!/bin/bash python test_doh.py example.com --clean-output --working-only --output working_doh.txt --json-output doh_results.json
- Все эндпоинты BLOCKED: проверьте, не блокируется ли DoH вашим провайдером или фаерволом
- Ошибки TLS: попробуйте
--insecureдля самоподписанных сертификатов - Таймауты: увеличьте
--timeoutили уменьшите--workers - Нет результатов: убедитесь, что файл
doh.txtсодержит корректные URL
- Флаг
--insecureотключает проверку TLS‑сертификатов. Используйте его только для тестирования частных серверов. - DoH‑запросы шифруются, но конечный сервер всё равно видит ваши DNS‑запросы.
- Рассмотрите тестирование нескольких DoH‑провайдеров для избыточности.
Лицензия MIT — см. файл LICENSE для подробностей.
Вклад приветствуется! Не стесняйтесь открывать issues или отправлять pull‑requests.