todo/Zapret2/roadmap обучения.md
loop-uh 0ad0bcc8dd
Some checks failed
Published content check / validate (push) Failing after 5s
seo+зеркало: [!mirror]-плашка со ссылкой на вики и description во frontmatter всех заметок
Каждая публикуемая заметка получила callout-шапку со ссылкой на свою страницу
wiki.zapret.moe (на самой вики она вырезается транформером RemoveMirrorCallout,
видна только на зеркале Obsidian Publish и в Forgejo) и SEO-поле description —
1–2 предложения для meta description обоих сайтов.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 22:05:57 +03:00

236 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-01-21
tags:
- zapret
- zapret2
- nfqws2
- winws2
- networking
- learning
aliases:
- Zapret2 обучение
- Zapret2 roadmap
description: "Учебный roadmap по Zapret2 (nfqws2/winws2): от основ TCP/IP до чтения кода и стратегий lua-desync — карта репозитория, уровни, лабораторные."
---
> [!mirror] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki.zapret.moe/Zapret2/roadmap-обучения](https://wiki.zapret.moe/Zapret2/roadmap-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F)
# 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 недели” (по 3060 минут в день)
### Неделя 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) День 67: маркеры `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: составить свой “микро‑профиль” из 23 `--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, дебаг]]`