---
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).
