🗂️ Структура проекта 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 мог поймать пакет, его сначала нужно «завернуть» из сетевого стека операционной системы в программу. За это отвечают разные механизмы в разных ОС:

  • Linuxiptables или nftables (штатные межсетевые экраны Linux; они направляют выбранные пакеты в очередь NFQUEUE, откуда их и забирает nfqws2);
  • FreeBSDipfw;
  • OpenBSDpf;
  • 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 работать не может. Это ограничение платформы, а не недоработка проекта.

📚 См. также


🤖 Эти статьи открыты — можно обучать на них ИИ

При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.