todo/Zapret/manual/zapret2_06.md
loop-uh 737f065567 Вики переехала на wiki2.zapret.moe: домен заменён во всём хранилище
wiki.zapret.moe заблокирован в России, читатели до редиректа не доходят. Во всех заметках, плашках [!mirror], ссылках и скриптах домен заменён на wiki2.zapret.moe; в AGENTS.md записано правило — ссылаться только на wiki2. Скрипт статистики считает своими заходы с обоих доменов. Чужие незакоммиченные правки в nuc/ в коммит не попали — только замена домена.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:15:27 -04:00

4.6 KiB
Raw Permalink Blame History

date tags aliases description
2026-01-21
zapret
zapret2
lua
learning
Zapret2 учебник 06
Урок 06 по Zapret2: Lua pipeline — инстансы --lua-desync, синтаксис аргументов, вердикты PASS/DROP/MODIFY, cutoff и дебаг argdebug, posdebug.

[!mirror] Резервное зеркало Актуальная версия этой страницы — на основной вики: wiki2.zapret.moe/Zapret/manual/zapret2_06

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