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

108 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-01-21
tags:
- zapret
- zapret2
- lua
- learning
aliases:
- Zapret2 учебник 06
description: "Урок 06 по Zapret2: Lua pipeline — инстансы --lua-desync, синтаксис аргументов, вердикты PASS/DROP/MODIFY, cutoff и дебаг argdebug, posdebug."
---
> [!mirror] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki.zapret.moe/Zapret/manual/zapret2_06](https://wiki.zapret.moe/Zapret/manual/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 обучения]]`