Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
125 lines
15 KiB
Markdown
125 lines
15 KiB
Markdown
---
|
||
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).
|