🗂️ Структура проекта Zapret 2
О чём заметка
Из каких частей состоит 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 (что такое пакетный манипулятор и почему автор называет инструмент именно так — см. обзор Zapret 2). C выбран ради скорости: обработка идёт для каждого пакета в реальном времени, и медленный язык здесь не годится.
nfqws2 берёт на себя всю «черновую» и служебную работу:
- перехват пакетов — забирает пакеты из сетевого стека ОС, чтобы их можно было изменить до отправки;
- базовая фильтрация — отбирает только нужные пакеты (по порту, протоколу и т. д.), см. filter;
- распознавание основных протоколов и пейлоадов — понимает, что внутри пакета: TLS ClientHello, HTTP-запрос, QUIC Initial и др. (payload = прикладные данные пакета, см. payload);
- поддержка хост- и IP-листов — списки доменов и адресов, для которых применять обход;
- автоматические хостлисты с распознаванием блокировок — умеет сам замечать, что соединение с доменом рвут, и заносить такой домен в список;
- система множественных профилей (стратегий) — можно задать несколько независимых наборов правил для разного трафика (см. пресеты и профили);
- отправка raw-пакетов — умеет формировать и слать «сырые» пакеты напрямую, в обход обычного сокета (на этом построены приёмы вроде fake и нарезки multisplit);
- прочие сервисные функции.
Ключевой момент: в самом nfqws2 нет логики воздействия на трафик. Он умеет перехватить, распознать и отправить пакет, но как именно его переделать, чтобы обмануть DPI, — решает не он. Эта часть вынесена наружу, в Lua-код, который nfqws2 вызывает.
Проще говоря
nfqws2— это «руки» проекта: ловит пакеты и отправляет их обратно, быстро и надёжно. А «мозги» — что делать с пакетом — лежат в отдельных Lua-скриптах. Такое разделение и есть главная идея Zapret 2 (в старом Zapret обе части были слиты в один C-код и менялись только пересборкой программы).
Вторая по важности часть — Lua-код
Вся логика обхода живёт в Lua-файлах — обычных текстовых скриптах, которые nfqws2 подгружает и вызывает. Именно их можно править без перекомпиляции программы. В базовый комплект входят:
zapret-lib.lua— библиотека функций-хелперов. Вспомогательный «фундамент»: работа с blob-данными, нарезка и отправка сегментов, проверки направления и т. п. На эти функции опираются все остальные скрипты.zapret-antidpi.lua— библиотека самих приёмов автономных атак на DPI. Здесь лежат функции дурения: fake, multisplit, multidisorder, syndata и другие, вызываемые через флаг--lua-desync.zapret-auto.lua— библиотека функций принятия динамических решений (оркестрации): логика, которая на ходу выбирает, какой приём применить, в зависимости от поведения сети (см. оркестратор).
Дополнительно, вне обязательного минимума, идут:
zapret-tests.lua— набор тестов C-функций (проверяет, что ядро правильно распознаёт протоколы, разрешает позиции разреза и т. д.);zapret-obfs.lua— средства обфускации трафика (маскировка протокола, а не обход, о котором говорит обзор);zapret-pcap.lua— запись дампа пакетов в.cap-файлы (для отладки — открывается в Wireshark).
Требования к 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сам перехватывает пакеты).
Что считается «ядром» проекта
Схема перехвата из ОС +
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-адресов, по которым файрвол проверяет пакеты быстро).
Всё это при желании можно сделать и собственными средствами, если так удобнее или штатные скрипты не подходят — они не обязательны.
Файл config — только для скриптов запуска
Скрипты запуска выносят все свои настройки в файл
configв корне проекта. Важно: этот конфиг относится только к ним. Самnfqws2о нём ничего не знает и его не читает — программе аргументы передаются напрямую (через флаги / пресеты).
Утилиты обработки листов: mdig и ip2net
Для работы со списками есть две отдельные C-программы:
mdig— многопоточный резолвер хостлистов (переводит доменные имена в IP-адреса) неограниченного объёма. «Многопоточный» — значит обрабатывает множество доменов параллельно, поэтому справляется даже с очень большими списками.ip2net— группирует отдельные IP-адреса в подсети, чтобы сократить их количество. Вместо тысячи соседних адресов получается несколько компактных диапазонов — списки занимают меньше места и быстрее применяются.
Обе используются внутри скриптов запуска и в blockcheck2.
Поддержка платформ
Скрипты запуска и инсталлятор рассчитаны на:
- классические дистрибутивы Linux с systemd или OpenRC;
- из прошивок — OpenWrt.
Если система под эти требования не подходит, возможна самостоятельная «доприкрутка» к системе — ядро проекта (nfqws2 + Lua) от скриптов запуска не зависит.
macOS не поддерживается
На macOS нет подходящего средства перехвата и управления пакетами. Стандартное для BSD средство
ipdivertпроизводитель убрал из ядра, а без механизма перехватаnfqws2работать не может. Это ограничение платформы, а не недоработка проекта.
📚 См. также
- Схема обработки трафика — парная заметка: как пакет проходит через эти компоненты по шагам (здесь «что есть», там «как работает»)
- Что такое Zapret 2 — обзор и определение автора: почему это «пакетный манипулятор», а не просто обходчик блокировок
- Техники дурения (—lua-desync) — как именно Lua-код воздействует на трафик
- Пресеты и Профили — как задаются множественные стратегии
- Фильтрация · Распознавание payload · Blob-данные — что делает C-ядро
- Оркестрация — динамический выбор стратегии (
zapret-auto.lua) - 🔗 Официальная документация (docs/manual.md) — первоисточник
🤖 Эти статьи открыты — можно обучать на них ИИ
При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.