CLI-инструмент для тестирования DPI-блокировок: домены, TLS, TCP 16-20KB, DNS

Какую ошибку? Какая ОС?
Проверил .exe v2.1.0, на win11 успешно config переопределяется

win10 [!] Ошибка при загрузке внешнего config.py: Parser stack overflowed - Python source too complex to parse
Нажмите любую клавишу для выхода…

в итоге так и было сделано

Не знаю, по какому принципу сейчас добавляют таргеты в дефолтный список, но расскажу про свой случай -возможно, релевантно. Столкнулась с тем, что Steam (AS заблокирована, но домен явно в белом списке) при смене DNS с 9.9.9.9 на 8.8.8.8 перестал грузиться через браузер дальше шапки сайта.

Подробнее

Ранее у меня стоял Asus Мерлин с quad9 DoT, заменила на OpenWRT-роутер, где был установлен DoH гугла. Сразу напрягло, что еще до настройки каких-либо обходов на новом роутере главная стима в браузере дальше шапки не грузилась (в мобильном аппе не грузилась вообще, а десктопный клиент еще и при рестарте стал крашиться на двух разных машинах). Чего на старом роутере со стимом никогда не происходило.

Curl тоже намекал на 16кб:

$ curl -L -o /dev/null -w “downloaded: %{size_download} bytes\n” ``https://store.steampowered.com/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 13814 0 13814 0 0 22 0 --:–:-- 0:10:14 --:–:-- 0
curl: (56) OpenSSL SSL_read: Connection timed out, errno 110
downloaded: 13814 bytes

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

nslookup store.steampowered.com 8.8.8.8 => 23.197.161.221
nslookup store.steampowered.com 77.88.8.8 => 184.30.24.74
nslookup store.steampowered.com 9.9.9.9 => 2.23.89.208

Прописала 9.9.9.9 на клиенте - главная стима стала грузиться, и curl моментом “downloaded: 817319 bytes”.

custom tcp16.json
[
{“id”: “STEAM-AK-01”, “asn”: “16625”, “provider”: “Akamai Steam (served by Google DNS)”, “ip”: “23.197.161.221”, “port”: 443, “sni”: “``store.steampowered.com``”},
{“id”: “STEAM-AK-02”, “asn”: “16625”, “provider”: “Akamai Steam (served by Yandex DNS)”, “ip”: “184.30.24.74”, “port”: 443, “sni”: “``store.steampowered.com``”},
{“id”: “STEAM-AK-03”, “asn”: “16625”, “provider”: “Akamai Steam (served by Quad9 DNS)”, “ip”: “2.23.89.208”, “port”: 443, “sni”: “``store.steampowered.com``”},
{“id”: “STEAM-AK-01-NS”, “asn”: “16625”, “provider”: “Akamai Steam (served by Google DNS) no SNI”, “ip”: “23.197.161.221”, “port”: 443},
{“id”: “STEAM-AK-02-NS”, “asn”: “16625”, “provider”: “Akamai Steam (served by Yandex DNS) no SNI”, “ip”: “184.30.24.74”, “port”: 443},
{“id”: “STEAM-AK-03-NS”, “asn”: “16625”, “provider”: “Akamai Steam (served by Quad9 DNS) no SNI”, “ip”: “2.23.89.208”, “port”: 443}
]

Проверка TCP 16-20KB блокировки  Целей: 6 | timeout: 8.0s

┃ ID             ┃ ASN     ┃ Провайдер                                  ┃ Alive ┃  Статус  ┃ 

│ STEAM-AK-01    │ AS16625 │ Akamai Steam (served by Google DoH)        │  Да   │ DETECTED │ 

Read Timeout at 40KB │

│ STEAM-AK-02    │ AS16625 │ Akamai Steam (served by Yandex DNS)        │  Да   │    OK    │                      │
│ STEAM-AK-03    │ AS16625 │ Akamai Steam (served by Quad9 DNS)         │  Да   │    OK    │                      │
│ STEAM-AK-03-NS │ AS16625 │ Akamai Steam (served by Quad9 DNS) no SNI  │  Да   │    OK    │                      │
│ STEAM-AK-02-NS │ AS16625 │ Akamai Steam (served by Yandex DNS) no SNI │  Да   │    OK    │                      │
│ STEAM-AK-01-NS │ AS16625 │ Akamai Steam (served by Google DoH) no SNI │  Да   │    OK    │                      │

То есть из трех DNS лишь один выдает IP, который под 16кб блоком при использовании SNI? Это меня совсем запутало, ведь они все на одной AS. Я думала, если домен в белом списке, то важен не IP, а пара домен+AS. Или по подсетям тоже практикуют разделение? А главное - почему так вообще происходит? А то не ясно, намеренная это блокировка и пора мысленно отложить сайт в списки на обходы, либо же случайная и можно пока остановиться на смене DNS?

У меня как раз встал выбор публичного DoH в новый роутер, по какому их принципу теперь выбирают? Раньше я бенчмарки всякие делала, но теперь вот появился новый критерий.

Все это навело на следующие мысли - а много ли таких крупных сервисов на CDN, которые на разных DNS разные IP подают, чтобы при этом еще часть была под блоком, а часть - нет?

Не знаю, насколько такое массово и актуально, но появилась идея такого теста - сравнивать несколько публичных DNS по списку доменов, использующих CDN. И по дефолту наполнить его не только проблемными, но и просто популярными, которые случайно могли попасть под блок. И в результате - список публичных DNS с сортировкой по % успешности (бонусом будет дополнительный скоринг в духе BrainicHQ/DoHSpeedTest).

Релиз dpi-detector v3.0.1

Прокси

  • Добавлена поддержка прокси http/socks5 - PROXY_URL в конфиге
  • По умолчанию программа теперь не использует системный прокси

Запуск с параметрами

  • Добавена возможность запуска с параметрами. Подробнее в README

Конфиг

  • Новый config.yml формат
  • Удалены некоторые конфиги

Поиск SNI

  • Переработана проверка с реалтайма обновлением на постепенный вывод

Обновление сайтов/эндпоинтов

  • Удалены “сомнительные” домены из DNS проверки
  • Удалено 2 умерших tcp16 эндпоинта

UI/UX

  • Легенда вынесена в отдельный пункт меню и больше не появляется после тестов

Новые зависимости

  • httpx[socks]>=0.28.1
  • PyYAML>=6.0.3

Full Changelog: Comparing v2.1.0...v3.0.0 · Runnin4ik/dpi-detector · GitHub

AS16625 полностью под tcp16 блокировкой, не считая каких-то единичных IP

store.steampowered.com является белым SNI для этой AS и позволяет обходить блокировку IP даже не связанных со стимом.

Протестил эти IP на однострочном тестере, без SNI или с левым SNI дропает соединение на 2м запросе. Если указать store.steampowered.com то все работает норм. Через dpi-detector показывает ОК даже с левыми SNI, пока не понимаю почему.

Как минимум мне попадалась одна AS, где половина подсетей были под блокировкой, а половина нет. Либо внутри подсети половина IP под блокировкой а другая нет.

Посмотрим, но пока выглядит как какая-то нишевая проблема.

Видел в соседних темах инфу, что с ipv6 могут не работать 16kb блокировки. Есть смысл в тестер добавлять ipv4 и ipv6 для 16кб теста?

На МГТС как минимум действует 16КБ блок на сайты, которые хостятся на Cloudflare с IPv6-адресом.

прогонял по всем пунктам, подбор sni затянулся, решил прервать, так как уже было достаточно, но лог в текст с тем что было не сохранился, если есть желание можно пофиксить…

tcp16.json [
{“id”: “ME-01”, “asn”: “32934”, “provider”: “Meta”, “ip”: “157.240.205.60”, “port”: 443},
{“id”: “ME-01”, “asn”: “32934”, “provider”: “Meta”, “ip”: “57.144.249.32”, “port”: 443},
{“id”: “ME-01”, “asn”: “32934”, “provider”: “Meta”, “ip”: “31.13.72.52”, “port”: 443}
]

│ ME-01 │ AS32934 │ Meta │ Нет │ TIMEOUT │ TCP timeout (SYN Drop) │
│ ME-01 │ AS32934 │ Meta │ Нет │ TIMEOUT │ TCP timeout (SYN Drop) │
│ ME-01 │ AS32934 │ Meta │ Нет │ TIMEOUT │ TCP timeout (SYN Drop)

Поиск белых SNI для ASN AS: 1 | IP: 3 | SNI: 189 | батч: 5
Ни одна AS не заблокирована — перебор SNI не нужен.
│TCP 16-20KB √ 0/3 OK (0% ОК) │

хммм, так и должно быть или я что то не так делаю?

На форуме писали, что утилита лезет куда-то на украинские сайты (я так понял, которые в РФ считаются террористическими и т.п.) и это может быть опасно. Поподробнее можно объяснить?

Были только DNS запросы. Эти сайты убраны в v3

Эти IP либо недоступны в целом, либо блокируют соединения. В общем это не 16kb блокировка. Возможно без определенных sni Meta веб-сервер не отвечает. Если sni не указан, то по умолчанию используется example.com

у где-то 7 AS нет подходящих белых SNI, поэтому для них перебирается весь список - от того и долго. Исправлено не будет. Для сохранения отчета нужно дождаться окончания теста

А не хотите сделать подбор sni через curl? Он позволяет за пару секунд делать тысячи параллельных запросов - в итоге находит sni довольно шустро вроде бы.

Один IP точно пингует, а остальные да в блоке. SNI так указывать? Но в итоге все так же…

“id”: “ME-01”, “asn”: “32934”, “provider”: “Meta”, “ip”: “57.144.249.32”, “port”: 443, “sni”: “www.whatsapp.com

ну да, это необязательно, лишний код, просто если что имейте ввиду кто будет прерывать, просто с экрана копируйте, может скриншот или разделите на два шага, чек и подбор сни…

Питон тоже справляется хорошо с одновременными соединениями, нет смысла тащить в зависимости curl. Проблема не в скорости, а в возможных рейтлимитах. Если для одного IP открывать сотню соединений, то есть шанс словить блок за DOS

В общем экспериментировать надо с этим. Claudflare точно не любит много запросов

Мне пока не удалось) А у вас какое число одновременных соединений?

Глобально у тестера - 100. У проверки sni батчи по 5шт для каждого AS одновременно, когда все завершаются - запускают следующие 5.

Понятно, спасибо. У меня без ограничений: берется список всех белых sni для asn домена и проверяется одним запросом в curl. Про ddos что-то действительно не пришло в голову учесть. А еще не учтен др. момент: на некоторых серверах белые sni есть, но там протокол udp к примеру. По tcp ничего не найдется в принципе. Или на сервере стоит авторизация - тоже ничего не найдется. В общем, имхо, нужно 2 режима подбора sni:

  1. ищем реально рабочие sni
  2. выдаем список потенциально рабочих sni для asn (и далее пусть проверяют вручную на своем сервере)

Релиз версии 3.1.0

Новая проверка замедления/доступности Telegram

  • Тесты на download, upload и пинг дата-центров

Фиксы

  • Исправлено автоматическое завершение после отображения легенды

UDP: у кого win7, проверьте, нормально тест отображается или данные прыгают?