zapret-openwrt-guide

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Zapret-OpenWrt: Полная справка

Zapret-OpenWrt:完整指南

Что такое Zapret

什么是Zapret

Zapret — это Anti-DPI (Deep Packet Inspection) утилита для OpenWrt роутеров. Это не VPN — zapret не меняет IP-адрес и не скрывает трафик. Вместо этого он модифицирует сетевые пакеты, чтобы обойти системы глубокой инспекции пакетов (DPI).
Репозиторий: https://github.com/remittor/zapret-openwrt Upstream: https://github.com/bol-van/zapret Текущая версия: v72.20260226
Zapret是一款适用于OpenWrt路由器的Anti-DPI(深度包检测)工具。它不是VPN——zapret不会更改IP地址或隐藏流量,而是通过修改网络数据包来绕过深度包检测(DPI)系统。
代码仓库: https://github.com/remittor/zapret-openwrt 上游项目: https://github.com/bol-van/zapret 当前版本: v72.20260226

Архитектура проекта

项目架构

Проект состоит из двух пакетов:
ПакетНазначение
zapret
Основной пакет: демон nfqws, конфиги, скрипты, ipset-списки
luci-app-zapret
Веб-интерфейс для управления через LuCI
项目包含两个包:
用途
zapret
主包:nfqws守护进程、配置文件、脚本、ipset列表
luci-app-zapret
通过LuCI进行管理的Web界面

Структура на роутере

路由器上的目录结构

/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
/opt/zapret/
├── nfq/nfqws              # 核心DPI desync守护进程
├── ip2net/ip2net           # IP转子网转换器
├── mdig/mdig               # DNS工具
├── config                  # 运行时配置文件
├── config.default          # 默认配置模板
├── def-cfg.sh              # 策略与默认值定义
├── sync_config.sh          # 同步UCI配置至核心配置
├── restore-def-cfg.sh      # 重置配置至默认值
├── update-pkg.sh           # 包更新脚本
├── dwc.sh                  # DPI检测工具
├── comfunc.sh              # 通用函数库
├── init.d.sh               # 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 использует двойную систему конфигурации:
  1. UCI конфиг (
    /etc/config/zapret
    ) — хранит настройки, редактируемые через LuCI
  2. Основной конфиг (
    /opt/zapret/config
    ) — используется демоном nfqws
При каждом старте/рестарте вызывается
sync_config.sh
, который синхронизирует значения из UCI в основной конфиг.

Zapret采用双重配置系统
  1. UCI配置文件 (
    /etc/config/zapret
    ) — 存储可通过LuCI编辑的设置
  2. 核心配置文件 (
    /opt/zapret/config
    ) — nfqws守护进程使用的配置
每次启动/重启服务时,会调用
sync_config.sh
脚本,将UCI中的配置值同步到核心配置文件中。

Быстрый старт

快速开始

  1. Установить пакеты
    zapret
    и
    luci-app-zapret
  2. Открыть LuCI: Services -> Zapret -> Service
  3. Нажать Reset settings и выбрать стратегию (рекомендуется
    v6_by_StressOzz
    или
    v7_by_StressOzz
    )
  4. Нажать Enable и Start
  5. Проверить работу через Diagnostics -> Sites check
  1. 安装
    zapret
    luci-app-zapret
  2. 打开LuCI界面:Services -> Zapret -> Service
  3. 点击Reset settings并选择策略(推荐
    v6_by_StressOzz
    v7_by_StressOzz
  4. 点击EnableStart启动服务
  5. 通过Diagnostics -> Sites check验证服务运行状态

Safety Notes

安全注意事项

  • Zapret меняет системные конфиги и сервисы роутера, поэтому перед обновлением или сменой стратегии нужен backup и план отката.
  • Данные, скачиваемые updater/dwc-скриптами из GitHub и внешних диагностических источников, считай недоверенным вводом до проверки.
  • Для production предпочитай pinned release/tag и ручную валидацию артефактов, а не слепое обновление “до последнего”.
  • Если нужна максимальная предсказуемость, скачивай release-артефакты и hostlists на доверенной машине, проверяй checksums/содержимое и только потом переноси их на роутер.

  • Zapret会修改路由器的系统配置和服务,因此在更新或更换策略前需做好备份和回滚计划。
  • updater/dwc脚本从GitHub和外部诊断源下载的数据,在验证前请视为不可信输入。
  • 生产环境中建议使用固定版本/标签并手动验证工件,而非盲目更新至“最新版本”。
  • 如果需要最高可预测性,请在可信机器上下载版本工件和主机列表,校验校验和/内容后再传输到路由器。

Конфигурация

配置说明

Подробная справка по всем параметрам конфигурации: прочитай файл
references/config.md
в директории этого скилла.
Ключевые группы параметров:
  • 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
所有配置参数的详细说明:请查看本技能目录下的
references/config.md
文件。
关键参数组:
  • 防火墙: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-обхода

DPI绕过策略

Подробное описание всех стратегий: прочитай файл
references/strategies.md
в директории этого скилла.
Доступные стратегии (определены в
def-cfg.sh
):
СтратегияПорты TCPПорты UDPОсобенности
empty80,443443Пустая, без desync
v1_by_StressOzz80,443443fake,multidisorder + QUIC fake
v2_by_StressOzz80,443443fake,fakeddisorder + seqovl
v3_by_StressOzz80,443443Как v2, другой TLS-шаблон (t2.bin)
v4_by_StressOzz80,443443fake,multisplit + 3 секции --new
v5_by_StressOzz80,443443ip-id=zero + multisplit
v6_by_StressOzz80,443,2053,2083,2087,2096,8443443,19294-19344,50000-50100Discord + STUN поддержка
v7_by_StressOzz80,443,2053,2083,2087,2096,8443443,19294-19344,50000-50100Улучшенная v6, больше repeats
v9_by_StressOzz80,443,2053,2083,2087,2096,8443443,19294-19344,50000-50100hostfakesplit вариант
ALT7_by_Flowseal80,443443ip-id=zero, multisplit + seqovl
TLS_AUTO_ALT3_by_Flowseal80,443443fooling=ts, больше repeats
Стратегия по умолчанию:
v6_by_StressOzz
所有策略的详细说明:请查看本技能目录下的
references/strategies.md
文件。
可用策略(定义在
def-cfg.sh
中):
策略TCP端口UDP端口特点
empty80,443443空策略,无desync处理
v1_by_StressOzz80,443443fake,multidisorder + QUIC伪造
v2_by_StressOzz80,443443fake,fakeddisorder + seqovl
v3_by_StressOzz80,443443同v2,使用不同TLS模板(t2.bin)
v4_by_StressOzz80,443443fake,multisplit + 3段--new参数
v5_by_StressOzz80,443443ip-id=zero + multisplit
v6_by_StressOzz80,443,2053,2083,2087,2096,8443443,19294-19344,50000-50100支持Discord + STUN
v7_by_StressOzz80,443,2053,2083,2087,2096,8443443,19294-19344,50000-50100v6优化版,增加重复处理
v9_by_StressOzz80,443,2053,2083,2087,2096,8443443,19294-19344,50000-50100hostfakesplit变体
ALT7_by_Flowseal80,443443ip-id=zero, multisplit + seqovl
TLS_AUTO_ALT3_by_Flowseal80,443443fooling=ts,增加重复处理
默认策略:
v6_by_StressOzz

Веб-интерфейс LuCI

LuCI Web界面

Подробная справка по UI: прочитай файл
references/ui.md
в директории этого скилла.
LuCI-интерфейс доступен по пути Services -> Zapret и содержит 5 страниц:
  1. Service (
    service.js
    ) — управление сервисом, статус, кнопки enable/disable/start/stop/restart/reset, диагностика, обновление
  2. Settings (
    settings.js
    ) — настройки в 5 вкладках: Main settings, NFQWS options, AutoHostList, Host lists, custom.d
  3. Log (
    dmnlog.js
    ) — просмотр логов демонов в реальном времени (polling каждую секунду)
  4. Diagnostics (
    diagnost.js
    ) — DPI check и Sites check через
    dwc.sh
  5. Updater (
    updater.js
    ) — проверка и установка обновлений с GitHub
UI详细说明:请查看本技能目录下的
references/ui.md
文件。
LuCI界面入口为Services -> Zapret,包含5个页面:
  1. Service (
    service.js
    ) — 服务管理、状态查看、启用/禁用/启动/停止/重启/重置按钮、诊断、更新
  2. Settings (
    settings.js
    ) — 配置页面,分为5个标签页:主设置、NFQWS选项、AutoHostList、主机列表、custom.d
  3. Log (
    dmnlog.js
    ) — 实时查看守护进程日志(每秒轮询)
  4. Diagnostics (
    diagnost.js
    ) — 通过
    dwc.sh
    进行DPI检测和站点验证
  5. Updater (
    updater.js
    ) — 检查并从GitHub安装更新

Скрипты

脚本说明

Подробная справка по скриптам: прочитай файл
references/scripts.md
в директории этого скилла.
СкриптНазначение
comfunc.sh
Общие функции: пути, PID, валидация конфига, init_before_start
init.d.sh
Procd init-скрипт (START=21, USE_PROCD=1)
sync_config.sh
UCI -> config синхронизация при start/restart
def-cfg.sh
Определения стратегий и дефолтных значений
restore-def-cfg.sh
Сброс конфигурации к умолчаниям
update-pkg.sh
Обновление пакетов с GitHub (опции: -c, -p, -u, -f, -t)
dwc.sh
DPI-чекер (TCP 16-20 тест, проверка сайтов)
script-exec.sh
Запуск скриптов в фоне с логированием
renew-cfg.sh
Обновление конфига при загрузке
uci-def-cfg.sh
Создание UCI-конфига при установке
所有脚本的详细说明:请查看本技能目录下的
references/scripts.md
文件。
脚本用途
comfunc.sh
通用函数:路径定义、PID管理、配置验证、init_before_start
init.d.sh
Procd初始化脚本(START=21, USE_PROCD=1)
sync_config.sh
启动/重启时同步UCI配置至核心配置
def-cfg.sh
策略与默认值定义
restore-def-cfg.sh
重置配置至默认值
update-pkg.sh
从GitHub更新包(参数:-c, -p, -u, -f, -t)
dwc.sh
DPI检测工具(TCP 16-20测试、站点验证)
script-exec.sh
后台运行脚本并记录日志
renew-cfg.sh
系统启动时更新配置
uci-def-cfg.sh
安装时创建UCI配置

Списки хостов и IP

主机与IP列表

ФайлНазначениеФормат
zapret-hosts-google.txt
YouTube/Google домены (дефолт)По одному домену на строку
zapret-hosts-user.txt
Пользовательские домены
<HOSTLIST>
По одному домену на строку
zapret-hosts-user-exclude.txt
Исключения из обработкиПо одному домену на строку
zapret-hosts-auto.txt
Автоматически обнаруженные хостыЗаполняется при autohostlist
zapret-ip-exclude.txt
Исключаемые IP-адреса/подсетиIP или CIDR (128.199.0.0/16)
zapret-ip-user.txt
Пользовательские IPIP или CIDR
zapret-ip-user-exclude.txt
Исключаемые пользовательские IPIP или CIDR
cust[1-4].txt
Кастомные файлы (до 4 штук)Произвольный
文件用途格式
zapret-hosts-google.txt
YouTube/Google域名(默认)每行一个域名
zapret-hosts-user.txt
用户自定义域名
<HOSTLIST>
每行一个域名
zapret-hosts-user-exclude.txt
排除处理的域名每行一个域名
zapret-hosts-auto.txt
自动检测到的主机由autohostlist功能填充
zapret-ip-exclude.txt
排除的IP地址/子网IP或CIDR格式(如128.199.0.0/16)
zapret-ip-user.txt
用户自定义IPIP或CIDR格式
zapret-ip-user-exclude.txt
用户自定义排除IPIP或CIDR格式
cust[1-4].txt
自定义文件(最多4个)任意格式

Плейсхолдеры в NFQWS_OPT

NFQWS_OPT中的占位符

  • <HOSTLIST>
    — подставляет
    --hostlist
    и
    --hostlist-exclude
    из стандартных списков, работает в режимах hostlist и autohostlist
  • <HOSTLIST_NOAUTO>
    — то же, но
    zapret-hosts-auto.txt
    добавляется как обычный (не авто) список
  • <HOSTLIST>
    — 自动插入标准列表的
    --hostlist
    --hostlist-exclude
    参数,适用于hostlist和autohostlist模式
  • <HOSTLIST_NOAUTO>
    — 同上,但
    zapret-hosts-auto.txt
    作为普通列表而非自动列表添加

Custom.d скрипты

Custom.d钩子脚本

Хуки выполняются при старте/стопе сервиса в порядке номера:
  • 10-script.sh
    — ранний init
  • 20-script.sh
    — ранняя основная фаза
  • 50-script.sh
    — основная фаза (пример: Discord/STUN4ALL)
  • 60-script.sh
    — поздняя основная фаза
  • 90-script.sh
    — финальная фаза
Включаются через параметр
DISABLE_CUSTOM=0
(в UI: вкладка custom.d -> "Use custom.d scripts").
钩子脚本按编号顺序在服务启动/停止时执行:
  • 10-script.sh
    — 早期初始化阶段
  • 20-script.sh
    — 早期核心阶段
  • 50-script.sh
    — 核心阶段(示例:Discord/STUN4ALL配置)
  • 60-script.sh
    — 后期核心阶段
  • 90-script.sh
    — 最终阶段
通过参数
DISABLE_CUSTOM=0
启用(UI路径:custom.d标签页 -> "Use custom.d scripts")。

Сборка и CI/CD

构建与CI/CD

Сборка выполняется через GitHub Actions (
.github/workflows/build.yml
):
  • Триггер: push тега
    v[0-9]+*
    или ручной запуск
  • Матрица: 30+ архитектур (ARM, MIPS, x86_64, RISC-V)
  • Две ветки OpenWrt: IPK (v24.10.x) и APK (v25.12.x)
  • Релизы публикуются на gh-pages как JSON для автообновления
构建通过GitHub Actions执行(
.github/workflows/build.yml
):
  • 触发条件:推送
    v[0-9]+*
    标签或手动触发
  • 架构矩阵:30+种架构(ARM、MIPS、x86_64、RISC-V)
  • OpenWrt分支:IPK(v24.10.x)和APK(v25.12.x)
  • 发布版本以JSON格式托管在gh-pages,用于自动更新

Решение проблем

问题排查

Подробный troubleshooting: прочитай файл
references/troubleshooting.md
в директории этого скилла.
Быстрые проверки:
  1. Статус сервиса: LuCI -> Services -> Zapret -> Service (или
    service zapret status
    )
  2. DPI-проверка: Diagnostics -> DPI check
  3. Логи: включить DAEMON_LOG_ENABLE=1, смотреть на вкладке Log
  4. Проверка сайтов: Diagnostics -> Sites check с выбором DNS
详细故障排除指南:请查看本技能目录下的
references/troubleshooting.md
文件。
快速检查步骤:
  1. 服务状态:LuCI -> Services -> Zapret -> Service(或执行
    service zapret status
  2. DPI检测:Diagnostics -> DPI check
  3. 日志:开启DAEMON_LOG_ENABLE=1,查看Log标签页
  4. 站点验证: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-правила
zapret-openwrt/
├── zapret/                     # 主包
│   ├── Makefile                # OpenWrt SDK构建脚本
│   ├── config.default          # 配置模板
│   ├── *.sh                    # Shell脚本
│   ├── custom.d/               # custom.d钩子
│   ├── files/fake/             # .bin数据包模板
│   ├── ipset/                  # 主机/IP列表
│   └── patches/                # 上游项目补丁
└── 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权限规则

Добавление новой стратегии

添加新策略

  1. Добавить блок
    if [ "$strat" = "имя_стратегии" ]
    в
    def-cfg.sh
  2. Определить порты TCP/UDP и NFQWS_OPT с параметрами desync
  3. Стратегия автоматически появится в UI на странице Service -> Reset settings
  1. def-cfg.sh
    中添加
    if [ "$strat" = "策略名称" ]
    代码块
  2. 定义TCP/UDP端口和带desync参数的NFQWS_OPT
  3. 策略会自动出现在UI的Service -> Reset settings选项中

Ключевые файлы для UI-разработки

UI开发关键文件

  • env.js
    — все пути, имена файлов, URL-ы (загружается первым)
  • tools.js
    — RPC-вызовы, POLLER, fileEditDialog, longstrEditDialog, decode_svc_info
  • Каждая страница — отдельный view, наследующий
    view.extend()
    или
    baseclass.extend()
  • env.js
    — 所有路径、文件名、URL定义(最先加载)
  • tools.js
    — RPC调用、POLLER、fileEditDialog、longstrEditDialog、decode_svc_info
  • 每个页面为独立view,继承
    view.extend()
    baseclass.extend()