# 14. Руководство по Zapret v2 (nfqws2): Архитектура, Lua-десинхронизация и Стратегии ## 1. Введение и Архитектурные отличия Zapret v2 Zapret v2 (`nfqws2`) — это эволюция классического `nfqws`, переписанная с акцентом на **модульную Lua-логику десинхронизации** и высокопроизводительное мультипрофилирование. В отличие от Zapret v1, где все параметры передавались через монолитные CLI-флаги `--dpi-desync-*`, в `nfqws2` обработка пакетов построена на вызове Lua-скриптов (`--lua-init`) и специализированных действий `--lua-desync`. ### Ключевые преимущества `nfqws2`: 1. **Мультипрофилирование в одном процессе:** возможность разделять правила для разных протоколов (HTTP, TLS, QUIC, UDP Voice) и диапазонов портов без запуска отдельных демонов. 2. **Гибкое позиционирование фрагментов (`pos`):** поддержка составных позиций сплита (`pos=1,midsld,sniext+4`), позволяющих резать пакет ровно в уязвимых местах сигнатур DPI. 3. **Управление перекрытием (`seqovl`):** внедрение контролируемого наложения TCP Sequence чисел (`seqovl=1..2`), сбивающего стейтфул-реассемблеры ТСПУ. 4. **Контроль размера TCP окна (`wsize`):** принудительное занижение Window Size в исходящих пакетах (`wsize=1`), заставляющее сервер и стек дробить поток на однобайтовые сегменты. --- ## 2. Формат командной строки и Lua-инициализация Tachyon запускает `nfqws2` со стандартным набором Lua-библиотек из `/opt/zapret2/lua/`: ```bash /opt/zapret2/nfq2/nfqws2 \ --qnum= \ --fwmark= \ --lua-init=@/opt/zapret2/lua/zapret-lib.lua \ --lua-init=@/opt/zapret2/lua/zapret-antidpi.lua \ --lua-init=@/opt/zapret2/lua/zapret-auto.lua \ [СТРАТЕГИИ] ``` --- ## 3. Функции Lua-десинхронизации (`--lua-desync`) В `nfqws2` действия десинхронизации задаются через параметр `--lua-desync=<функция>[:ключ=значение[:ключ2=значение2]]`. ### 3.1. `multisplit` (Многосегментная фрагментация) Основная и самая эффективная функция против современных ТСПУ. - **Синтаксис:** `--lua-desync=multisplit:pos=<позиции>[:seqovl=][:fooling=<метод>][:wsize=]` - **Параметры `pos`:** - `pos=1` — сплит на 1-м байте payload (режет TLS ClientHello на этапе Handshake Type). - `pos=midsld` — сплит посередине Second Level Domain внутри SNI (например, `you` | `tube.com`). - `pos=sniext` — сплит в начале блока расширений TLS SNI. - `pos=sniext+4` — сплит на 4 байта глубже расширения SNI (разрывает парсер расширений DPI). - `pos=1,midsld,sniext+2` — тройной сплит, создающий 3 фрагмента с высоким уровнем энтропии. - **Параметр `seqovl` (Sequence Overlap):** - `seqovl=1` или `seqovl=2` — второй фрагмент отправляется со сдвигом TCP Sequence назад на 1–2 байта. DPI видит конфликт перекрытия данных и пропускает поток, в то время как целевой сервер корректно отбрасывает дублирующийся байт. - **Параметр `wsize`:** - `wsize=1` — зажимает размер TCP-окна, препятствуя реассемблингу со стороны DPI. ### 3.2. `fake` (Инжекция фейковых пакетов) Отправка ложного ClientHello с некорректным SNI или контрольной суммой перед настоящим пакетом. - **Синтаксис:** `--lua-desync=fake[:ttl=][:fooling=<метод>]` - **Параметры:** - `ttl=6` / `ttl=8` — Time-To-Live фейкового пакета. Должен быть достаточным, чтобы долететь до ТСПУ провайдера, но недостаточным, чтобы дойти до сервера назначения. - `fooling=badseq` — отправка фейка с невалидным TCP Sequence номером. - `fooling=md5sig` — добавление TCP Option 19 (MD5 Signature) в фейковый пакет. ТСПУ часто пассивно анализирует такой пакет и сбрасывает стейт сессии, а сервер назначения дропает его из-за отсутствия MD5-ключа. ### 3.3. `split2` и `disorder2` - `split2:pos=` — классическое деление пакета на 2 части в указанной позиции. - `disorder2:pos=` — деление на 2 части с обратным порядком отправки (сначала хвост, затем голова). --- ## 4. Методы дурения DPI (`fooling`) | Метод | Механизм действия | Когда применять | |---|---|---| | `badseq` | Фейковый пакет имеет ACK/SEQ вне текущего окна TCP. | Универсально против большинства ТСПУ (Ростелеком, МТС, Мегафон, Билайн). | | `md5sig` | Пакет содержит TCP MD5 Signature Option (RFC 2385). | Эффективно, если ТСПУ валидирует опции TCP и дропает сессию. | | `badack` | Инвертированный или повреждённый ACK-номер. | Против DPI с жестким контролем двустороннего TCP-хэндшейка. | | `datanoack` | Данные в сегменте передаются без флага ACK. | Обход сигнатур, триггерящихся только на валидные ACK-сегменты. | --- ## 5. Готовые шаблоны стратегий под сервисы ### YouTube 4K (GoogleVideo chunk stream) ```text --lua-desync=multisplit:pos=1,midsld:seqovl=1:fooling=badseq ``` *Разрывает SNI googlevideo и ClientHello, предотвращая троттлинг видеопотока 2160p60.* ### Discord (Gateway, API и Голосовые каналы UDP) ```text --filter-tcp=443 --lua-desync=multisplit:pos=1,sniext+4:seqovl=1:fooling=badseq --new --filter-udp=50000-65535 --lua-desync=fake:ttl=8 ``` *Комбинированный профиль: TCP 443 для шлюза сообщений и UDP-фейк для RTC Voice серверов.* ### Instagram & Meta (TLS 1.3 / ECH) ```text --lua-desync=fake:ttl=8 --lua-desync=multisplit:pos=midsld:fooling=badseq ``` *Низко-TTL фейк перегружает стейт ТСПУ, после чего фрагментированный TLS 1.3 хэндшейк проходит без сброса.*