Zapret2 для новичков — 06: Lua pipeline (инстансы, аргументы, дебаг)

Цель: понять, как читается строка --lua-desync=..., что такое “инстанс”, как данные переходят между функциями, и как дебажить без хаоса.

1) Инстанс: что это

Каждая опция --lua-desync=... создаёт инстанс:

  • имя функции (например fake)
  • набор аргументов (desync.arg)
  • позиция в профиле (порядок выполнения)

Инстансы выполняются строго по порядку, в рамках активного профиля.

2) Синтаксис аргументов (важная мелочь)

Формат:

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