# Zapret2 для новичков — 06: Lua pipeline (инстансы, аргументы, дебаг)
Цель: понять, как читается строка `--lua-desync=...`, что такое “инстанс”, как данные переходят между функциями, и как дебажить без хаоса.
## 1) Инстанс: что это
Каждая опция `--lua-desync=...` создаёт **инстанс**:
- имя функции (например `fake`)
- набор аргументов (`desync.arg`)
- позиция в профиле (порядок выполнения)
Инстансы выполняются **строго по порядку**, в рамках активного профиля.
## 2) Синтаксис аргументов (важная мелочь)
Формат:
```text
--lua-desync=function:arg1[=val1]:arg2[=val2]:flag3:flag4
```
Особенность:
- все значения — строки
- если `=val` отсутствует, значение считается пустой строкой `""` (а это “true” в Lua)
Поэтому “флаги” пишутся как:
- `:optional`, `:nodrop`, `:tcp_ts_up`, `:ipfrag`, `:ipfrag_disorder`
## 3) Как стандартные блоки “прикручиваются” к стратегиям
Большинство стратегий не реализуют “отправку” вручную.
Они вызывают общий отправщик, который:
- делает deepcopy диссекта при необходимости
- применяет `apply_fooling` (TTL/MD5/flags/…)
- при необходимости режет payload по MSS
- применяет `ip_id` политику
- затем может применить `ipfrag` (L3 фрагментацию)
- и в конце делает `rawsend`
Из-за этого “standard args” работают согласованно и предсказуемо.
## 4) Вердикт и приоритет
Каждый инстанс возвращает:
- `PASS` (ничего не блокировать)
- `DROP` (заблокировать перехваченный пакет)
- `MODIFY` (передать изменённый пакет)
Итоговый вердикт по пакету выбирается с приоритетом:
`DROP > MODIFY > PASS`.
Практический вывод:
- достаточно одного `DROP`, чтобы оригинал не ушёл
- `fake` может отправить “доп. пакет”, но если оригинал не дропнут — он уйдёт
## 5) Cutoff: как перестать вызываться и сэкономить CPU
В zapret2 есть идея “самоотсечения”:
- инстанс может выключить себя (по направлению)
- или выключить весь Lua профиль (lua cutoff)
Это нужно, чтобы после “критической фазы” (например первых N пакетов) больше не тратить ресурсы на Lua.
## 6) 3 инструмента дебага (must-have)
### `argdebug`
Печатает `desync.arg` текущего инстанса.
### `posdebug`
Печатает счётчики conntrack (`n/d/b/s/p`) и статус `reasm/decrypt/replay`.
### `pktdebug`
Печатает весь `desync` (много текста, но иногда незаменимо).
## 7) Мини‑рецепт “дебажим стратегию без каши”
1) ограничить профиль по `--payload=...` и `--out-range=...`
2) поставить `--lua-desync=posdebug` первым
3) поставить тестируемую стратегию
4) при необходимости — `argdebug` рядом
Так вы увидите:
- когда стратегия сработала
- на каком payload’е
- был ли reasm/replay
## 8) Что читать дальше
- `[[fake]]`, `[[multisplit]]`, `[[multidisorder]]`
- `[[Zapret2 - Roadmap обучения]]`