# Zapret2: учебный roadmap “как это работает по коду”
Цель: дать **простую, но технически точную** картину того, что делает zapret2 (nfqws2/winws2) в сетевом стеке, и провести новичка-айтишника от базовых понятий TCP/IP до чтения кода и понимания стратегий `lua-desync`.
Этот roadmap — не “пресеты для обхода”, а **учебная карта**: что читать, что потрогать руками, и на какие файлы/функции смотреть, чтобы “в голове сложилось”.
## 0) Минимальная ментальная модель (в 30 секунд)
Zapret2 — это “перехватчик пакетов”:
1) ОС/драйвер отдаёт программе **сырые пакеты** (raw IPv4/IPv6).
2) zapret2 делает **диссекцию** (разбирает пакет в структуру: IP/TCP/UDP/payload).
3) выбирает “профиль” и запускает цепочку Lua-инстансов `--lua-desync=...`
4) Lua может:
- отправить дополнительные пакеты (`fake`, `multisplit`, `send`, …),
- изменить текущий пакет (`pktmod` → `VERDICT_MODIFY`),
- заблокировать текущий (`VERDICT_DROP`),
- либо ничего не делать (`VERDICT_PASS`).
Главная идея анти‑DPI техник: заставить DPI “увидеть” одно, а конечный сервер/клиент — другое, используя различия в разборе, реассемблировании и обработке TCP/IP.
## 1) Словарь (обязательно выучить)
Если эти слова “не встают на место”, понимание кода будет мучительным:
- **raw packet**: байты IPv4/IPv6 пакета как есть.
- **dissect (диссект)**: таблица/структура вида `ip`, `ip6`, `tcp`, `udp`, `payload`.
- **reconstruct (реконструкция)**: собрать raw-пакет обратно из диссекта.
- **flow / connection (поток/соединение)**: набор пакетов, которые относятся к одному TCP/UDP обмену.
- **conntrack / track**: состояние потока, счётчики и кэш для Lua (`desync.track`).
- **l7proto**: протокол потока (tls/http/quic/…).
- **l7payload**: тип полезной нагрузки текущего пакета/группы (tls_client_hello/http_req/quic_initial/…).
- **reasm_data**: реассемблированные данные (например, ClientHello в нескольких TCP сегментах).
- **replay**: механизм “задержать и переиграть” куски, чтобы сначала запустить Lua и/или собрать reasm.
- **VERDICT_PASS / MODIFY / DROP**: решение по текущему перехваченному пакету.
- **instance cutoff**: добровольно выключить инстанс (или целый профиль) по направлению, чтобы не грузить CPU дальше.
## 2) Карта кода (куда смотреть в репозитории)
Опорные файлы/папки, которые дают 80% понимания:
- `nfq2/nfqws.c` — “вход” (main), разбор CLI, приём пакетов из NFQUEUE и вызов `dpi_desync_packet(...)`.
- `nfq2/desync.c` — ядро обработки пакета: диссекция, выбор профиля, replay/reasm, вызов Lua, вердикт, checksum/fixups.
- `nfq2/protocol.c` — распознавание payload’ов и TLS-модификации (`TLSMod` для `tls_mod=...`).
- `lua/zapret-lib.lua` — библиотека: rawsend, сегментация по MSS, apply_fooling, маркеры `resolve_pos`, `luaexec`, `argdebug`, `posdebug`.
- `lua/zapret-antidpi.lua` — набор “готовых” стратегий: `fake`, `multisplit`, `multidisorder`, …
- `docs/manual.md` — справочник по параметрам и механизмам.
## 3) Уровни обучения (Roadmap)
Ниже — “уровни” как в игре: каждый даёт новую часть картины.
### Уровень A — TCP/IP база (без этого всё остальное “в воздухе”)
**Что понять:**
- чем отличается IP от TCP/UDP
- что такое TCP sequence/ack и почему “переупорядочивание” важно
- что такое MSS/MTU и почему сегментация бывает “двух уровней” (TCP сегменты vs IP фрагменты)
- что такое checksum и почему `badsum` влияет на прием
**Практика (самое простое):**
- прочитать “TCP header + seq/ack + flags” и объяснить словами, что делает `SYN`, `ACK`, `RST`, `URG`.
### Уровень B — Перехват пакетов: где zapret “сидит”
**Задача:** понять, что программа стоит “между” сетевым стеком и сетью.
- Linux: NFQUEUE → userspace → verdict обратно в kernel.
- Windows: WinDivert → userspace → reinject/modify/drop.
**Где смотреть в коде:**
- `nfq2/nfqws.c` (NFQUEUE callback, передача raw байтов в обработчик)
- `nfq2/desync.c` (главный pipeline)
**Контрольное понимание:**
1) что такое “перехваченный пакет”
2) что означает “вердикт DROP” в точке перехвата
3) почему `fake` может отправить пакет, но “оригинал” всё равно пойдёт дальше (если его не дропнуть)
### Уровень C — Dissect/Reconstruct: “пакет как структура”
**Задача:** привыкнуть, что пакет в коде — это не “байты”, а структура.
**Смотреть:**
- `lua/zapret-lib.lua` (функции отправки, реконструкции, checksum и т.п.)
- `docs/manual.md` разделы про “standard reconstruct” / “rawsend” / “диссекция”
**Контрольное понимание:**
- почему `VERDICT_MODIFY` обычно означает “пересобрать пакет из диссекта”, а не “поправить пару байтов”
### Уровень D — Распознавание протоколов и payload’ов
**Задача:** отличать:
- `--filter-l7=tls` (протокол потока)
- `--payload=tls_client_hello` (тип текущей полезной нагрузки)
**Смотреть:**
- `docs/manual.md` “Распознавание протоколов”
- `nfq2/protocol.c` (логика детектов; TLS/HTTP/QUIC)
**Почему это важно:**
Маркеры (`host`, `midsld`, `sniext`, …) работают только когда запущена правильная “логика понимания payload”.
### Уровень E — reasm / replay: “почему иногда нужен кусок будущего”
**Задача:** понять, зачем `reasm_data` и почему некоторые payload’ы (например TLS ClientHello) приходят частями.
**Смотреть:**
- `docs/manual.md` про “особенности приема многопакетных пейлоадов”
- `lua/zapret-antidpi.lua`: `multisplit`/`multidisorder` используют `desync.reasm_data` если есть
### Уровень F — Lua pipeline: что такое `--lua-desync`
**Ключевые мысли:**
- профиль — это цепочка инстансов `--lua-desync=...` в порядке указания
- каждый инстанс получает `desync` (диссект + контекст потока + аргументы)
- вердикт строится по приоритету `DROP > MODIFY > PASS`
- можно резать/ограничивать вызовы через `--payload`, `--out-range`, `instance_cutoff`
**Смотреть:**
- `docs/manual.md` “Вызов Lua кода”
- `lua/zapret-lib.lua`: `luaexec`, `argdebug`, `posdebug`
### Уровень G — Стратегии (на пальцах + по коду)
Сначала учим 3 опорные техники:
- `fake` — отправить ложный пакет (см. `[[fake]]`)
- `multisplit` — разрезать payload на сегменты по маркерам (см. `[[multisplit]]`)
- `multidisorder` — разрезать и отправить сегменты в обратном порядке (см. `[[multidisorder]]`)
Потом добавляем “слои”:
- `fooling` (TTL, tcp_md5, flags…) — чтобы фейки не принимались сервером
- `seqovl` — скрытый фейк внутри реального сегмента (на уровне sequence)
- `ipfrag` — IP-фрагментация поверх TCP-сегментации
## 4) Лабораторные (простые упражнения, чтобы “пощупать” код)
Это можно делать даже без глубоких знаний: важно смотреть логи и связывать их с параметрами.
### Лаба 1 — увидеть `desync` живьём
В профиль добавь:
```bash
--lua-desync=pktdebug
```
Цель: увидеть структуру `desync` (где tcp/ip/payload, где track, где l7payload).
### Лаба 2 — увидеть аргументы инстанса
```bash
--lua-desync=argdebug:dir=out:payload=tls_client_hello:tcp_md5
```
Цель: привыкнуть к синтаксису `arg1[=val]:flag`.
### Лаба 3 — увидеть счётчики conntrack и reasm/replay
```bash
--lua-desync=posdebug
```
Цель: понять `n/d/b/s/p` и где появляется `reasm`/`decrypt`/`replay`.
### Лаба 4 — сделать “мини‑эксперимент” через `luaexec`
```bash
--lua-desync=luaexec:code="DLOG('len payload '..#desync.dis.payload)"
```
Цель: понять, что Lua — это “инструмент”, а не магия: он читает/пишет поля, и всё остальное — отправка/реконструкция.
## 5) Рекомендованный порядок чтения твоих заметок (индекс)
1) `[[Zapret2 - lua-desync]]` (как передаются аргументы и как устроены инстансы)
2) `[[Zapret2 - payload]]` (payload types, зачем фильтровать)
3) `[[Zapret2 - out-range]]` (ограничение вызовов по фазам потока)
4) `[[Zapret2 - blob]]` (как загружать бинарные данные)
5) `[[fake]]` → `[[multisplit]]` → `[[multidisorder]]`
## 6) Дорожная карта “на 2 недели” (по 30–60 минут в день)
### Неделя 1 — “собрать картину”
1) День 1: словарь + что такое `VERDICT_*`
2) День 2: TCP seq/ack + MSS/MTU (почему есть “двойная сегментация”)
3) День 3: `--payload` vs `--filter-l7`
4) День 4: `pktdebug/argdebug/posdebug` (смотреть логи)
5) День 5: `fake` (понять, почему без DROP это “второй пакет”)
6) День 6–7: маркеры `resolve_pos` и идея `pos=host,midsld,endhost`
### Неделя 2 — “читать стратегии как код”
1) День 8: `multisplit` (pos + seqovl + nodrop)
2) День 9: `multidisorder` (обратный порядок + seqovl‑маркер)
3) День 10: standard fooling (TTL/MD5/flags/badsum)
4) День 11: ipfrag (как отдельный слой после сегментации)
5) День 12: reasm/replay и почему “режем reasm только один раз”
6) День 13: составить свой “микро‑профиль” из 2–3 `--lua-desync` и объяснить словами зачем каждый
7) День 14: ревизия: можешь ли ты по команде `--lua-desync=...` предсказать “что улетит в сеть” и “что будет с оригиналом”
## 7) Что сделаем дальше (следующий шаг документации)
Если хочешь, я разверну этот roadmap в **набор уроков** (несколько файлов):
- Урок 01: “Пакет → диссект → реконструкция”
- Урок 02: “payload types и маркеры”
- Урок 03: “Lua pipeline, инстансы, вердикты”
- Урок 04: “fake + fooling”
- Урок 05: “multisplit/multidisorder + seqovl”
- Урок 06: “ipfrag, MSS и почему порядок важен”
И добавлю “мини‑чеклисты” вроде: *“как понять, что сейчас ломает соединение”* и *“как дебажить стратегию без хаоса”*.
### Уже добавленные “уроки для новичков”
- `[[Zapret2 - 01 - Сетевой стек для новичков (L2-L7)]]`
- `[[Zapret2 - 02 - TCP для новичков (seq/ack, окна, MSS)]]`
- `[[Zapret2 - 03 - Перехват пакетов и вердикты (NFQUEUE/WinDivert)]]`
- `[[Zapret2 - 04 - Dissect/Reconstruct и структура desync]]`
- `[[Zapret2 - 05 - Payload types, reasm/replay и маркеры]]`
- `[[Zapret2 - 06 - Lua pipeline: инстансы, args, дебаг]]`