todo/Zapret2/структура проекта.md
loop-uh 08b4491545
Some checks failed
Published content check / validate (push) Failing after 3s
Завершить переезд базы знаний на Forgejo
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
2026-08-07 08:27:28 +03:00

125 lines
15 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-07-17
tags:
- zapret
- zapret2
- nfqws2
- lua
- architecture
- overview
link: https://github.com/bol-van/zapret2/blob/master/docs/manual.md
aliases:
- Структура проекта Zapret 2
- Из чего состоит zapret2
- Компоненты zapret2
---
# 🗂️ Структура проекта Zapret 2
> [!info] О чём заметка
> Из каких частей состоит [[Zapret2/Zapret2|Zapret 2]] и за что каждая отвечает: C-ядро `nfqws2`, Lua-код с логикой обхода, средства перехвата трафика в разных ОС, а также второстепенные скрипты запуска и утилиты. Изложено проще, чем в официальной документации, но без потери деталей.
## TL;DR
- **`nfqws2`** (`winws2` на Windows, `dvtws2` на BSD) — ядро на C. Перехватывает пакеты, фильтрует, распознаёт протоколы, ведёт списки — но **сам трафик не «дурит»**.
- **Lua-код** — вся логика обхода DPI. Главные файлы: `zapret-lib.lua` (хелперы), `zapret-antidpi.lua` (приёмы атак на DPI), `zapret-auto.lua` (динамические решения).
- **Перехват из ядра ОС**: Linux — `iptables`/`nftables`, FreeBSD — `ipfw`, OpenBSD — `pf`, Windows — драйвер WinDivert внутри `winws2`.
- **Минимальное ядро проекта** = перехват из ядра + `nfqws2` + Lua-код. Всё остальное (скрипты запуска, `blockcheck2`, `mdig`, `ip2net`) — второстепенное и опциональное.
- **macOS не поддерживается** — в системе нет подходящего средства перехвата пакетов.
## Главный компонент — `nfqws2` (C-ядро)
Центральная программа проекта называется `nfqws2` на Linux, `dvtws2` на BSD-системах и `winws2` на Windows. Это один и тот же **пакетный манипулятор**, написанный на C (что такое пакетный манипулятор и почему автор называет инструмент именно так — см. [[Zapret2/Zapret2|обзор Zapret 2]]). C выбран ради скорости: обработка идёт для каждого пакета в реальном времени, и медленный язык здесь не годится.
`nfqws2` берёт на себя всю «черновую» и служебную работу:
- **перехват пакетов** — забирает пакеты из сетевого стека ОС, чтобы их можно было изменить до отправки;
- **базовая фильтрация** — отбирает только нужные пакеты (по порту, протоколу и т. д.), см. [[filter]];
- **распознавание основных протоколов и пейлоадов** — понимает, что внутри пакета: TLS ClientHello, HTTP-запрос, QUIC Initial и др. (payload = прикладные данные пакета, см. [[payload]]);
- **поддержка хост- и IP-листов** — списки доменов и адресов, для которых применять обход;
- **автоматические хостлисты с распознаванием блокировок** — умеет сам замечать, что соединение с доменом рвут, и заносить такой домен в список;
- **система множественных профилей (стратегий)** — можно задать несколько независимых наборов правил для разного трафика (см. [[preset|пресеты]] и [[profile|профили]]);
- **отправка raw-пакетов** — умеет формировать и слать «сырые» пакеты напрямую, в обход обычного сокета (на этом построены приёмы вроде [[fake]] и нарезки [[multisplit]]);
- прочие сервисные функции.
**Ключевой момент:** в самом `nfqws2` **нет логики воздействия на трафик**. Он умеет перехватить, распознать и отправить пакет, но *как именно* его переделать, чтобы обмануть DPI, — решает не он. Эта часть вынесена наружу, в Lua-код, который `nfqws2` вызывает.
> [!note] Проще говоря
> `nfqws2` — это «руки» проекта: ловит пакеты и отправляет их обратно, быстро и надёжно. А «мозги» — что делать с пакетом — лежат в отдельных Lua-скриптах. Такое разделение и есть главная идея Zapret 2 (в старом Zapret обе части были слиты в один C-код и менялись только пересборкой программы).
## Вторая по важности часть — Lua-код
Вся логика обхода живёт в Lua-файлах — обычных текстовых скриптах, которые `nfqws2` подгружает и вызывает. Именно их можно править без перекомпиляции программы. В базовый комплект входят:
- **`zapret-lib.lua`** — библиотека функций-хелперов. Вспомогательный «фундамент»: работа с blob-данными, нарезка и отправка сегментов, проверки направления и т. п. На эти функции опираются все остальные скрипты.
- **`zapret-antidpi.lua`** — библиотека самих приёмов автономных атак на DPI. Здесь лежат функции [[desync|дурения]]: [[fake]], [[multisplit]], [[multidisorder]], [[syndata]] и другие, вызываемые через флаг `--lua-desync`.
- **`zapret-auto.lua`** — библиотека функций принятия динамических решений (оркестрации): логика, которая на ходу выбирает, какой приём применить, в зависимости от поведения сети (см. [[оркестратор]]).
Дополнительно, вне обязательного минимума, идут:
- **`zapret-tests.lua`** — набор тестов C-функций (проверяет, что ядро правильно распознаёт протоколы, разрешает позиции разреза и т. д.);
- **`zapret-obfs.lua`** — средства обфускации трафика (маскировка протокола, а не обход, о котором говорит [[Zapret2/Zapret2|обзор]]);
- **`zapret-pcap.lua`** — запись дампа пакетов в `.cap`-файлы (для отладки — открывается в Wireshark).
> [!note] Требования к Lua
> Проект работает с **LuaJIT 2.1+** или с **PUC Lua 5.3+** (PUC Lua — эталонная реализация языка с сайта lua.org; LuaJIT — её быстрый JIT-вариант). Более старые версии могут быть несовместимы, не тестируются и не поддерживаются.
## Перехват трафика из ядра ОС
Чтобы `nfqws2` мог поймать пакет, его сначала нужно «завернуть» из сетевого стека операционной системы в программу. За это отвечают разные механизмы в разных ОС:
- **Linux** — `iptables` или `nftables` (штатные межсетевые экраны Linux; они направляют выбранные пакеты в очередь NFQUEUE, откуда их и забирает `nfqws2`);
- **FreeBSD** — `ipfw`;
- **OpenBSD** — `pf`;
- **Windows** — встроено прямо в процесс `winws2` через драйвер **WinDivert** (отдельный файрвол настраивать не нужно, `winws2` сам перехватывает пакеты).
> [!important] Что считается «ядром» проекта
> Схема перехвата из ОС + `nfqws2` + Lua-код — это **минимально рабочее ядро** Zapret 2. Всё остальное, описанное ниже, — дополнительное, второстепенное и опциональное: без него обход тоже работает, просто настраивать и обслуживать придётся вручную.
## Второстепенные компоненты
### Скрипты запуска (Linux) и `blockcheck2`
Под Linux в комплекте идут скрипты запуска: `init.d`, `common`, `ipset`, `install_easy.sh`, `uninstall_easy.sh`, а также средство автоматического подбора стратегий `blockcheck2`.
Их задача — **согласовать** подъём правил перехвата (таблиц файрвола) и запуск нужных инстансов `nfqws2`, а также учесть особенности интеграции в разные системы: OpenWrt, `systemd`, OpenRC. Дополнительно они обеспечивают поддержку и согласованное обновление разных списков и загрузку IP-листов в пространство ядра через **ipset** (механизм ядра Linux для хранения больших наборов IP-адресов, по которым файрвол проверяет пакеты быстро).
Всё это при желании можно сделать и **собственными средствами**, если так удобнее или штатные скрипты не подходят — они не обязательны.
> [!note] Файл config — только для скриптов запуска
> Скрипты запуска выносят все свои настройки в файл `config` в корне проекта. Важно: этот конфиг относится **только к ним**. Сам `nfqws2` о нём ничего не знает и его не читает — программе аргументы передаются напрямую (через флаги / [[preset|пресеты]]).
### Утилиты обработки листов: `mdig` и `ip2net`
Для работы со списками есть две отдельные C-программы:
- **`mdig`** — многопоточный резолвер хостлистов (переводит доменные имена в IP-адреса) неограниченного объёма. «Многопоточный» — значит обрабатывает множество доменов параллельно, поэтому справляется даже с очень большими списками.
- **`ip2net`** — группирует отдельные IP-адреса в подсети, чтобы сократить их количество. Вместо тысячи соседних адресов получается несколько компактных диапазонов — списки занимают меньше места и быстрее применяются.
Обе используются внутри скриптов запуска и в `blockcheck2`.
## Поддержка платформ
Скрипты запуска и инсталлятор рассчитаны на:
- классические дистрибутивы Linux с **systemd** или **OpenRC**;
- из прошивок — **OpenWrt**.
Если система под эти требования не подходит, возможна самостоятельная «доприкрутка» к системе — ядро проекта (`nfqws2` + Lua) от скриптов запуска не зависит.
> [!warning] macOS не поддерживается
> На macOS нет подходящего средства перехвата и управления пакетами. Стандартное для BSD средство `ipdivert` производитель убрал из ядра, а без механизма перехвата `nfqws2` работать не может. Это ограничение платформы, а не недоработка проекта.
## 📚 См. также
- [[схема обработки трафика|Схема обработки трафика]] — парная заметка: как пакет проходит через эти компоненты по шагам (здесь «что есть», там «как работает»)
- [[Zapret2/Zapret2|Что такое Zapret 2]] — обзор и определение автора: почему это «пакетный манипулятор», а не просто обходчик блокировок
- [[desync|Техники дурения (--lua-desync)]] — как именно Lua-код воздействует на трафик
- [[preset|Пресеты]] и [[profile|Профили]] — как задаются множественные стратегии
- [[filter|Фильтрация]] · [[payload|Распознавание payload]] · [[blob|Blob-данные]] — что делает C-ядро
- [[оркестратор|Оркестрация]] — динамический выбор стратегии (`zapret-auto.lua`)
- 🔗 [Официальная документация (docs/manual.md)](https://github.com/bol-van/zapret2/blob/master/docs/manual.md) — первоисточник
---
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Zapret2/%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).