Гибкая маршрутизация и обход DPI на Keenetic (sing-box + keen-pbr + nfqws2)

Материал из wolfram
Перейти к навигации Перейти к поиску

Установка стека: гибкая маршрутизация и обход 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-фильтрацию для сервисов, которые не нужно заворачивать в туннель (например, потоковое видео — чтобы не нагружать тоннель и не терять скорость).

Общая архитектура

Общая схема: keen-pbr по адресу домена решает, отправить трафик в туннель singtun (sing-box → VPN-сервер) или пустить через nfqws2 + прямой WAN.

Требования

Требование Описание
Роутер 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 через командную строку

  1. Подключите USB-флешку. Воткните флешку в USB-порт роутера. Откройте веб-интерфейс: Приложения → USB-диски и принтеры — диск должен появиться в списке. Если файловая система не ext4 — нажмите ФорматироватьEXT4.
    Страница «USB-диски и принтеры» в веб-интерфейсе Keenetic с подключённой USB-флешкой и опцией «Форматировать» в EXT4.
  2. Откройте встроенный веб-CLI Keenetic: http://192.168.1.1/a (или подставьте свой LAN-IP роутера, если он другой). Должно появиться приглашение (config)>.
  3. Узнайте UUID диска:
    show media
    
    В ответе найдите блок с вашей флешкой и поле uuid внутри partition. Длинная строка вида d5f39712-... — это и есть нужное значение, скопируйте его.
  4. Запустите установку 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 — ровно один пробел.
  5. Сразу включите DNS-override и сохраните конфиг:
    opkg dns-override
    system configuration save
    
    opkg dns-override заставит KeeneticOS отдавать DNS-запросы клиентов в Entware-овский dnsmasq, который потом будет управляться keen-pbr. Без этого keen-pbr не сможет перехватывать DNS и маршрутизация по доменам работать не будет. Опция применится после reboot ниже.
  6. Дождитесь окончания установки. Откройте журнал в веб-интерфейсе: 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 на флешке останутся неконсистентными, и на следующих этапах посыпятся странные ошибки.
  7. Перезагрузите роутер из веб-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 в карточке «Домашняя сеть»).

Откроется страница с четырьмя вкладками: Главная, Настройки, Логи, Бэкапы.

Главный экран приложения Singbox-helper

На «Главной» сверху видно состояние:

  • 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 над ним

Жмёте [ Применить ].

Через несколько секунд под формой появится блок «Проверка работы» с пятью шагами:

  1. Доступность узла — TCP-connect server:port со временем отклика.
  2. sing-box процесс — PID и версия.
  3. Интерфейс singtun — UP / down.
  4. Прямой IP — что отвечает https://api.ipify.org через WAN.
  5. IP через TUN — то же, но curl --interface singtun. Должен отличаться от прямого.
Пример успешного подключения в Singbox-helper

Если все 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.

Keen-pbr - пример главного экрана

3.3. Базовая настройка через веб-интерфейс

Все пять шагов ниже делаются в UI keen-pbr. После них трафик пойдёт в туннель и DNS будет давать реальные IP, а не подменённые.

Шаг 1. Создать outbound (точку выхода в туннель)

В меню слева: ИнтернетOutbounds (выходы)+ Добавить outbound.

Поле Значение
Tag vpn (или любое короткое имя)
Type Interface
Interface singtun
Gateway оставить пустым
Gateway IPv6 оставить пустым

Сохранить. В списке outbounds появится строка vpn со статусом Исправен и активным интерфейсом.

Страница «Outbounds (выходы)» в веб-интерфейсе keen-pbr со списком из трёх выходов: wan, block, vpn (interface=singtun).

Шаг 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.

Пример главного окна Nfqws2

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

Полная схема трафика через роутер: DNS-запросы клиента идут в keen-pbr dnsmasq → Quad9, ответы накапливаются в ipset; TCP-трафик в iptables маркируется и уходит либо в singtun (sing-box → VPN-узел), либо через WAN с DPI-обходом nfqws2.

После завершения всех этапов на роутере работают четыре сервиса:

Сервис Порт / Управление Что делает
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

  1. Открыть UI keen-pbr на :12121.
  2. Правила трафикаСписки → выбрать список bypassИзменить.
  3. Добавить новые домены в textarea, Сохранить.
  4. Нажать «Применить и перезапустить» внизу страницы.

Добавление новых доменов в список 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

Ссылки на проекты:


Приложение А. 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+OEnterCtrl+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