Гибкая маршрутизация и обход DPI на Keenetic (sing-box + keen-pbr + nfqws2)
Установка стека: гибкая маршрутизация и обход DPI на роутере Keenetic
Подробная пошаговая инструкция для пользователя, который умеет работать в терминале, но не знаком с устройством роутерных систем. Проверено на Xiaomi Mi Router 3G с KeeneticOS 5.0.7 (порт сообщества). Подходит для любого Keenetic-устройства с поддержкой OPKG/Entware.
Что мы построим
Связка из четырёх компонентов, каждый из которых решает свою задачу:
| Компонент | Назначение |
|---|---|
| Entware | Менеджер пакетов на роутере. Позволяет ставить любой Linux-софт через opkg install.
|
| sing-box + singbox-helper | sing-box — универсальный туннельный движок, поддерживает VLESS, Hysteria2, Trojan, Shadowsocks, WireGuard и др. Создаёт виртуальный интерфейс singtun, в который заворачивается выборочный трафик. singbox-helper — обёртка над ним: ставит как зависимость, даёт веб-UI на :8765, по вставленной ссылке (vless://, hysteria2://, ...) сама генерирует config.json.
|
| keen-pbr | Маршрутизатор по доменам. Решает, какой трафик отправлять в туннель singtun, а какой пускать напрямую. Имеет полноценный веб-интерфейс.
|
| nfqws2 (zapret v2) | Утилита модификации сетевых пакетов. Обходит DPI-фильтрацию для сервисов, которые не нужно заворачивать в туннель (например, потоковое видео — чтобы не нагружать тоннель и не терять скорость). |
Общая архитектура

Требования
| Требование | Описание |
|---|---|
| Роутер | Keenetic с поддержкой Entware/OPKG (KeeneticOS 3.7 и новее) и хотя бы одним свободным USB-портом. |
| USB-накопитель | Любая флешка от 8 ГБ. Будет отформатирована в EXT4. Без флешки не получится — встроенной памяти роутера не хватит. |
| Доступ к веб-интерфейсу | Адрес роутера в браузере (обычно 192.168.1.1 или my.keenetic.net), логин администратора.
|
| SSH-клиент | PuTTY, Windows Terminal с OpenSSH, или любой другой. |
| VPN-узел | Любой провайдер с протоколами VLESS, Hysteria2, Trojan и т.п. (необходим только для туннеля; обход DPI работает без него). |
Внимание: Полный стек (sing-box + keen-pbr + nfqws2 + зависимости) занимает около 110 МБ распакованного места. На встроенной флэш-памяти большинства роутеров этого нет — поэтому USB-накопитель обязателен.
Этап 1. Установка Entware
Entware — это система пакетов на основе OpenWrt-репозитория. После установки на роутере появится Linux-окружение в каталоге /opt, в которое можно ставить пакеты командой opkg install.
Какая у вас прошивка
KeeneticOS существует в двух вариантах, и от этого зависит, нужен ли вам отдельный шаг включения компонентов прошивки.
| Вариант прошивки | Нужно ли включать компоненты? |
|---|---|
| Оригинальный Keenetic (продавался как Keenetic с завода: KN-..., Hero, Ultra, Giga, Viva, Hopper, Peak и т.п.) | Да, через веб-интерфейс — см. подсекцию «Только для оригинального Keenetic» ниже |
| Порт сообщества (например, keeneticported.dev) на роутере другой марки (Xiaomi Mi Router 3G/3/Pro, TP-Link, Mercusys и др.) | Нет, всё уже в образе прошивки порта — пропускайте подсекцию ниже и сразу переходите к «Выбор URL установщика» |
Как понять, какая у вас: На странице Системный монитор видна модель устройства. Маркетинговое имя "Keenetic Hero" и модель "KN-..." — это оригинальный Keenetic. Имя другого производителя (например, "Xiaomi R3G") + KeeneticOS — это порт сообщества. Дополнительный признак порта — на странице компонентов сообщение «Не удалось получить список компонентов от сервера» (своего сервера обновлений у порта нет).
Только для оригинального Keenetic
В веб-интерфейсе: Управление → Общие настройки → блок Обновления и компоненты → кнопка Показать компоненты (в старых версиях UI — Изменить набор компонентов).
Включите следующие компоненты:
| Компонент | Зачем |
|---|---|
| Поддержка открытых пакетов (OPKG) | База Entware |
| Файловая система Ext | Монтирование ext4-флешки |
| Сервер SSH | Командная строка роутера |
| "Netfilter" / "Модули ядра Netfilter" | База iptables для Entware |
| "Расширенные модули Netfilter" / "Netfilter addons" | Доп. модули (xt_set, xt_multiport, conntrack-extra) — критично для keen-pbr
|
После выбора — Установить обновление и ждите 2–5 минут, роутер перезагрузится сам.
Выбор URL установщика
| Архитектура роутера | URL установщика (одной строкой) |
|---|---|
| MIPS little-endian (mipsel) — большинство Keenetic и портов на Xiaomi/TP-Link/Mercusys (Mi 3G, Mi 3, Mi 4A, Hero, Ultra, Giga, Viva, Air и др.) | https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz
|
| ARM 64-bit (aarch64) — современные Keenetic (Hopper KN-3810, Peak KN-2710 и др.) | https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz
|
Как узнать архитектуру: Системный монитор → видна модель и процессор. Большинство бытовых моделей — MIPS (верхняя строка). Сомневаетесь — берите mipsel; если не подходит, установщик ругнётся, роутер от этого не сломается.
Что вам понадобится
Перед тем как идти в командную строку, держите под рукой два значения:
| Параметр | Откуда взять | Пример |
|---|---|---|
| UUID USB-диска | show media в веб-CLI Keenetic (см. шаг 3 в 1.1), поле uuid внутри partition
|
d5f39712-7ae1-dc01-00f3-97127ae1dc01
|
| URL установщика | Из таблицы «Выбор URL установщика» выше — по архитектуре | https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz
|
1.1. Установка Entware через командную строку
- Подключите USB-флешку. Воткните флешку в USB-порт роутера. Откройте веб-интерфейс: Приложения → USB-диски и принтеры — диск должен появиться в списке. Если файловая система не
ext4— нажмите Форматировать → EXT4. - Откройте встроенный веб-CLI Keenetic:
http://192.168.1.1/a(или подставьте свой LAN-IP роутера, если он другой). Должно появиться приглашение(config)>. - Узнайте UUID диска:
show media- В ответе найдите блок с вашей флешкой и поле
uuidвнутриpartition. Длинная строка видаd5f39712-...— это и есть нужное значение, скопируйте его.
- Запустите установку Entware. Подставьте свой UUID и URL по архитектуре (из таблицы «Выбор URL установщика» выше):
opkg disk <ВАШ_UUID_ДИСКА>:/ <URL_УСТАНОВЩИКА_ДЛЯ_ВАШЕЙ_АРХИТЕКТУРЫ>
- Пример с реальными подставленными значениями (mipsel):
opkg disk d5f39712-7ae1-dc01-00f3-97127ae1dc01:/ https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz
- Угловых скобок
<>в финальной команде остаться не должно. Двоеточие и слэш:/сразу после UUID — обязательны. После UUID и перед URL — ровно один пробел.
- Сразу включите DNS-override и сохраните конфиг:
opkg dns-override system configuration save
opkg dns-overrideзаставит KeeneticOS отдавать DNS-запросы клиентов в Entware-овский dnsmasq, который потом будет управляться keen-pbr. Без этого keen-pbr не сможет перехватывать DNS и маршрутизация по доменам работать не будет. Опция применится после reboot ниже.
- Дождитесь окончания установки. Откройте журнал в веб-интерфейсе:
http://192.168.1.1/diagnostics/general/log(если LAN-IP другой — подставьте). Установщик пишет туда что делает: качаетinstaller.tar.gz, распаковывает в/opt, ставит базовые пакеты. Это занимает 2–5 минут. Ждите финальной строкиEntware installed.
Системный журнал Keenetic (/diagnostics/general/log) с финальной строкой «Entware installed» — установка завершилась успешно, можно перезагружать роутер. - Не перезагружайте роутер до этой строки в журнале! Если ребутнуть роутер посреди установки, файлы Entware на флешке останутся неконсистентными, и на следующих этапах посыпятся странные ошибки.
- Перезагрузите роутер из веб-CLI:
system reboot- Через 1–2 минуты роутер поднимется обратно. После reboot применятся: монтирование Entware с флешки в
/opt, автозапуск его сервисов, а главное —opkg dns-overrideиз шага 5.
Если установщик молчит: В некоторых сборках команда opkg disk ... URL молчит, если OPKG-диск уже был назначен раньше. В журнале нет строк про загрузку installer.tar.gz? Сбросьте назначение диска и повторите шаги 4–5:
no opkg disk
opkg disk <ВАШ_UUID>:/ <URL>
opkg dns-override
system configuration save
1.2. Первое подключение по SSH
После перезагрузки Entware поднимает встроенный SSH-сервер на порту 222.
На Windows — открываете PowerShell и подключаетесь одной командой:
ssh -p 222 root@192.168.1.1
(LAN-IP роутера другой — подставьте.)
Параметры подключения:
| Параметр | Значение |
|---|---|
| Хост | LAN-IP роутера (192.168.1.1 по умолчанию)
|
| Порт | 222 |
| Логин | root
|
| Пароль | keenetic (заводской)
|
При первом подключении SSH спросит fingerprint — ответьте yes.
Смена пароля (обязательно!)
Сразу после входа:
passwd
Введите новый пароль дважды.
Внимание: дефолтный keenetic известен всем. Если SSH когда-нибудь будет проброшен наружу — роутер взломают за минуты.
Хотите ходить по ключу, без ввода пароля? См. Приложение А в конце документа. Для базовой установки это не нужно — переходите к Этапу 2.
Всё готово для установки утилит. Переходите к Этапу 2.
Этап 2. Установка sing-box (через singbox-helper)
sing-box — движок туннеля. Раньше его ставили вручную (opkg install sing-box-go) и сами писали config.json на 60+ строк JSON. Теперь весь этот шаг делает утилита singbox-helper — она:
- подтягивает
sing-box-goкак зависимость opkg (62 МБ, ставится автоматически); - даёт веб-интерфейс на
http://<LAN-IP-роутера>:8765 - по вставленной ссылке узла (
vless://,hysteria2://,socks5://) сама собирает корректныйconfig.json, бэкапит старый, рестартит sing-box и прогоняет диагностику.
2.1. Подключение фида singbox-helper и установка
Так как у нас первый чистый запуск нужно установить несколько стандартных вещей:
opkg update
opkg install wget-ssl curl
Подключитесь по SSH и добавьте репозиторий пакетов:
echo 'src/gz singbox-helper https://wolfram0108.github.io/sing-box-helper/mipsel-3.4' >> /opt/etc/opkg.conf
opkg update
opkg install singbox-helper
opkg увидит зависимость Depends: sing-box-go и поставит обе утилиты сразу. На выходе:
/opt/bin/singbox-helper— наш бинарь (~7 МБ);/opt/sbin/sing-box— sing-box-go от Entware (~62 МБ распакованных);/opt/etc/init.d/S98singbox-helperи/opt/etc/init.d/S99sing-box— init-скрипты, прописаны в автозагрузку;- демон singbox-helper уже стартует и слушает
0.0.0.0:8765.
Совет — другая архитектура: Команда выше — для mipsel-3.4 (Keenetic / Xiaomi на MT7621/MT7620 — основная масса устройств). Для новых Keenetic Hopper/Hero/Giga на ARM64 — поменяйте URL на ...github.io/sing-box-helper/aarch64-3.10.
2.2. Открытие веб-интерфейса
В браузере: http://<LAN-IP-вашего-роутера>:8765 (например, http://192.168.10.1:8765; LAN-IP видно в веб-интерфейсе Keenetic в карточке «Домашняя сеть»).
Откроется страница с четырьмя вкладками: Главная, Настройки, Логи, Бэкапы.

На «Главной» сверху видно состояние:
- sing-box — running / не запущен (после свежей установки — running с заглушечным конфигом);
- TUN-интерфейс — UP / down;
- Текущий узел — пусто (мы ещё не применили ссылку).
2.3. Применение узла
В блоке «Применить узел» вставьте ссылку из вашей VPN-панели (3x-ui, Marzban, Hiddify и т.п.). Поддерживаются:
| Схема | Что это |
|---|---|
hysteria2://пароль@сервер:порт
|
Hysteria2 (синоним hy2://)
|
vless://uuid@сервер:порт?type=tcp&security=tls&...
|
VLESS vanilla (TCP / WS / gRPC / h2 / httpupgrade) |
vless://...?security=reality&pbk=...&flow=xtls-rprx-vision
|
VLESS + REALITY (+ Vision) |
socks5://127.0.0.1:1080
|
Локальный SOCKS-upstream — если на роутере уже работает naive-proxy / mieru-client, sing-box можно использовать как обёртку с TUN над ним |
Жмёте [ Применить ].
Через несколько секунд под формой появится блок «Проверка работы» с пятью шагами:
- Доступность узла — TCP-connect
server:portсо временем отклика. - sing-box процесс — PID и версия.
- Интерфейс singtun — UP / down.
- Прямой IP — что отвечает
https://api.ipify.orgчерез WAN. - IP через TUN — то же, но
curl --interface singtun. Должен отличаться от прямого.

Если все 5 шагов зелёные — туннель работает.
Особый случай — xhttp: Узлы с параметром type=xhttp на REALITY-серверах из 3x-ui не подключатся. sing-box 1.13 не имеет нативного xhttp-транспорта; helper маппит его в httpupgrade как best-effort, но реальные xhttp-серверы отвечают 400 Bad Request.
Обновление в будущем — обычным opkg:
opkg update
opkg upgrade singbox-helper
state.json и config.yaml переживают обновление.
Если IP совпадают — туннель не работает. Зайдите на вкладку Логи в UI, выберите источник sing-box — там будет конкретная причина.
Этап 3. Установка keen-pbr
keen-pbr решает одну задачу: какие домены отправлять в туннель singtun, а какие пускать напрямую. Имеет современный веб-интерфейс на отдельном порту.
3.1. Подключение репозитория и установка
Добавьте feed keen-pbr к конфигу OPKG и установите пакет:
echo 'src/gz keen-pbr https://repo.keen-pbr.fyi/repository/stable/keenetic/current/mipsel' >> /opt/etc/opkg.conf
opkg update
opkg install keen-pbr
Совет: Для других архитектур URL feed-а отличается. Список архитектур и URL — на странице репозитория проекта: https://repo.keen-pbr.fyi/repository/stable/ (выбрать OS = Keenetic / NetCraze, version = current, архитектуру — свою). Узнать архитектуру роутера можно командой opkg print-architecture.
Пакет потянет за собой зависимости: dnsmasq-full, ipset, iptables, libnl-* и др. — это нормально.
Интерактивный диалог при установке
В процессе установки появится вопрос:
Configuring keen-pbr. keen-pbr installation ------------------------ Tip: set KEEN_PBR_REPLACE_DNSMASQ_DEFAULTS=Y or N to automate keen-pbr installation. Replace /opt/etc/dnsmasq.conf with recommended keen-pbr dnsmasq defaults? [y/n]:
Ответьте y и нажмите Enter. Это критически важно — keen-pbr заменит дефолтный /opt/etc/dnsmasq.conf на свой шаблон, который позволяет keen-pbr динамически наполнять ipset-списки доменами. Без этого ничего работать не будет.
Ожидаемый ответ после ввода y:
Backing up existing /opt/etc/dnsmasq.conf to /opt/etc/dnsmasq.conf.backup-pre-keen-pbr Installing recommended keen-pbr dnsmasq base config to /opt/etc/dnsmasq.conf keen-pbr: Disabling HW NAT... net.netfilter.nf_conntrack_fastnat = 0 [local_list] Skipped (no URL) Starting keen-pbr... done. Installation complete! Config path: /opt/etc/keen-pbr/config.json Web API: http://my.keenetic.net:12121
3.2. Доступ к веб-интерфейсу
keen-pbr слушает на порту 12121.
Изнутри LAN роутера
В браузере устройства, подключённого к Keenetic:
http://LAN-АДРЕС-РОУТЕРА:12121
Например, http://192.168.1.1:12121, или http://my.keenetic.net:12121.

3.3. Базовая настройка через веб-интерфейс
Все пять шагов ниже делаются в UI keen-pbr. После них трафик пойдёт в туннель и DNS будет давать реальные IP, а не подменённые.
Шаг 1. Создать outbound (точку выхода в туннель)
В меню слева: Интернет → Outbounds (выходы) → + Добавить outbound.
| Поле | Значение |
|---|---|
| Tag | vpn (или любое короткое имя)
|
| Type | Interface
|
| Interface | singtun
|
| Gateway | оставить пустым |
| Gateway IPv6 | оставить пустым |
Сохранить. В списке outbounds появится строка vpn со статусом Исправен и активным интерфейсом.

Шаг 2. Создать список доменов
В меню слева: Правила трафика → Списки → + Добавить список.
| Поле | Значение |
|---|---|
| Имя | bypass
|
| Тип | Домены
|
| Источник | Inline (вкладка с textarea)
|
| Domains | вставьте список доменов, по одному на строку. Например:
example.com streaming-service.net another-site.org |
Совет: В режиме Inline можно вставить тысячи строк сразу. Один домен покрывает и сам сайт, и все его поддомены. Если вместо Inline хочется автоматическую подписку — выберите вариант URL и укажите адрес внешнего списка; keen-pbr будет обновлять его по расписанию.
Такие можно брать на allow-domains - тот же podckop использует именно эти списки "Russia inside, Telegram и так далее.
Сохранить.
Шаг 3. Создать правило маршрутизации
В меню слева: Правила трафика → Правила маршрутизации → + Добавить правило маршрутизации.
| Поле | Значение |
|---|---|
| List(s) | bypass (выбрать из выпадающего)
|
| Outbound | vpn (созданный на шаге 1)
|
| Enabled | включить |
Сохранить.
Дополнение: bypass это первый список что мы создали, их может быть сколько угодно, можно добавлять несколько. Например создать Russia inside на основе raw ссылки, и Telegram на основе Subnets.
Шаг 4. Убрать встроенный keenetic_dns
В меню слева: Интернет → DNS-серверы.
В таблице вы увидите две строки: keenetic_dns и quad9. Удалите keenetic_dns (иконка корзины в столбце «Действия»).
Зачем это нужно: Сервер keenetic_dns идёт через встроенный DNS-резолвер прошивки KeeneticOS. На некоторых конфигурациях (включённые «защитные» сервисы, community-порты) этот резолвер подменяет ответы для конкретных доменов на fake-IP из диапазона 198.18.x.x. Эти fake-IP попадают в ipset keen-pbr → маршрутизация формально срабатывает → но трафик улетает на несуществующий адрес и клиент получает таймаут.
Шаг 5. Назначить основной DNS-сервер
В меню слева: Правила трафика → DNS-правила → блок «Основные DNS сервера» (вверху страницы).
Нажмите + Добавить основной DNS сервер и выберите из списка quad9.
Что это такое: «Основные DNS сервера» — это fallback dnsmasq, то есть сервер, который используется, когда ни одно DNS-правило не подходит. После удаления keenetic_dns на шаге 4 он стал пустым — назначаем quad9 (9.9.9.9), чтобы все запросы шли на публичный DNS, а не на DNS прошивки.
Применить изменения
В правом нижнем углу горит оранжевый баннер «Несохранённые изменения». Нажмите «Применить и перезапустить» — keen-pbr перестроит конфигурацию dnsmasq и применит правила маршрутизации.
3.4. Скрипт правил NAT и FORWARD
Зачем нужен этот шаг: keen-pbr настраивает маркировку пакетов, ip-rule и таблицу маршрутизации, но не трогает таблицы NAT и FORWARD. Для интерфейсов, которые KeeneticOS знает (например, штатный WireGuard nwg0), правила NAT/FORWARD добавляет сам ndm. Но singtun от sing-box — userspace-интерфейс, ndm о нём не знает. Без MASQUERADE и FORWARD ACCEPT трафик клиентов LAN до туннеля не доходит. Создадим один маленький скрипт, который добавляет эти правила автоматически.
Подключитесь по SSH к роутеру и выполните одну команду:
cat > /opt/etc/ndm/netfilter.d/40-singtun-nat.sh << 'EOF'
#!/opt/bin/sh
[ "$table" = "nat" ] || [ "$table" = "filter" ] || [ -z "$table" ] || exit 0
TUN=singtun
LAN=br0
PATH=/opt/sbin:/opt/usr/sbin:$PATH
ip link show "$TUN" >/dev/null 2>&1 || exit 0
iptables -t nat -C POSTROUTING -o $TUN -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING -o $TUN -j MASQUERADE
iptables -C FORWARD -i $LAN -o $TUN -j ACCEPT 2>/dev/null || \
iptables -I FORWARD 1 -i $LAN -o $TUN -j ACCEPT
iptables -C FORWARD -i $TUN -o $LAN -j ACCEPT 2>/dev/null || \
iptables -I FORWARD 1 -i $TUN -o $LAN -j ACCEPT
EOF
chmod +x /opt/etc/ndm/netfilter.d/40-singtun-nat.sh
sh /opt/etc/ndm/netfilter.d/40-singtun-nat.sh
Последняя строка запустит скрипт в первый раз принудительно.
Почему именно /opt/etc/ndm/netfilter.d/, а не init.d
KeeneticOS-овский ndm периодически перестраивает таблицы iptables «с нуля» (при изменении сети, новых клиентах, реконфигурации). Всё, что добавлено обычным init.d-скриптом, при этом стирается. А скрипты в /opt/etc/ndm/netfilter.d/ ndm сам дёргает после каждого перестроения. Так что наш хук переживает любые события сети без вмешательства пользователя.
Переменные в скрипте
В скрипте всего два места, которые теоретически могут отличаться у разных пользователей:
| Переменная | Значение по умолчанию | Что подставить, если у вас иначе |
|---|---|---|
TUN
|
singtun
|
Имя TUN-интерфейса sing-box. singbox-helper в сгенерированном config.json по умолчанию ставит singtun — это совпадает с тем, что ожидают keen-pbr и этот NAT-скрипт. Менять не нужно. Если очень хочется — переименуйте в Настройках UI singbox-helper (поле «Имя интерфейса») и здесь синхронно.
|
LAN
|
br0
|
grep "state UP" на роутере или раздел "Домашняя сеть" в веб-UI Keenetic. |
Архитектура (mipsel/aarch64) на этот скрипт не влияет — пути /opt/etc/ndm/netfilter.d/ и /opt/sbin/iptables одинаковы для всех Entware-сборок
Этап 4. Установка nfqws2
nfqws2 — это userspace-демон, который через очередь NFQUEUE перехватывает первые пакеты соединений и модифицирует их так, чтобы DPI-фильтры не распознали трафик. Используется для обхода замедления сервисов потокового видео, голосовой связи и т.п. — без необходимости заворачивать их в туннель.
4.1. Установка
echo 'src/gz nfqws2-keenetic https://nfqws.github.io/nfqws2-keenetic/mipsel' >> /opt/etc/opkg.conf
opkg update
opkg install nfqws2-keenetic
После установки сервис стартует автоматически — вмешательства не требуется.
Проверка
/opt/etc/init.d/S51nfqws2 status
Ожидаемый результат:
Service NFQWS2 is running
Что обрабатывается по умолчанию
В заводском конфиге работает режим MODE_AUTO — комбинация:
| Список | Назначение |
|---|---|
/opt/etc/nfqws2/lists/user.list
|
Домены, для которых всегда применяется обход (по умолчанию ~280 строк: Google/YouTube/CDN сервисы). |
/opt/etc/nfqws2/lists/auto.list
|
Домены, которые nfqws2 сам обнаружил как замедленные/блокируемые. Заполняется автоматически. |
/opt/etc/nfqws2/lists/exclude.list
|
Домены, которые нельзя трогать (по умолчанию: домены KeeneticOS, чтобы не сломать облачные сервисы прошивки). |
Покрываемые протоколы: HTTPS (TCP/443), HTTP (TCP/80), QUIC (UDP/443), Discord voice, WireGuard handshake, STUN/TURN, Telegram MTProto.
4.2. (опционально) Веб-интерфейс
Для удобной работы со списками и стратегиями есть отдельный пакет с веб-UI.
Установка
echo 'src/gz nfqws-keenetic-web https://nfqws.github.io/nfqws-keenetic-web/all' >> /opt/etc/opkg.conf
opkg update
opkg install nfqws-keenetic-web
Пакет потянет lighttpd + PHP 8 — общий размер около 10 МБ.
Доступ
http://LAN-АДРЕС-РОУТЕРА:90
Например, http://192.168.1.1:90.
Ввести логин и пароль, те же что применяются для входа по ssh.

Финальная архитектура

После завершения всех этапов на роутере работают четыре сервиса:
| Сервис | Порт / Управление | Что делает |
|---|---|---|
| sing-box | TUN-интерфейс singtun; Clash API на :9090
|
Шифрует и пересылает трафик в туннель |
| keen-pbr | Web UI на :12121
|
Решает, какой трафик отправить в туннель |
| dnsmasq | UDP/TCP :53 на LAN-адресе роутера | Принимает DNS-запросы от LAN и наполняет ipset keen-pbr |
| nfqws2 | Демон, без отдельного порта (управление через файлы или nfqws-keenetic-web на :90)
|
Обходит DPI-фильтры для прямого трафика |
Эксплуатация
Добавление новых доменов в список keen-pbr
- Открыть UI keen-pbr на
:12121. - Правила трафика → Списки → выбрать список
bypass→ Изменить. - Добавить новые домены в textarea, Сохранить.
- Нажать «Применить и перезапустить» внизу страницы.
Добавление новых доменов в список nfqws2
Через файл
echo 'new-site.com' >> /opt/etc/nfqws2/lists/user.list
/opt/etc/init.d/S51nfqws2 restart
Через веб-UI
Открыть http://LAN-АДРЕС-РОУТЕРА:90, секция работы со списками.
Обновление компонентов
opkg update
opkg upgrade singbox-helper sing-box-go keen-pbr nfqws2-keenetic
postinst-хуки соответствующих пакетов перезапускают свои сервисы сами; runtime-данные (state.json, config.yaml, бэкапы) переживают opkg upgrade. Если что-то осталось висеть со старой версией — перезапустите вручную (/opt/etc/init.d/S98singbox-helper restart, S99sing-box restart) или перезагрузите роутер.
Просмотр логов
| Сервис | Команда |
|---|---|
| sing-box | grep sing-box |
| keen-pbr | grep keen-pbr + системный журнал в веб-UI Keenetic |
| nfqws2 | tail -f /opt/var/log/nfqws2.log (если включено логирование в конфиге)
|
Диагностика
Проверка статусов всех сервисов
/opt/etc/init.d/S98singbox-helper check # рекомендую: дальше его UI покажет состояние sing-box
/opt/etc/init.d/S99sing-box status
/opt/etc/init.d/S80keen-pbr status
/opt/etc/init.d/S56dnsmasq status
/opt/etc/init.d/S51nfqws2 status
Подсказка: На http://<LAN-IP>:8765 на вкладке Главная сразу видно состояние sing-box (PID, версия) и TUN-интерфейса. На вкладке Логи можно почитать sing-box-лог (фильтр поверх ndmc show log) и собственный лог helper'а, не залезая в SSH.
Проверка keen-pbr
keen-pbr --config /opt/etc/keen-pbr/config.json status
В выводе должно быть Overall: OK, а у outbound vpn [interface] iface=singtun — все строки со статусом OK.
Проверка туннеля
# Через локальный mixed-proxy sing-box
curl -sS --socks5-hostname 192.168.10.1:7891 https://api.ipify.org
# Прямо через TUN
curl -sS --interface singtun https://api.ipify.org
Оба должны вернуть IP вашего VPN-узла.
Проверка DNS
# Должен вернуться реальный публичный IP (НЕ из 198.18.x.x)
nslookup example.com 127.0.0.1
# Self-test keen-pbr — должен вернуть 127.0.0.88
nslookup check.keen.pbr 127.0.0.1
Проверка ipset и маршрутизации
# Какие IP уложены в bypass-список (должны быть реальные публичные)
ipset list kpbr4d_bypass | tail -20
# Маршрутная таблица для помеченного трафика
ip route show table 151
# Должна быть строка вида: default dev singtun scope link
# Помечает ли iptables пакеты
iptables -t mangle -L KeenPbrTable -n -v
# Счётчики MARK должны увеличиваться при тестовом запросе
# NAT и FORWARD для singtun (наш хук)
iptables -t nat -S POSTROUTING | grep singtun
iptables -S FORWARD | grep singtun
Частые проблемы
| Симптом | Причина | Решение |
|---|---|---|
| У клиентов нет интернета совсем | dnsmasq keen-pbr остановлен или поломан | Откатить opkg dns-override через 192.168.1.1/a: no opkg dns-override system configuration saveи перезагрузить роутер |
| Сайт из списка не открывается, но другие работают | Старый DNS-кеш на клиенте | ipconfig /flushdns + перезапуск браузера
|
nslookup site.com 127.0.0.1 возвращает 198.18.x.x
|
DNS прошивки подменяет ответы — сервер keenetic_dns не удалён в UI keen-pbr
|
Проверьте Шаги 4 и 5 раздела 3.3 — должен быть удалён keenetic_dns и добавлен quad9 в "Основные DNS сервера". После — Применить и перезапустить.
|
| keen-pbr UI показывает "dnsmasq недоступен" | /opt/etc/dnsmasq.conf не содержит секцию conf-script=... keen-pbr (вы ответили n на вопрос при установке)
|
Восстановить шаблон: cp /opt/usr/lib/keen-pbr/dnsmasq.conf.template /opt/etc/dnsmasq.conf && /opt/etc/init.d/S56dnsmasq restart
|
| Домены в списке резолвятся в реальный IP, но не открываются (таймаут с клиента) | Нет NAT/FORWARD-правил для singtun (хук не создан или не выполняется) | Проверить ls /opt/etc/ndm/netfilter.d/40-singtun-nat.sh. Если нет — пересоздать (раздел 3.4). Если есть — выполнить вручную: /opt/etc/ndm/netfilter.d/40-singtun-nat.sh
|
| sing-box не стартует, в логе "no firewall backend" | В PATH процесса нет iptables
|
Запускать только через init-скрипт /opt/etc/init.d/S99sing-box (он сам задаёт PATH)
|
| YouTube/Discord работают медленно или не работают | nfqws2 не запущен или его правила не применены | /opt/etc/init.d/S51nfqws2 status и при необходимости restart
|
| После установки nfqws-keenetic-web видна строка "Starting lighttpd... failed" | Не ошибка — lighttpd стартует до полной регистрации модулей и поднимается на следующей попытке | grep :90. Если процесс есть и порт слушается — всё в порядке. |
Шпаргалка (все команды на одной странице)
# === 1. ENTWARE (в командной строке Keenetic /a) ===
show media # узнать UUID
opkg dns-override # сразу включаем DNS-override
system configuration save
opkg disk ВАШ_UUID_ДИСКА:/ https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz
system configuration save
system reboot
# === 2. После SSH-входа на :222 (пароль keenetic) ===
passwd # сменить пароль root
# === 3. sing-box (через singbox-helper, подтянет sing-box-go как зависимость) ===
echo 'src/gz singbox-helper https://wolfram0108.github.io/sing-box-helper/mipsel-3.4' >> /opt/etc/opkg.conf
opkg update
opkg install singbox-helper curl nano wget-ssl
# UI: http://<LAN-IP>:8765 → вставить URI узла → Применить
# === 4. keen-pbr ===
echo 'src/gz keen-pbr https://repo.keen-pbr.fyi/repository/stable/keenetic/current/mipsel' >> /opt/etc/opkg.conf
opkg update
opkg install keen-pbr # на вопрос про dnsmasq.conf — ответить y
# Дальше — UI на http://my.keenetic.net:12121:
# * Outbounds: создать vpn (type=Interface, interface=singtun)
# * Списки: создать bypass с доменами
# * Правила маршрутизации: bypass → vpn
# * DNS-серверы: удалить keenetic_dns
# * DNS-правила → Основные DNS сервера: добавить quad9
# * Применить и перезапустить
# Скрипт NAT/FORWARD для singtun:
cat > /opt/etc/ndm/netfilter.d/40-singtun-nat.sh << 'EOF'
#!/opt/bin/sh
[ "$table" = "nat" ] || [ "$table" = "filter" ] || [ -z "$table" ] || exit 0
TUN=singtun
LAN=br0
PATH=/opt/sbin:/opt/usr/sbin:$PATH
ip link show "$TUN" >/dev/null 2>&1 || exit 0
iptables -t nat -C POSTROUTING -o $TUN -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING -o $TUN -j MASQUERADE
iptables -C FORWARD -i $LAN -o $TUN -j ACCEPT 2>/dev/null || \
iptables -I FORWARD 1 -i $LAN -o $TUN -j ACCEPT
iptables -C FORWARD -i $TUN -o $LAN -j ACCEPT 2>/dev/null || \
iptables -I FORWARD 1 -i $TUN -o $LAN -j ACCEPT
EOF
chmod +x /opt/etc/ndm/netfilter.d/40-singtun-nat.sh
# === 5. nfqws2 ===
echo 'src/gz nfqws2-keenetic https://nfqws.github.io/nfqws2-keenetic/mipsel' >> /opt/etc/opkg.conf
opkg update
opkg install nfqws2-keenetic # стартует автоматически
# === 6. (опц) Веб-UI для nfqws2 ===
echo 'src/gz nfqws-keenetic-web https://nfqws.github.io/nfqws-keenetic-web/all' >> /opt/etc/opkg.conf
opkg update
opkg install nfqws-keenetic-web # "failed" в конце — нормально, см. 4.2
Ссылки на проекты:
- Entware:
https://github.com/Entware/Entware - sing-box:
https://sing-box.sagernet.org/https://github.com/SagerNet/sing-box - keen-pbr:
https://keen-pbr.fyi/https://github.com/maksimkurb/keen-pbr - nfqws2-keenetic:
https://github.com/nfqws/nfqws2-keenetic - nfqws-keenetic-web:
https://github.com/nfqws/nfqws-keenetic-web - zapret (upstream):
https://github.com/bol-van/zapret
Приложение А. OpenSSH с ключом (опционально)
Этот раздел описывает продвинутую настройку SSH-доступа: установку полноценного OpenSSH-сервера в Entware и настройку входа по публичному ключу вместо пароля.
Внимание — этот раздел не нужен для обычной установки. Для всего, что описано в Этапах 1–4 (sing-box, keen-pbr, nfqws2), хватает стандартного входа по паролю через встроенный SSH-сервер Entware (dropbear) на порту 222 — настроенный в разделе 1.4. Делайте, только если вы понимаете, зачем это нужно лично вам.
Когда этот раздел действительно полезен
- Вы заходите на роутер часто и каждый раз вводить пароль раздражает.
- На том же ПК уже есть SSH-ключ, которым вы пользуетесь для других серверов, и хочется единообразия.
- Вы планируете давать роутеру доступ автоматизированным инструментам (скрипты, агенты, CI), которые не умеют вводить пароль.
- Хочется иметь возможность выключить парольную аутентификацию и оставить только ключ — это сильно повышает безопасность, если SSH будет проброшен наружу.
Если ни один пункт не про вас — не тратьте время.
Что мы получим
- Дополнительный SSH-сервер OpenSSH на порту 2022 (рядом с dropbear на 222, не вместо).
- Вход по публичному ключу без ввода пароля.
- Удобный алиас на ПК — подключение одной командой
ssh keen.
Встроенный dropbear на 222 остаётся работать — это «запасной» канал на случай, если что-то сломается в настройках OpenSSH.
А.1. Установка OpenSSH-сервера
opkg update
opkg install openssh-server
А.2. Создание пользователя для privsep
OpenSSH требует системного пользователя sshd для изоляции привилегий. В Entware его по умолчанию нет:
echo 'sshd:*:22:22:sshd:/var/empty:/bin/false' >> /opt/etc/passwd
echo 'sshd:*:22:' >> /opt/etc/group
mkdir -p /var/empty
chmod 755 /var/empty
А.3. Генерация host-ключей
ssh-keygen -A
А.4. Конфигурация sshd
nano /opt/etc/ssh/sshd_config
Найдите и отредактируйте следующие параметры (раскомментируйте, если стоит #):
Port 2022
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
StrictModes no
AuthorizedKeysFile /opt/root/.ssh/authorized_keys
Внимание про StrictModes: На Keenetic корневой каталог / смонтирован с правами 777. Это нормально для прошивки, но OpenSSH по умолчанию отказывает в pubkey-аутентификации, если хоть один каталог в пути до authorized_keys доступен на запись группе или всем. Параметр StrictModes no отключает эту проверку.
Сохраните файл (Ctrl+O → Enter → Ctrl+X).
А.5. Добавление публичного ключа
На вашем компьютере получите содержимое публичного ключа (Windows, PowerShell):
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
Если ключа нет — создайте: ssh-keygen -t ed25519.
На роутере:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
Вставьте строку публичного ключа (правой кнопкой мыши в PuTTY), сохраните файл, дайте права:
chmod 600 ~/.ssh/authorized_keys
А.6. Запуск
/opt/etc/init.d/S40sshd start
А.7. Открытие порта в фаерволе (если нужен внешний доступ)
Если планируете заходить с другой сети — добавьте правило в Сетевые правила → Межсетевой экран → Ethernet-подключение → Добавить правило:
| Поле | Значение |
|---|---|
| Имя | SSH OpenSSH
|
| Действие | Разрешить |
| Протокол | TCP |
| Порт назначения | Один порт → 2022
|
А.8. Удобный алиас на ПК
Создайте/откройте файл C:\Users\ВашИмя\.ssh\config и добавьте:
Host keen
HostName 192.168.1.1
User root
Port 2022
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Подставьте свой LAN-адрес роутера в HostName.
Теперь подключение — одной командой:
ssh keen
А.9. Откат
Если что-то пошло не так — встроенный dropbear на :222 продолжает работать, через него зайдите и удалите OpenSSH:
/opt/etc/init.d/S40sshd stop
opkg remove openssh-server
rm -f /opt/etc/init.d/S39sshd-prep
