7.6 KiB
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:
- Мультипрофилирование в одном процессе: возможность разделять правила для разных протоколов (HTTP, TLS, QUIC, UDP Voice) и диапазонов портов без запуска отдельных демонов.
- Гибкое позиционирование фрагментов (
pos): поддержка составных позиций сплита (pos=1,midsld,sniext+4), позволяющих резать пакет ровно в уязвимых местах сигнатур DPI. - Управление перекрытием (
seqovl): внедрение контролируемого наложения TCP Sequence чисел (seqovl=1..2), сбивающего стейтфул-реассемблеры ТСПУ. - Контроль размера 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 хэндшейк проходит без сброса.