---
date: 2026-01-21
tags:
  - zapret
  - zapret2
  - lua
  - learning
aliases:
  - Zapret2 учебник 06
---

# 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 обучения]]`

