Zapret2UI

Программа

Разбор стратегий

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

Стратегия в Zapret2UI: это список аргументов для движка winws2. Ниже разобрана каждая из встроенных. Если незнакомы слова «фейк», «разрезка» и «fooling», сначала стоит прочитать Как это работает. Формальное описание всех глаголов и параметров: Справочник.

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

Общий скелет

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

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

Глобальная часть

До первого --new идут настройки, действующие на всю команду.

--wf-tcp-out=80,443-65535
--wf-udp-out=443,19294-19344,50000-65535
--ctrack-disable=0
--ipcache-lifetime=8400
--ipcache-hostname=1
--lua-init=fake_default_tls = tls_mod(fake_default_tls,'rnd,rndsni')
--blob=tls_google:@{FILES}\fake\tls_clienthello_www_google_com.bin
--blob=tls_vk:@{FILES}\fake\tls_clienthello_vk_com.bin
--blob=tls_sber:@{FILES}\fake\tls_clienthello_sberbank_ru.bin
--blob=tls_gos:@{FILES}\fake\tls_clienthello_gosuslugi_ru.bin
--blob=quic_google:@{FILES}\fake\quic_initial_www_google_com.bin
--blob=quic_vk:@{FILES}\fake\quic_initial_vk_com.bin
--wf-raw-part=@{WF}\windivert_part.stun.txt
--wf-raw-part=@{WF}\windivert_part.quic_initial_ietf.txt
--wf-tcp-out
Ширина перехвата по TCP. Не только 443: медиа и вложения Discord ходят по высоким портам, и профиль, ловящий один 443, теряет половину сервиса. Порты перечисляются через запятую в одном флаге, повторное указание перезаписывает предыдущее.
--wf-udp-out
То же для UDP: 443 под QUIC плюс голосовой диапазон Discord. Игровой фильтр в настройках расширяет это до всех высоких портов.
--ipcache-hostname
Включает запоминание имени сайта для адреса. Обязателен для приёмов вроде wssize, которые срабатывают до того, как имя сайта вообще появится в потоке, и иначе не знают, к кому применяться.
--blob
Даёт короткое имя файлу с готовым ClientHello. Дальше в приёмах пишется просто blob=tls_google. Блобы tls_vk и quic_vk: настоящие приветствия от vk.com. Смысл в том, что ТСПУ пропускает отечественный трафик свободнее, поэтому фейк «под VK» иногда выживает там, где фейк «под Google» режут.
--wf-raw-part
Подключает готовые куски фильтра перехвата для STUN и для первого пакета QUIC. Без них голос Discord и HTTP/3 просто не попадут в обработку.

Семь профилей

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

ПрофильКого ловитЧто делает
1. Discord TLS --filter-tcp=443-65535 --filter-l7=tls плюс список доменов Discord Вход, gateway, медиа. Здесь стоит приём, который в стратегиях отличается.
2. YouTube TLS То же, но список доменов YouTube и Google Сайт и видео. Свой приём, обычно другой, чем у Discord.
3. Остальной TLS Всё прочее, кроме списка исключений Запасной вариант для всего остального. Исключения защищают банки, госуслуги и подобное от вмешательства.
4. QUIC YouTube --filter-udp=443-65535 --filter-l7=quic, список YouTube Фейк QUIC-блобом, repeats=11.
5. QUIC Discord То же, список Discord Отдельный профиль нужен для вложений и CDN, которые ходят по HTTP/3.
6. QUIC остальное Всё прочее, кроме исключений Фейк стандартным блобом.
7. Голос Discord --filter-udp=19294-19344,50000-65535 --filter-l7=discord,stun Отдельный приём для голоса. Разобран ниже.

В профилях TLS перед приёмом всегда стоят два «липких» флага:

--payload=tls_client_hello
Ограничивает срабатывание первым пакетом рукопожатия. Без него приём применялся бы ко всем пакетам подряд и ломал бы соединение.
--out-range=-d10
Ограничивает область действия первыми пакетами исходящих данных. Дальше по соединению движок не вмешивается.

Эти флаги липкие: они действуют с места указания и до переопределения, поэтому обязаны стоять перед тем --lua-desync, на который влияют. Перестановка их местами меняет поведение молча, без ошибки.

Голосовой профиль

Он одинаков во всех комбо, кроме ALT10 и ALT11, и заслуживает отдельного объяснения, потому что логика тут вывернутая.

--filter-udp=19294-19344,50000-65535 --filter-l7=discord,stun
--lua-desync=fake:blob=quic_google:ip_autottl=-2,3-20:ip6_autottl=-2,3-20:repeats=2
диапазон портов
Весь высокий диапазон, а не узкие 50000 до 50100. Узкий диапазон пропускал половину голосовых серверов, из-за чего получался вечный пинг 5000.
blob=quic_google
В голосовой поток подмешивается пакет, который для него является мусором. Сервер отбрасывает его, не разбирая, поэтому нумерация голосового потока не портится и не возникает ошибки маршрутизации. Фейк здесь нужен исключительно для DPI.
ip_autottl
Фейк умирает по дороге и до сервера не доходит. Благодаря этому провайдер видит «шум» и не душит поток, а настоящий голос идёт без ограничения скорости.
repeats=2
Совсем лёгкое вмешательство. Голос чувствителен к задержкам, и большое число повторов вредит сильнее, чем помогает.

Разбор стратегий

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

Комбо (рекомендуемый)

по умолчанию Универсальная, начните с неё
# Discord и весь остальной TLS
--lua-desync=hostfakesplit:host=www.google.com:tcp_ts=-1000:tcp_md5:repeats=4

# YouTube и Google
--lua-desync=fake:blob=tls_google:tcp_md5:tcp_seq=-10000:repeats=6
--lua-desync=multidisorder:pos=1,midsld
hostfakesplit
Режет пакет точно по имени сайта и подставляет фальшивое имя такой же длины. Главное следствие: приём подстраивается под любой размер ClientHello. Поэтому он пускает не только на страницу входа Discord, но и к gateway, у которого приветствие другого размера. Стратегии с фиксированным перекрытием на этом спотыкаются: логин проходит, а подключения к серверам нет.
host=www.google.com
Имя, которое подставляется вместо настоящего. Безобидное и заведомо не заблокированное.
tcp_ts=-1000
Фейк получает более старую временную метку и отбрасывается на стороне сервера механизмом PAWS. Значение обязано быть отрицательным: при положительном отбрасываться будет настоящий пакет, а не фейк.
tcp_md5
Второй способ убить фейк, на случай если временные метки не сработают. Выбран вместо badsum потому, что безопасен за домашним NAT: роутер не выбрасывает такой пакет заранее.
repeats=4
Фейк отправляется четыре раза. Чем больше повторов, тем выше шанс, что DPI успеет его заметить и запомнить соединение как разрешённое.
fake + multidisorder
Для YouTube связка другая: сначала фейковый ClientHello, следом настоящий, разрезанный и отправленный в обратном порядке. Один приём тут обычно не пробивает, работает именно сочетание.
pos=1,midsld
Две точки разреза: сразу после первого байта и в середине домена второго уровня. Второй маркер обязателен: pos=1 сам по себе движок вырезает, и приём превращается в ничего не делающий.

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

Комбо, отечественный (VK, целевой)

Маскировка под VK
# Discord и остальной TLS
--lua-desync=hostfakesplit:host=vk.com:tcp_ts=-1000:tcp_md5:repeats=4

# YouTube: без изменений, как в рекомендуемой
host=vk.com
Единственное отличие от рекомендуемой. ТСПУ относится к отечественному трафику мягче, и фейк «под VK» проходит там, где фейк «под Google» режут. Это заметный тренд последних лет: в других наборах для той же цели берут Ozon или облако Сбера.
YouTube остаётся на google-фейке
Сознательно. Для видеосерверов Google фейк «под VK» не годится: там нужен обычный рабочий профиль, и подмена домена только мешает.

Когда брать. Первым делом после рекомендуемой, особенно в характерной ситуации: в диагностике всё зелёное, а Discord всё равно не открывается.

Комбо, Flowseal ALT10 (двойной fake + ts)

Когда не работают голос и медиа
# Discord и остальной TLS: два фейка подряд
--lua-desync=fake:blob=tls_google:tcp_ts=-1000:repeats=6
--lua-desync=fake:blob=tls_vk:tcp_ts=-1000:repeats=6

# YouTube
--lua-desync=fake:blob=tls_google:tcp_ts=-1000:ip_id=zero:repeats=6

# голос: отечественный блоб вместо google
--lua-desync=fake:blob=quic_vk:repeats=6
никакой разрезки
Настоящий пакет не трогается вообще. Вся работа делается фейками. Именно поэтому стратегия часто чинит медиа и голос: разрезка иногда пускает только в логин, а дальше соединения ведут себя иначе и ломаются.
два фейка подряд
Сначала «под Google», сразу за ним «под VK». Расчёт на то, что хотя бы один из двух устроит конкретную железку. Дешёвая страховка: лишний фейк всё равно умрёт по дороге.
только tcp_ts
Единственный способ убийства фейка. Отсюда важное следствие: стратегия полностью зависит от включённых TCP timestamps. Программа включает их сама на время сеанса, но если бы не включала, стратегия молча ничего не делала бы.
ip_id=zero
Обнуляет поле идентификатора в заголовке IP у фейка. Дополнительный признак, по которому часть DPI отличает пакеты и обрабатывает их иначе.
blob=quic_vk для голоса
Голосовой мусор тоже отечественный. На части сетей именно это чинит пинг 5000 и «подключается, но никого не слышно».

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

Комбо, Flowseal ALT11 (fake+ts, затем seqovl)

Фейк и разрезка внахлёст
# Discord
--lua-desync=fake:blob=tls_google:tcp_ts=-1000:repeats=6
--lua-desync=multisplit:pos=1,midsld:seqovl=681:seqovl_pattern=tls_google:optional

# остальной TLS: то же, но перекрытие 664 байта
# голос: quic_vk, как в ALT10
fake сначала, разрезка потом
Порядок принципиален. Фейк с временной меткой идёт первым и «готовит» соединение, и только после этого применяется разрезка с перекрытием. Без этой подготовки большое перекрытие ломало бы подключение к gateway.
seqovl=681
Перекрытие: к началу настоящего пакета дописывается 681 байт постороннего содержимого, так что DPI и сервер собирают поток по-разному. Для multisplit это число байт, а не позиция. У multidisorder тот же параметр означает совсем другое.
seqovl_pattern=tls_google
Дописывается не случайный мусор, а настоящее приветствие от Google. Правдоподобное начало переживает проверки, которые случайные байты не проходят.
:optional
Если разрезка по каким-то причинам не применилась, приём тихо пропускается, а не роняет всю обработку соединения.
664 вместо 681
Для профиля «остальное» перекрытие чуть меньше. Значения подобраны эмпирически в исходном наборе Flowseal и перенесены как есть.

Когда брать. Сразу после ALT10, если та не зашла. Это два варианта одной идеи от одного автора.

Комбо, Flowseal (multisplit seqovl)

Разрезка запроса
# Discord
--lua-desync=multisplit:pos=2:seqovl=681:seqovl_pattern=tls_google:optional

# YouTube: то же плюс ip_id=zero
# остальное: перекрытие 568
никаких фейков
Чистая разрезка с перекрытием, без единого поддельного пакета. Значит, никакого fooling не нужно вовсе, и стратегия не зависит от TCP timestamps и от поведения домашнего роутера. Самая «нетребовательная» из всех.
pos=2
Одна точка разреза, после второго байта. Здесь второй маркер не нужен, потому что основную работу делает перекрытие, а не сам разрез.

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

Комбо, Flowseal ALT (fake + fakedsplit)

Фейк и ложная разрезка
# одинаково для Discord, YouTube и остального
--lua-desync=fake:blob=tls_google:tcp_ts=-1000:repeats=6
--lua-desync=fakedsplit:tcp_ts=-1000
fakedsplit
Разрезка, при которой между настоящими сегментами вставляются поддельные. Ключевое отличие от multisplit: fooling применяется только к поддельным сегментам, поэтому tcp_ts здесь безопасен. У multisplit он подействовал бы и на настоящие сегменты и сломал бы соединение.
одинаково для всех
Единственная стратегия, где все три профиля TLS используют один и тот же приём. Простая и предсказуемая, удобна как контрольная точка при переборе.

Когда брать. Если и фейки по отдельности, и чистая разрезка не помогли. Иногда работает именно их сочетание.

Комбо, окно (wssize)

Дробит ответ сервера
# Discord и остальной TLS
--lua-desync=multisplit:pos=2,midsld-2:seqovl=1:seqovl_pattern=tls_google:optional
--lua-desync=wssize:wsize=1:scale=6

# YouTube: fake + multidisorder, как в рекомендуемой
wssize
Единственная стратегия, которая работает с ответом сервера, а не с вашим запросом. Объявляется крошечное окно приёма, сервер вынужден отдавать ответ мелкими порциями, и DPI не собирает из него сигнатуру.
wsize=1:scale=6
Размер окна и множитель масштабирования. Комбинация даёт очень маленькое окно на первых пакетах, дальше оно восстанавливается.
цена
Дробление ответа означает больше пакетов и заметно медленнее загрузку. Это осознанный размен, поэтому стратегия и стоит в списке последней среди комбо.
midsld-2
Разрез на два байта левее середины домена. Смещения к маркерам записываются вот так.

Когда брать. Когда упрямо не открывается именно страница входа и ничего другое не помогло. Готовьтесь к тому, что будет медленнее.

Discord, голос (QUIC-фейк)

точечная Только голос Discord
# лёгкая разрезка управляющего соединения discord.media
--filter-tcp=443-65535 --filter-l7=tls {HOSTLIST:discord}
--lua-desync=multisplit:pos=2,midsld-2:seqovl=1:seqovl_pattern=tls_google:optional
--new
# голос: фейк QUIC-блобом, без ограничения TTL
--filter-udp=19294-19344,50000-65535 --filter-l7=discord,stun
--lua-desync=fake:blob=quic_google:repeats=6
это не комбо
YouTube и остальной трафик не трогаются вообще. Стратегия чинит одну конкретную вещь, и только её.
без ip_autottl
Главное отличие от голосового профиля в комбо. Подбор TTL зависит от маршрута и на некоторых сетях мешает. Здесь его нет, фейк просто отбрасывается сервером как мусор.
repeats=6
Больше повторов, чем в комбо, потому что нет второго механизма и вся надежда на то, что DPI заметит фейк.

Когда брать. Ровно один случай: текст в Discord работает, а в голосовом канале вечное подключение, пинг 5000 или никого не слышно.

Discord, адаптивный (circular)

экспериментальная Подбирает способ на ходу
--filter-tcp=443-65535 --filter-l7=tls {HOSTLIST:discord}
--in-range=-s5556 --out-range=-d10 --payload=tls_client_hello
--lua-desync=circular:fails=2:time=300
  # вариант 1: hostfakesplit
  --lua-desync=hostfakesplit:host=www.google.com:tcp_ts=-1000:tcp_md5:repeats=4:strategy=1
  # вариант 2: двойной fake
  --lua-desync=fake:blob=tls_google:tcp_ts=-1000:repeats=6:strategy=2
  --lua-desync=fake:blob=tls_vk:tcp_ts=-1000:repeats=6:strategy=2
  # вариант 3: fake плюс перекрытие
  --lua-desync=fake:blob=tls_google:tcp_ts=-1000:repeats=6:strategy=3
  --lua-desync=multisplit:pos=1,midsld:seqovl=681:seqovl_pattern=tls_google:strategy=3:optional
circular
Не приём, а распорядитель: он переключает варианты сам, когда его детектор ловит провал. Успешный вариант больше не трогается, и всё это происходит на лету, без перезапуска движка.
fails=2:time=300
Переключаться после двух неудач; окно счёта 300 единиц времени.
strategy=1, 2, 3
Метки вариантов. Нумерация начинается с единицы и идёт без пропусков. Внутри одного варианта может быть несколько приёмов, как в варианте 2.
три независимо рабочих варианта
Это не случайный набор: 1 повторяет рекомендуемую, 2 повторяет ALT10, 3 повторяет ALT11. То есть перебираются три подхода, каждый из которых у кого-то работает сам по себе.
--in-range обязателен
Без кэша входящих пакетов детектор не увидит сброс от DPI и переключаться будет нечему. Пропустить этот флаг означает получить неработающую ротацию.

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

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

Какую брать под какой симптом

Что происходитЧто пробовать
Ничего не пробовал, просто нужно чтобы работало Комбо (рекомендуемый), оно уже включено
В диагностике зелёное, а Discord не открывается Отечественный (VK), затем ALT10
Вход проходит, но не подключает к серверам, не грузятся вложения ALT10, затем ALT11
Текст работает, голос молчит или пинг 5000 Discord, голос (QUIC-фейк), затем ALT10
Фейковые пакеты не помогают ни в одном варианте Flowseal (multisplit seqovl): там фейков нет вовсе
Упрямо не открывается страница входа Окно (wssize), приготовьтесь к замедлению
Discord работает через раз, нестабильно Адаптивный (circular)
YouTube открывается, видео бесконечно грузится Стратегия ни при чём: отключите QUIC в настройках
Перепробовал всё «Подобрать», затем «Сгенерировать» на вкладке Диагностика

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