Zapret2UI

Теория

Как это работает

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

Читать эту страницу, чтобы пользоваться программой, не обязательно. Но если понимать, что происходит, перестанут удивлять две вещи: почему стратегий девять, а не одна, и почему иногда «в диагностике всё зелёное, а сайт не открывается».

Как устроена блокировка

Когда браузер открывает https://-соединение, он первым делом отправляет пакет TLS ClientHello. Внутри, помимо прочего, лежит поле SNI (Server Name Indication): имя сайта, к которому вы подключаетесь. Оно нужно, чтобы сервер, обслуживающий тысячи доменов, понял, чей сертификат предъявлять.

Ключевая деталь: соединение ещё не зашифровано, и имя сайта идёт открытым текстом. Его видит любой, кто наблюдает за каналом, в том числе оборудование провайдера. У операторов это DPI (Deep Packet Inspection), в России чаще ТСПУ: техническое средство противодействия угрозам, установленное на сети оператора.

Дальше просто. Железка читает имя, сверяет со списком и, если совпало, вмешивается. Способов вмешаться три, и по симптому обычно понятно, какой именно применили:

Что делает DPIКак выглядит
Сброс (подделанный TCP RST) Соединение обрывается мгновенно. Браузер пишет, что сайт разорвал связь. Классическая российская сигнатура.
Тихий дроп Пакет с именем сайта молча выбрасывается. Ответа нет, страница висит в загрузке до таймаута.
Подмена Вместо сайта приходит страница-заглушка или редирект. Сейчас встречается реже.

Есть и четвёртый механизм, устроенный иначе: не блокировка, а лимит по объёму. Соединение устанавливается, первые десятки килобайт проходят, а после примерно шестнадцати или двадцати пакетов в каждую сторону поток замирает. Это и есть «сайт открывается, но видео буферит и медиа не грузятся». Проверить, применяют ли такое к вам, можно кнопкой «Проверка DPI» на вкладке Диагностика.

Почему её можно обойти

Обход существует благодаря одной асимметрии: DPI не является получателем вашего трафика. Он стоит сбоку, видит копию потока и должен принять решение за миллисекунды, для миллионов соединений одновременно. Настоящий сервер получает поток целиком и собирает его по всем правилам TCP, никуда не торопясь.

Отсюда следует главное: картина потока у DPI и у сервера может различаться. Если добиться того, чтобы железка увидела одно, а сервер собрал другое, блокировка не сработает, а сайт при этом откроется нормально. Вся стратегия обхода занимается ровно этим и называется десинхронизацией (desync).

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

Три семейства приёмов

Конкретных приёмов в движке два десятка, но все они сводятся к трём идеям.

Разрезать пакет

Имя сайта режется границей TCP-сегментов. Браузер отправляет не один ClientHello, а несколько кусков: например, так, чтобы you ушло в одном сегменте, а tube.com в следующем. Сервер соберёт их в правильном порядке и увидит целое имя, а DPI, который анализирует пакеты по отдельности и не хранит состояние для каждого соединения, целого имени не увидит.

Глаголы: multisplit (просто разрезать), multidisorder (разрезать и отправить куски в обратном порядке, чтобы усложнить сборку ещё сильнее). Куда именно ставить разрез, задают позиционные маркеры вроде midsld, то есть «середина домена второго уровня».

Подделать пакет

Перед настоящим ClientHello отправляется фальшивый, с невинным именем внутри: например, готовый ClientHello от www.google.com или vk.com. DPI видит первым именно его, считает соединение разрешённым и теряет к нему интерес. Настоящий пакет проходит следом уже без досмотра.

Здесь появляется главная сложность всего обхода. Фейк нужен только для железки провайдера. Если он долетит до сервера, тот получит два ClientHello подряд и разорвёт рукопожатие. Значит, фейк должен умереть где-то посередине: после DPI, но до сервера. Как этого добиваются, разобрано ниже.

Глаголы: fake (только вставить фейк), fakedsplit и fakeddisorder (фейк плюс разрезка), hostfakesplit (разрез точно по маркеру имени с подстановкой фальшивого имени той же длины).

Придушить окно

Третий подход работает не с вашим запросом, а с ответом сервера. Клиент объявляет очень маленькое TCP-окно, и сервер вынужден отдавать ответ мелкими порциями. Сигнатура, которую DPI ищет в ответе, не собирается. Приём медленнее остальных, но иногда пробивает там, где не помогло ничего.

Глаголы: wssize, wsize.

Как фейк умирает по дороге

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

ПриёмКак убивает фейкОговорки
ip_autottl Занижает TTL так, чтобы пакет истёк на несколько узлов дальше DPI провайдера и не дошёл до сервера. Зависит от маршрута. При смене сети подобранное значение может перестать подходить.
badsum Портит контрольную сумму. Сервер отбрасывает пакет как повреждённый. Часто бесполезен дома: домашний роутер за NAT выбрасывает такой пакет ещё до провайдера, и DPI его тоже не увидит.
tcp_md5 Добавляет TCP-опцию MD5-подписи. Обычный сервер такой пакет не принимает. Безопасен за NAT. Рабочая замена badsum на домашней сети.
tcp_seq Сдвигает порядковый номер за пределы окна. Сервер считает пакет мусором вне очереди. Надёжен, но некоторые DPI тоже проверяют номера и перестают верить фейку.
tcp_ts Ставит фейку более старую временную метку. Механизм PAWS в ядре сервера отбрасывает «устаревший» пакет. Работает только при включённых TCP timestamps и только с отрицательным значением. Смотрите предупреждение ниже.

Ловушка с tcp_ts. Значение обязано быть отрицательным (tcp_ts=-1000). PAWS отбрасывает пакет с меньшей меткой, то есть более старый. Если поставить положительное значение, всё переворачивается: выживает фейк, а по PAWS отбрасывается уже настоящий пакет. Соединение при этом ломается тихо, без ошибки, и выглядит как «обход включён, но ничего не работает».

Ещё одна тонкость, из-за которой ts-приёмы иногда молча ничего не делают: Windows по умолчанию держит TCP timestamps в состоянии allowed, которое не гарантирует их наличие в исходящих пакетах. Zapret2UI переключает их в enabled на время сеанса и возвращает прежнее значение при остановке, так что вручную настраивать ничего не нужно.

Fooling применяется не ко всем глаголам одинаково. У fake и семейства faked* он действует только на фейковые пакеты, поэтому туда можно класть что угодно. У multisplit и multidisorder он действует на все сегменты, включая настоящие, поэтому разрушающий fooling там ломает соединение. Подробнее в справочнике.

Почему нет одной стратегии на всех

Оборудование у операторов разное: разные производители, разные версии прошивок, разные настройки глубины анализа. Один DPI смотрит только первый пакет соединения, другой собирает первые несколько. Один верит любому ClientHello, другой сверяет порядковые номера. Один режет QUIC целиком, другой его игнорирует.

Поэтому приём, который у одного провайдера пробивает блокировку насквозь, у другого не даёт ничего. Единственный честный способ найти рабочий вариант: пробовать. Этим и заняты две функции программы:

Найденное привязывается к отпечатку текущей сети (по адресу вашего роутера) и включается само, когда вы возвращаетесь в эту сеть. Данные хранятся локально, в интернет ничего не уходит.

Это zapret2, а не обычный zapret

Путаница здесь возникает постоянно, поэтому разберём подробно. Существуют два разных движка, и оба сделал один и тот же автор, bol-van.

Это не форк и не конкурент: второй продолжает первый. Но совместимости между ними нет: у них разные имена аргументов, разный формат стратегий и свой драйвер у каждого.

Что изменилось во втором

Главная перемена не в наборе приёмов, а в том, где живёт их логика. В первом zapret каждый приём был зашит в исполняемый файл: добавить новый или подсмотреть, что именно он делает с пакетом, было невозможно без пересборки. Во втором логика вынесена в скрипты на языке Lua, которые лежат рядом с движком в папке lua\ и открыты для чтения.

Из этого следует всё остальное.

zapret (первый)zapret2
Движок winws.exe winws2.exe
Приёмы задаются --dpi-desync= --lua-desync=
Где логика приёма Зашита в исполняемый файл. Скрипты Lua рядом с движком. Их можно прочитать и дополнить своими.
Фейковые пакеты Отдельные флаги под каждый тип, вроде --dpi-desync-fake-tls. Именованные блобы: файл один раз объявляется через --blob=имя:путь и дальше используется по имени.
Несколько приёмов подряд Ограниченные сочетания, зашитые заранее. Сколько угодно --lua-desync в одном профиле, выполняются по порядку.
Управление на лету Нет. Есть оркестраторы (circular и другие): они сами переключают приёмы, когда ловят сброс от DPI, без перезапуска движка.
Драйвер Свой. Свой, другой. Поэтому две версии не стоит запускать одновременно.

Как понять, для какого движка инструкция

Достаточно посмотреть на две вещи в любом найденном конфиге или команде.

Признак в текстеЗначит
winws.exe, --dpi-desync=, --dpi-desync-ttl Первый zapret. Сюда не подходит.
winws2.exe, --lua-desync=, --blob= zapret2. Скорее всего подойдёт, но имена блобов проверьте.

Отдельно про название «Zapret 2 GUI». Есть популярные сборки, у которых в имени стоит цифра 2, но внутри работает первый zapret с дописанными самостоятельно Lua-скриптами. Цифра там означает версию самой сборки, а не поколение движка. Их стратегии годятся как источник идей, но переносить оттуда строки напрямую нельзя: часть глаголов и имён блобов в стандартном zapret2 просто не существует.

Что это означает на практике. Конфиги, найденные в инструкциях к первому zapret, здесь не запустятся: движок остановится с ошибкой «недопустимый параметр». Это не поломка программы, а несовместимость форматов. Если хочется перенести чужую стратегию, каждый глагол нужно сверить со списком поддерживаемых, а любые имена блобов вроде tls5 заменить на существующие здесь.

Чем это не VPN

Обход и VPN решают разные задачи и по-разному влияют на скорость.

Обход DPIVPN
Куда идёт трафик Напрямую к сайту Через чужой сервер
Скорость Не меняется: маршрут прежний Ограничена каналом и удалённостью сервера
Прячет ли ваш адрес Нет Да
Шифрует ли трафик дополнительно Нет Да
Против блокировки по имени сайта Работает Работает
Против блокировки по IP-адресу Бессилен Работает

Чего обход не умеет

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

Три детали, которые всё решают

QUIC и HTTP/3

Современные YouTube и Discord охотно ходят по QUIC поверх UDP вместо привычного TCP. Это отдельный протокол, и обходить его нужно отдельно, своими профилями. Если провайдер режет или замедляет именно QUIC, самый быстрый выход: отключить его в настройках. Браузер молча откатится на TCP, с которым обход справляется лучше. Отсюда классический рецепт для «видео бесконечно грузится».

Голос Discord

Голосовой трафик идёт не по 443 порту, а по UDP на высоких портах, вплоть до 65535, и через протокол STUN. Профиль, который ловит только 443, до голоса просто не дотягивается. Поэтому во всех встроенных стратегиях есть отдельный голосовой профиль на диапазон 19294-19344, 50000-65535. Отсюда же типичный симптом «текст работает, а в голосовом канале вечное подключение».

Область обхода

По умолчанию программа трогает только домены из списков (Discord, YouTube плюс ваши цели), а не весь трафик. Это сознательно: обходить всё подряд означает вмешиваться в соединения игр, банковских приложений и всего остального, что вполне может от этого сломаться. Режим «все сайты» существует, но включать его стоит осознанно.