92 lines
7.6 KiB
Markdown
92 lines
7.6 KiB
Markdown
# 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=<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)
|
||
```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 хэндшейк проходит без сброса.*
|