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

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] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki2.zapret.moe/Zapret/manual/zapret2_06](https://wiki2.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 обучения]]`