Zapret2UI

Программа

Интерфейс

Семь вкладок расширенного режима: что делает каждая кнопка, что означают цвета и куда смотреть, когда что-то пошло не так.

Вверху по центру окна переключатель Простой / Расширенный. Простой режим оставляет одну кнопку включения, карточку Telegram и выбор цели. Расширенный добавляет вкладки: Главная, Стратегии, Хостлисты, Диагностика, Журнал, Telegram, Настройки.

Главная

Вкладка Главная в расширенном режиме: кнопка включения обхода, состояние, выбор цели, карточка Telegram, кнопки подбора и генерации
Главная в расширенном режиме. Всё то же самое, что в простом, плюс строка состояния и сведения о выбранной стратегии.

Стратегии

Вкладка Стратегии: список готовых стратегий с короткими подписями и кнопкой Применить
Список стратегий. Рекомендуемая помечена и включается по умолчанию, ниже идут ваши сохранённые.

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

Сюда же попадают ваши стратегии, сохранённые после подбора или генерации. Встроенные редактировать нельзя, но любую можно продублировать и править копию. Что именно делает каждая встроенная стратегия, разобрано построчно на странице Разбор стратегий.

Хостлисты

Вкладка Хостлисты: список файлов со списками доменов и редактор содержимого
Хостлист: обычный текстовый файл, по одному домену на строку. Именно так его читает движок.

Хостлисты определяют, к каким доменам применяется обход. Это ключевая вещь для режима «только списки», который включён по умолчанию: чего нет в списках, того движок не трогает.

Формат файла

Обычный текстовый файл, по одному домену на строку, без протокола, без косых черт и без звёздочек. Именно так его читает движок, никакого своего формата программа не придумывает.

discord.com
discord.gg
discordapp.com
discordapp.net
gateway.discord.gg

Домен покрывает и свои поддомены: строка discord.com сработает и для canary.discord.com. Поэтому перечислять поддомены отдельно нужно редко.

Какие списки есть

ФайлДля чего
discord.txt Домены Discord: вход, gateway, CDN, медиа. Встроенный, обновляется при каждом запуске.
youtube.txt Домены YouTube и связанных сервисов Google. Тоже встроенный и обновляемый.
exclude.txt Список исключений: банки, госуслуги и подобное. Работает наоборот, защищая эти домены от профилей, которые ловят весь остальной трафик.
tgproxy-fronts.txt Домены за Cloudflare, через которые ходит встроенный прокси Telegram. Нужен, когда включена настройка «Прикрывать прокси Telegram».
Ваши файлы Любой созданный вами список. Программа их не трогает при обновлении.

Встроенные списки обновляются автоматически при каждом запуске, поэтому дописывать свои домены прямо в них не стоит: правки могут быть перезаписаны. Для своих доменов заведите отдельный список или пользуйтесь кнопкой «Свои цели».

Как список попадает в стратегию

Списки не прописываются в стратегию путями. Вместо этого используются токены, которые разворачиваются при запуске.

Токен в стратегииЧто подставится
{HOSTLIST} Активный список, тот, что выбран на этой вкладке. Если активного нет, токен просто исчезает из команды.
{HOSTLIST:discord} Конкретный список по имени файла. Так устроены все встроенные стратегии: они одновременно обращаются и к списку Discord, и к списку YouTube, направляя их в разные приёмы.
{EXCLUDE:exclude} Список исключений для профилей, ловящих всё подряд.

Полный перечень токенов: Справочник.

Свои цели

Быстрый способ добавить домен, не разбираясь со списками. Кнопка живёт на вкладке Диагностика. Добавленный домен:

При добавлении программа сама учитывает поддомены и тот же бренд в других зонах: например, yandex.ru подтянет заодно ya.ru и yandex.kz.

Обход по IP-адресам

Списки доменов работают, пока блокировка идёт по имени. Если сервис режут по адресам, имя в пакете менять бессмысленно. На этот случай есть ipset: список подсетей вместо списка доменов.

Кнопка «Собрать IP-список Discord» резолвит домены Discord и складывает актуальные подсети в lists\ipset-discord.txt. Прав администратора не нужно, задействован только DNS. В стратегии список подключается токеном {IPSET} или {IPSET:имя}.

Полностью блокировку по IP это не снимает: движок по-прежнему не может провести трафик туда, куда закрыт маршрут. Ipset помогает в промежуточном случае, когда фильтрация идёт по адресам, но сами адреса доступны. Если же соединение не устанавливается вообще, нужен VPN, а для Telegram встроенный прокси.

Диагностика

Вкладка Диагностика: таблица доступности по сервисам со столбцами HTTP, TLS 1.2, TLS 1.3 и Ping
Таблица доступности. Строки: сервисы, столбцы: способ проверки. Зелёная ячейка означает, что проверка прошла.

Слева кнопки, справа таблица. Строки собраны по сервисам: Discord (вход и API, gateway, CDN, обновления, проверка Cloudflare), YouTube (сайт, короткие ссылки, картинки, видео), а также Google, Cloudflare и DNS. Столбцы: HTTP, TLS 1.2, TLS 1.3 и Ping.

КнопкаЧто делает
ПодобратьПеребирает готовые стратегии, проверяет доступность и оставляет лучшую.
СгенерироватьСобирает личную стратегию под вашу сеть. Дольше, но точнее.
ДиагностикаПросто проверить, что открывается. Ничего не меняет и не запускает движок.
Проверка DPIОпределяет, режет ли провайдер именно по DPI. Разобрано ниже.
Свои целиДобавить домен, чтобы его тоже проверяли и обходили.

Зелёное не всегда означает «работает». Диагностика проверяет доступность на низком уровне. Сайт может резаться другим способом, например через ECH или по IP-адресу, и тогда проверка проходит, а страница не открывается. Разбор этого случая: Если не работает.

Как работает «Проверка DPI»

Обычная диагностика отвечает на вопрос «открывается или нет». Проверка DPI отвечает на другой: вмешивается ли провайдер. Для каждого чувствительного хоста делается два шага.

  1. Подключение к порту 443

    Если обычное TCP-подключение не проходит, это не блокировка по имени сайта, а недоступность: проблема с маршрутом или блокировка по IP. Так и пишется, «нет соединения».

  2. Отправка настоящего имени сайта

    Если подключение прошло, сервер жив. Тогда отправляется TLS ClientHello с реальным SNI, и смотрится, что происходит именно с этим пакетом:

    • Обрыв сразу после ClientHello. Сервер уже согласился на соединение, значит сброс на пакете с именем сайта пришёл не от него, а от оборудования посередине.
    • Заморозка. Пакет ушёл, ответа нет, соединение висит. Пакет с именем тихо выброшен.
    • Рукопожатие прошло. Признаков вмешательства нет.

Точнее всего запускать проверку с выключенным обходом: тогда видно неприкрытое поведение провайдера. При включённом обходе результат «чисто» означает лишь, что обход уже сделал свою работу.

Отдельно проверяется лимит по объёму. Кроме блокировки по имени провайдер может душить само соединение по количеству пакетов: первые десятки килобайт проходят, дальше поток замирает. Короткое рукопожатие под такой лимит не попадает и показывается как «чисто», поэтому программа отдельно тянет крупную загрузку и смотрит, проходит ли она за порог. Идея метода взята из проекта hyperion-cs/dpi-checkers.

Журнал

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

Вкладка разделена на две части, чтобы проблема прокси не терялась среди вывода движка.

ЧастьЧто показывает
Движок Живой вывод winws2: запуск, подключение драйвера, применённая стратегия, ошибки и код выхода.
Telegram Вывод встроенного прокси: запуск слушателя, выбор пути к дата-центрам, переход на домены за Cloudflare, ошибки соединения.

У каждой части свои кнопки «Копировать» и «Очистить».

Переключатель --debug в заголовке включает подробный режим сразу для обеих частей. Движок начинает писать, к каким именно соединениям применились приёмы и почему: без этого понять, что стратегия молча не сработала, практически невозможно. Прокси добавляет по три строки на соединение:

[tg-proxy] #7 DC2: открыто через прямой IP
[tg-proxy] #7 DC2: трафик пошёл
[tg-proxy] #7 DC2: закрыто через 45,2 с — Telegram закрыл канал

Читайте эти строки по номеру #N, а не подряд. Telegram Desktop держит несколько соединений одновременно и при любой смене сети переоткрывает их разом, поэтому строки закрытия старых соединений идут вперемешку со строками открытия новых. Без номера соседняя пара выглядит так, будто только что открытое соединение прожило 45 секунд, — на деле это два разных соединения.

В обычном режиме прокси пишет только то, на что можно реагировать: запуск, первый успешно открытый канал, исключённый фронт, неудачу подключения.

Движок читает этот флаг только при запуске, поэтому переключение перезапускает обход: соединение на секунду прервётся. Выбор запоминается между сеансами, так что не забудьте выключить подробный режим, когда закончите разбираться. Журнал хранит последние 3000 строк, и в подробном режиме обычные сообщения о запуске улетают вверх заметно быстрее.

Что искать в выводе

Строка примерно такаяЧто означает
Про инициализацию windivert и начало захвата Драйвер поднялся, движок работает. Если этой строки нет, до обхода дело не дошло.
Про включение TCP timestamps Программа перевела системную настройку в рабочее состояние на время сеанса и вернёт её при остановке. Это нужно стратегиям с tcp_ts.
Упоминание кода выхода Движок остановился. Смотрите строку над кодом: она и содержит причину. Расшифровка: Если не работает.
Сообщение о несуществующей функции desync В стратегии указан глагол, которого нет в движке. Обычно это перенос конфига из чужой сборки. Сверьтесь со списком глаголов.

Всё то же самое дублируется в файлы в папке logs\, по файлу на сеанс. Если просите помощи в канале или в задаче на GitHub, приложите последние десять или пятнадцать строк: по ним почти всегда видно, что пошло не так.

Telegram

Вкладка Telegram: включение встроенного прокси, адрес и секрет, кнопка Открыть в Telegram, выбор порта
Встроенный прокси MTProto. Работает независимо от основной кнопки обхода и без прав администратора.

Telegram блокируют не так, как сайты: чаще по IP-адресам. Обход DPI против этого бессилен, поэтому в программе есть отдельный встроенный прокси.

Чем это отличается от tg-ws-proxy

Механизм тот же, что у tg-ws-proxy, но реализация другая. Оригинал: отдельная программа на Python, собранная в самостоятельный исполняемый файл. Здесь: нативный порт протокола на C#, встроенный прямо в приложение, без второго процесса и без Python-рантайма.

Реализован транспорт dd (обфусцированный MTProto). Клиент подключается по локальной петле, поэтому FakeTLS не нужен и опущен. Рабочий путь сохранён: резолв через DoH и домены за Cloudflare, с пулом фронтов и временным отсевом неудачных.

Настройки

Вкладка Настройки: масштаб интерфейса, обновление движка, автозапуск, уведомления, область обхода
Настройки в две колонки. Все значения хранятся в settings.json.
НастройкаКлючПо умолчаниюЧто делает
Простой режимSimpleModetrueОдна кнопка вместо вкладок.
Активная стратегияActivePresetNameИмя выбранной стратегии.
Активный хостлистActiveHostlistИмя активного списка доменов.
Авто-обновление движкаAutoUpdateEnginetrueТихо обновлять winws2 из релизов.
Автозапуск с WindowsAutostartfalseЗапуск при входе, от администратора, через планировщик задач.
И запуск обходаAutostartEnginefalseДополнительно включать обход при старте.
Сворачивать в трейMinimizeToTraytrueКрестик прячет окно, а не закрывает программу.
Стартовать в трееStartMinimizedfalseЗапускаться сразу свёрнутым.
Авто-починкаAutoHealfalseСледить за доступностью и переподбирать при сбое.
Игровой фильтрGameFilterfalseРасширить перехват на все высокие порты.
Обход всех сайтовBypassAllSitesfalseВсе сайты вместо только списков.
Отключить QUICDisableQuicfalseДропать QUIC, чтобы браузер откатился на TCP.
Прикрывать прокси TelegramTgProxyCoveragefalseДвижок дополнительно прикрывает соединения прокси. Для мобильного DPI.
Масштаб интерфейсаUiScale1.0Дополнительный зум от 1.0 до 2.5 поверх системного DPI.
УведомленияNotificationsEnabledtrueПоказывать всплывающие сообщения в углу экрана.
Звук уведомленийNotificationSoundtrueТихий сигнал вместе с сообщением.
Порт прокси TelegramTgProxyPort1443Локальный порт встроенного прокси.
Секрет проксиTgProxySecretПостоянный секрет MTProto.
Автозапуск проксиTgProxyAutostartfalseСтартовать прокси вместе с программой.
Память по сетямNetworkStrategies{}Соответствие «сеть, стратегия». Только локально.

Отдельная кнопка «Добавить в исключения» одним нажатием прописывает программу и папку движка в Защитник Windows и брандмауэр. Антивирус остаётся самой частой причиной, по которой обход «не работает».

После каждого исключения программа перечитывает список у Защитника и проверяет, что запись действительно появилась. При включённой «Защите от подделки» (Tamper Protection — по умолчанию включена в Windows 11) или под сторонним антивирусом команда добавления умеет отчитаться об успехе, а исключение при этом тихо отбрасывается. Поэтому в отчёте будет честный с причиной, а не галочка. Тогда добавьте папку %LOCALAPPDATA%\Zapret2UI вручную: «Безопасность Windows» → «Защита от вирусов и угроз» → «Исключения».

Область обхода, игровой фильтр и QUIC

Три настройки решают, что именно трогает движок. Они заметно влияют на результат, поэтому стоит понимать разницу.

Игровой фильтр меняет только захват по UDP. Захват по TCP всегда широкий, порт 80 плюс весь диапазон 443 и выше: медиа и вложения Discord живут на высоких портах TCP, и узкий захват молча лишил бы их обхода.

НастройкаВыключено (по умолчанию)Включено
Обход всех сайтов Обходятся только домены из списков плюс ваши цели. Профили, ловящие «всё остальное», пере-нацеливаются на ваши цели или отбрасываются, поэтому игры и приложения не задеваются. Обходится весь TLS и QUIC, кроме списка исключений (банки, госуслуги и подобное). Удобно, но может сломать приложение, которого нет в исключениях.
Игровой фильтр По UDP перехватываются только 443 (это QUIC), STUN и голосовой диапазон Discord. Игровой трафик по UDP идёт мимо обхода. Захват по UDP расширяется на все высокие порты, чтобы обход доставал и до замедляемых игр.
Отключить QUIC QUIC обходится своими профилями, как и TCP. QUIC у обходимых сервисов дропается, браузер откатывается на TCP. Включать, если провайдер режет именно QUIC: типичный рецепт для «YouTube буферизует».

Файлы на диске

Программа портативная: не устанавливается в Program Files и почти не трогает систему. Всё лежит в одной папке.

%LOCALAPPDATA%\Zapret2UI\
├─ engine\                     движок и его данные
│  ├─ winws2.exe               сам движок, нужен администратор
│  ├─ mdig.exe, ip2net.exe     резолв доменов в подсети для ipset
│  ├─ cygwin1.dll, WinDivert*  рантайм и сетевой драйвер
│  ├─ installed_version.txt    установленная версия движка
│  ├─ lua\                     библиотеки приёмов
│  ├─ files\                   блобы: готовые TLS и QUIC ClientHello
│  └─ windivert.filter\        части фильтра перехвата
├─ lists\                      хостлисты и ipset
│  ├─ youtube.txt, discord.txt встроенные списки доменов
│  ├─ exclude.txt              исключения: банки, госуслуги
│  └─ ipset-discord.txt        собранные подсети
├─ logs\                       вывод движка по сеансам
├─ tmp\                        временные загрузки
├─ presets.json                ваши стратегии
└─ settings.json               настройки

Как удалить полностью

  1. Закройте программу

    Правый клик по значку в трее, «Выход». Крестик только сворачивает окно, а не завершает работу.

  2. Снимите автозапуск, если включали

    Настройки, выключить «Запускать с Windows». Либо вручную:

    schtasks /delete /tn "Zapret2UI Autostart" /f
  3. Удалите файл и папку данных

    Сам Zapret2UI.exe и папку %LOCALAPPDATA%\Zapret2UI\. После этого от программы не остаётся ничего: в реестре и в Program Files она ничего не пишет.

Windows пишет «Файл уже используется» на WinDivert64.sys? Это драйвер ядра, он остаётся загруженным, пока его не выгрузить. Убедитесь, что программа закрыта через трей и в Диспетчере задач нет winws2.exe, затем в PowerShell от администратора:

sc.exe stop WinDivert
sc.exe delete WinDivert

Именно sc.exe, а не sc: в PowerShell sc это псевдоним команды Set-Content, поэтому sc stop WinDivert молча не сработает. В обычной cmd.exe работает и короткий вариант.

Проще всего просто перезагрузить компьютер и удалить папку: драйвер настроен не грузиться сам, после перезагрузки файл свободен.

Если добавляли исключения через настройки, останутся безвредные правила Защитника Windows и брандмауэра с именем Zapret2UI. При желании их можно убрать в настройках безопасности Windows.

settings.json пишется атомарно, через временный файл, чтобы сбой при записи не повредил настройки. Если файл всё же испортился, он сохраняется рядом с расширением .bak, а настройки сбрасываются на значения по умолчанию.