Files
NeoTachyon/docs/knowledge-base/14_ZAPRET2_DEEP_DIVE_MANUAL.md
T

7.6 KiB
Raw Blame History

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/:

/opt/zapret2/nfq2/nfqws2 \
  --qnum=<QNUM> \
  --fwmark=<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=<N>][:fooling=<метод>][:wsize=<N>]
  • Параметры 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=<N>][: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=<N> — классическое деление пакета на 2 части в указанной позиции.
  • disorder2:pos=<N> — деление на 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)

--lua-desync=multisplit:pos=1,midsld:seqovl=1:fooling=badseq

Разрывает SNI googlevideo и ClientHello, предотвращая троттлинг видеопотока 2160p60.

Discord (Gateway, API и Голосовые каналы UDP)

--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)

--lua-desync=fake:ttl=8 --lua-desync=multisplit:pos=midsld:fooling=badseq

Низко-TTL фейк перегружает стейт ТСПУ, после чего фрагментированный TLS 1.3 хэндшейк проходит без сброса.