Теория
Как это работает
Что провайдер видит в вашем трафике, почему этого достаточно для блокировки и как несколько изменённых байт снимают её.
Читать эту страницу, чтобы пользоваться программой, не обязательно. Но если понимать, что происходит, перестанут удивлять две вещи: почему стратегий девять, а не одна, и почему иногда «в диагностике всё зелёное, а сайт не открывается».
Как устроена блокировка
Когда браузер открывает 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 целиком, другой его игнорирует.
Поэтому приём, который у одного провайдера пробивает блокировку насквозь, у другого не даёт ничего. Единственный честный способ найти рабочий вариант: пробовать. Этим и заняты две функции программы:
- Подбор перебирает готовые стратегии, проверяет по каждой доступность целевых сайтов и оставляет ту, у которой меньше всего провалов. Быстрее и предсказуемее, начинать стоит с него.
- Генерация собирает стратегию с нуля: тестирует отдельные приёмы, отдельно оптимизирует Discord и YouTube, затем соединяет найденное в одну команду и проверяет её целиком. Дольше, зато результат подогнан под вашу сеть.
Найденное привязывается к отпечатку текущей сети (по адресу вашего роутера) и включается само, когда вы возвращаетесь в эту сеть. Данные хранятся локально, в интернет ничего не уходит.
Это zapret2, а не обычный zapret
Путаница здесь возникает постоянно, поэтому разберём подробно. Существуют два разных движка, и оба сделал один и тот же автор, bol-van.
- zapret, он же «первый» или «обычный». Движок под Windows называется
winws.exe. Это тот проект, вокруг которого выросло большинство готовых сборок, инструкций и видео на YouTube. - zapret2. Движок
winws2.exe. Следующее поколение, переработанное изнутри. Именно с ним работает Zapret2UI, отсюда цифра в названии программы.
Это не форк и не конкурент: второй продолжает первый. Но совместимости между ними нет: у них разные имена аргументов, разный формат стратегий и свой драйвер у каждого.
Что изменилось во втором
Главная перемена не в наборе приёмов, а в том, где живёт их логика. В первом 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 решают разные задачи и по-разному влияют на скорость.
| Обход DPI | VPN | |
|---|---|---|
| Куда идёт трафик | Напрямую к сайту | Через чужой сервер |
| Скорость | Не меняется: маршрут прежний | Ограничена каналом и удалённостью сервера |
| Прячет ли ваш адрес | Нет | Да |
| Шифрует ли трафик дополнительно | Нет | Да |
| Против блокировки по имени сайта | Работает | Работает |
| Против блокировки по IP-адресу | Бессилен | Работает |
Чего обход не умеет
Честный список ограничений. Все они следуют из того, что обход трогает только распознавание имени сайта в первом пакете.
- Блокировка по IP-адресу. Если у провайдера закрыты сами адреса сервиса, менять имя в пакете бессмысленно: пакет никуда не пойдёт. Здесь помогает только VPN. Для Telegram, который блокируют именно так, в программе есть встроенный прокси.
- ECH. Когда браузер шифрует само поле SNI (Encrypted Client Hello), провайдер может резать такие соединения целиком, не разбирая. Тогда низкоуровневая проверка показывает зелёное, а сайт в браузере не открывается.
- Лимит по объёму. Ограничение на количество пакетов TLS-обход снимает не всегда, потому что оно не связано с именем сайта.
- Замедление на стороне сервиса. Если тормозит сам сервис, а не канал до него, сделать нечего.
Три детали, которые всё решают
QUIC и HTTP/3
Современные YouTube и Discord охотно ходят по QUIC поверх UDP вместо привычного TCP. Это отдельный протокол, и обходить его нужно отдельно, своими профилями. Если провайдер режет или замедляет именно QUIC, самый быстрый выход: отключить его в настройках. Браузер молча откатится на TCP, с которым обход справляется лучше. Отсюда классический рецепт для «видео бесконечно грузится».
Голос Discord
Голосовой трафик идёт не по 443 порту, а по UDP на высоких портах, вплоть до 65535, и через
протокол STUN. Профиль, который ловит только 443, до голоса просто не дотягивается. Поэтому во всех
встроенных стратегиях есть отдельный голосовой профиль на диапазон
19294-19344, 50000-65535. Отсюда же типичный симптом «текст работает, а в голосовом
канале вечное подключение».
Область обхода
По умолчанию программа трогает только домены из списков (Discord, YouTube плюс ваши цели), а не весь трафик. Это сознательно: обходить всё подряд означает вмешиваться в соединения игр, банковских приложений и всего остального, что вполне может от этого сломаться. Режим «все сайты» существует, но включать его стоит осознанно.