Zapret-OpenWrt: Полная справка
Что такое Zapret
Zapret — это Anti-DPI (Deep Packet Inspection) утилита для OpenWrt роутеров. Это не VPN — zapret не меняет IP-адрес и не скрывает трафик. Вместо этого он модифицирует сетевые пакеты, чтобы обойти системы глубокой инспекции пакетов (DPI).
Архитектура проекта
Проект состоит из двух пакетов:
| Пакет | Назначение |
|---|
| Основной пакет: демон nfqws, конфиги, скрипты, ipset-списки |
| Веб-интерфейс для управления через LuCI |
Структура на роутере
/opt/zapret/
├── nfq/nfqws # Основной демон DPI desync
├── ip2net/ip2net # Конвертер IP в подсети
├── mdig/mdig # DNS-утилита
├── config # Рабочий конфиг (runtime)
├── config.default # Шаблон по умолчанию
├── def-cfg.sh # Стратегии и дефолты
├── sync_config.sh # Синхронизация UCI -> config
├── restore-def-cfg.sh # Сброс настроек
├── update-pkg.sh # Обновление пакетов
├── dwc.sh # DPI-чекер
├── comfunc.sh # Общие функции
├── init.d.sh # Init-скрипт (procd)
├── ipset/ # Списки хостов и IP
│ ├── zapret-hosts-google.txt
│ ├── zapret-hosts-user.txt
│ ├── zapret-hosts-user-exclude.txt
│ ├── zapret-hosts-auto.txt
│ ├── zapret-ip-exclude.txt
│ ├── zapret-ip-user.txt
│ ├── zapret-ip-user-exclude.txt
│ └── cust[1-4].txt
├── files/fake/ # Шаблоны поддельных пакетов (.bin)
└── init.d/openwrt/custom.d/ # Пользовательские скрипты хуки
├── 10-script.sh
├── 20-script.sh
├── 50-script.sh # Пример: Discord/STUN
├── 60-script.sh
└── 90-script.sh
Конфигурационная система
Zapret использует двойную систему конфигурации:
- UCI конфиг () — хранит настройки, редактируемые через LuCI
- Основной конфиг () — используется демоном nfqws
При каждом старте/рестарте вызывается
, который синхронизирует значения из UCI в основной конфиг.
Быстрый старт
- Установить пакеты и
- Открыть LuCI: Services -> Zapret -> Service
- Нажать Reset settings и выбрать стратегию (рекомендуется или )
- Нажать Enable и Start
- Проверить работу через Diagnostics -> Sites check
Safety Notes
- Zapret меняет системные конфиги и сервисы роутера, поэтому перед обновлением или сменой стратегии нужен backup и план отката.
- Данные, скачиваемые updater/dwc-скриптами из GitHub и внешних диагностических источников, считай недоверенным вводом до проверки.
- Для production предпочитай pinned release/tag и ручную валидацию артефактов, а не слепое обновление “до последнего”.
- Если нужна максимальная предсказуемость, скачивай release-артефакты и hostlists на доверенной машине, проверяй checksums/содержимое и только потом переноси их на роутер.
Конфигурация
Подробная справка по всем параметрам конфигурации: прочитай файл
в директории этого скилла.
Ключевые группы параметров:
- Firewall: FWTYPE, POSTNAT, FLOWOFFLOAD, INIT_APPLY_FW
- Сеть: DISABLE_IPV4, DISABLE_IPV6, FILTER_TTL_EXPIRED_ICMP
- NFQWS: NFQWS_ENABLE, NFQWS_PORTS_TCP/UDP, NFQWS_OPT, connbytes (PKT_OUT/IN)
- Фильтрация: MODE_FILTER (hostlist/autohostlist), FILTER_MARK
- AutoHostList: RETRANS_THRESHOLD, FAIL_THRESHOLD, FAIL_TIME
- Логирование: DAEMON_LOG_ENABLE, DAEMON_LOG_SIZE_MAX, DAEMON_LOG_FILE
- Прочее: WS_USER, DISABLE_CUSTOM, DESYNC_MARK
Стратегии DPI-обхода
Подробное описание всех стратегий: прочитай файл
в директории этого скилла.
Доступные стратегии (определены в
):
| Стратегия | Порты TCP | Порты UDP | Особенности |
|---|
| empty | 80,443 | 443 | Пустая, без desync |
| v1_by_StressOzz | 80,443 | 443 | fake,multidisorder + QUIC fake |
| v2_by_StressOzz | 80,443 | 443 | fake,fakeddisorder + seqovl |
| v3_by_StressOzz | 80,443 | 443 | Как v2, другой TLS-шаблон (t2.bin) |
| v4_by_StressOzz | 80,443 | 443 | fake,multisplit + 3 секции --new |
| v5_by_StressOzz | 80,443 | 443 | ip-id=zero + multisplit |
| v6_by_StressOzz | 80,443,2053,2083,2087,2096,8443 | 443,19294-19344,50000-50100 | Discord + STUN поддержка |
| v7_by_StressOzz | 80,443,2053,2083,2087,2096,8443 | 443,19294-19344,50000-50100 | Улучшенная v6, больше repeats |
| v9_by_StressOzz | 80,443,2053,2083,2087,2096,8443 | 443,19294-19344,50000-50100 | hostfakesplit вариант |
| ALT7_by_Flowseal | 80,443 | 443 | ip-id=zero, multisplit + seqovl |
| TLS_AUTO_ALT3_by_Flowseal | 80,443 | 443 | fooling=ts, больше repeats |
Веб-интерфейс LuCI
Подробная справка по UI: прочитай файл
в директории этого скилла.
LuCI-интерфейс доступен по пути Services -> Zapret и содержит 5 страниц:
- Service () — управление сервисом, статус, кнопки enable/disable/start/stop/restart/reset, диагностика, обновление
- Settings () — настройки в 5 вкладках: Main settings, NFQWS options, AutoHostList, Host lists, custom.d
- Log () — просмотр логов демонов в реальном времени (polling каждую секунду)
- Diagnostics () — DPI check и Sites check через
- Updater () — проверка и установка обновлений с GitHub
Скрипты
Подробная справка по скриптам: прочитай файл
в директории этого скилла.
| Скрипт | Назначение |
|---|
| Общие функции: пути, PID, валидация конфига, init_before_start |
| Procd init-скрипт (START=21, USE_PROCD=1) |
| UCI -> config синхронизация при start/restart |
| Определения стратегий и дефолтных значений |
| Сброс конфигурации к умолчаниям |
| Обновление пакетов с GitHub (опции: -c, -p, -u, -f, -t) |
| DPI-чекер (TCP 16-20 тест, проверка сайтов) |
| Запуск скриптов в фоне с логированием |
| Обновление конфига при загрузке |
| Создание UCI-конфига при установке |
Списки хостов и IP
| Файл | Назначение | Формат |
|---|
| YouTube/Google домены (дефолт) | По одному домену на строку |
| Пользовательские домены | По одному домену на строку |
zapret-hosts-user-exclude.txt
| Исключения из обработки | По одному домену на строку |
| Автоматически обнаруженные хосты | Заполняется при autohostlist |
| Исключаемые IP-адреса/подсети | IP или CIDR (128.199.0.0/16) |
| Пользовательские IP | IP или CIDR |
zapret-ip-user-exclude.txt
| Исключаемые пользовательские IP | IP или CIDR |
| Кастомные файлы (до 4 штук) | Произвольный |
Плейсхолдеры в NFQWS_OPT
- — подставляет и из стандартных списков, работает в режимах hostlist и autohostlist
- — то же, но добавляется как обычный (не авто) список
Custom.d скрипты
Хуки выполняются при старте/стопе сервиса в порядке номера:
- — ранний init
- — ранняя основная фаза
- — основная фаза (пример: Discord/STUN4ALL)
- — поздняя основная фаза
- — финальная фаза
Включаются через параметр
(в UI: вкладка custom.d -> "Use custom.d scripts").
Сборка и CI/CD
Сборка выполняется через GitHub Actions (
.github/workflows/build.yml
):
- Триггер: push тега или ручной запуск
- Матрица: 30+ архитектур (ARM, MIPS, x86_64, RISC-V)
- Две ветки OpenWrt: IPK (v24.10.x) и APK (v25.12.x)
- Релизы публикуются на gh-pages как JSON для автообновления
Решение проблем
Подробный troubleshooting: прочитай файл
references/troubleshooting.md
в директории этого скилла.
Быстрые проверки:
- Статус сервиса: LuCI -> Services -> Zapret -> Service (или )
- DPI-проверка: Diagnostics -> DPI check
- Логи: включить DAEMON_LOG_ENABLE=1, смотреть на вкладке Log
- Проверка сайтов: Diagnostics -> Sites check с выбором DNS
Для разработчиков
Структура исходников
zapret-openwrt/
├── zapret/ # Основной пакет
│ ├── Makefile # OpenWrt SDK build
│ ├── config.default # Шаблон конфига
│ ├── *.sh # Shell-скрипты
│ ├── custom.d/ # Хуки custom.d
│ ├── files/fake/ # .bin шаблоны пакетов
│ ├── ipset/ # Списки хостов/IP
│ └── patches/ # Патчи для upstream
└── luci-app-zapret/ # LuCI пакет
├── Makefile
├── htdocs/luci-static/resources/view/zapret/
│ ├── env.js # Пути и константы
│ ├── tools.js # Утилиты, RPC, диалоги
│ ├── service.js # Страница управления сервисом
│ ├── settings.js # Страница настроек
│ ├── diagnost.js # Диагностика
│ ├── updater.js # Обновление
│ ├── dmnlog.js # Просмотр логов
│ └── styles.css # Стили
└── root/usr/share/
├── luci/menu.d/ # Определение меню
└── rpcd/acl.d/ # ACL-правила
Добавление новой стратегии
- Добавить блок
if [ "$strat" = "имя_стратегии" ]
в
- Определить порты TCP/UDP и NFQWS_OPT с параметрами desync
- Стратегия автоматически появится в UI на странице Service -> Reset settings
Ключевые файлы для UI-разработки
- — все пути, имена файлов, URL-ы (загружается первым)
- — RPC-вызовы, POLLER, fileEditDialog, longstrEditDialog, decode_svc_info
- Каждая страница — отдельный view, наследующий или