todo/Zapret/manual/zapret2_06.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

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] Резервное зеркало Актуальная версия этой страницы — на основной вики: wiki.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 обучения]]