Some checks failed
Published content check / validate (push) Failing after 5s
Каждая публикуемая заметка получила callout-шапку со ссылкой на свою страницу wiki.zapret.moe (на самой вики она вырезается транформером RemoveMirrorCallout, видна только на зеркале Obsidian Publish и в Forgejo) и SEO-поле description — 1–2 предложения для meta description обоих сайтов. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
108 lines
4.6 KiB
Markdown
108 lines
4.6 KiB
Markdown
---
|
||
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 обучения]]`
|
||
|