No description
  • Kotlin 58.9%
  • Go 29.4%
  • Shell 11%
  • Makefile 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
loop-uh 432a5f1c91
All checks were successful
RKNnoVPN Linux and Android CI / policy-and-go (push) Successful in 14s
RKNnoVPN Linux and Android CI / android-debug (push) Successful in 7m54s
Use Forgejo artifact storage action
2026-08-07 01:15:43 +03:00
.forgejo/workflows Use Forgejo artifact storage action 2026-08-07 01:15:43 +03:00
.github Complete root-manager staging layout 2026-06-07 23:42:51 +03:00
app Implement explicit runtime action contract 2026-06-17 21:59:30 +03:00
docs/architecture-reset чистая новая архитектура 2026-05-08 19:19:31 +03:00
module Complete root-manager staging layout 2026-06-07 23:42:51 +03:00
runtime Implement explicit runtime action contract 2026-06-17 21:59:30 +03:00
tools Rework runtime ownership to local-first APK architecture 2026-05-07 17:10:52 +03:00
.gitignore Update .gitignore 2026-05-07 21:55:06 +03:00
CHANGELOG.md Rework runtime ownership to local-first APK architecture 2026-05-07 17:10:52 +03:00
LICENSE Fix README: rename to RKNnoVPN, add LICENSE, mark unimplemented formats 2026-04-11 15:42:30 +03:00
Makefile чистая новая архитектура 2026-05-08 19:19:31 +03:00
README.md Rework runtime ownership to local-first APK architecture 2026-05-07 17:10:52 +03:00
RKNNOVPN_ARCHITECTURE.md Implement explicit runtime action contract 2026-06-17 21:59:30 +03:00
update.json Release v2.4.1 2026-06-17 23:39:46 +03:00
VERSION Release v2.4.1 2026-06-17 23:39:46 +03:00

RKNnoVPN (Роскомнадзор, Нет ВПН!)

image

Прозрачный прокси для rooted Android без VpnService, TUN-интерфейса и VPN-иконки.

Проект состоит из Magisk/KernelSU/APatch-модуля и Android-приложения-контроллера. Трафик выбранных приложений перехватывается на уровне ядра через iptables TPROXY и отправляется в sing-box.

Устойчивый к методам обнаружения типа YourVPNDead.

Что это даёт

  • Нет Android VPN API: приложения не видят TRANSPORT_VPN.
  • Нет tun0 и системной VPN-иконки.
  • APK владеет профилем, подписками и update-check/download. Root/module опционален и нужен только для runtime-действий: apply/start/stop/reset/logs.
  • APK запрашивает package visibility для локального выбора приложений: список установленных приложений читается через Android PackageManager.
  • Можно проксировать только выбранные приложения, оставляя остальные напрямую.
  • Можно включить раздачу трафика клиентов хотспота через RKNnoVPN.
  • Сохранённые серверы рендерятся в sing-box как отдельные outbounds.
  • Над несколькими серверами используется urltest, чтобы sing-box выбирал рабочий и быстрый outbound.
  • Поддерживается arm64-v8a и armeabi-v7a.

Как это работает

Приложение Android
  -> iptables mangle / TPROXY
  -> sing-box tproxy inbound
  -> urltest / outbound
  -> прокси-сервер

APK работает local-first. Он хранит профиль и подписки в app-private storage, рендерит runtime config и передаёт его root CLI rknnovpn-runtime через su. Module применяет уже отрендеренную runtime-конфигурацию, запускает core, применяет iptables/DNS/routing и возвращает минимальные status/logs/version.

Компоненты

Компонент Назначение
Magisk-модуль Скрипты установки, boot service, SELinux policy, rknnovpn-runtime, sing-box
rknnovpn-runtime root CLI: exact-match version gate, apply rendered config, start/stop/reset, logs/status
Android APK Kotlin/Compose панель управления; owns profile, subscriptions, update check/download, UI state
sing-box transport core: tproxy inbound, outbounds, urltest, Clash API для delay-тестов

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

  1. Скачайте свежий релиз:

    • rknnovpn-vX.X.X-module.zip
    • rknnovpn-vX.X.X-panel.apk
  2. Прошейте module ZIP через Magisk Manager / KernelSU Manager / APatch.

  3. Перезагрузите устройство.

  4. Установите APK.

  5. Добавьте сервер на вкладке Серверы:

    • вставкой ссылки;
    • QR-кодом;
    • подпиской.
  6. На вкладке Приложения выберите приложения для проксирования.

  7. Нажмите Подключить.

Поддерживаемые протоколы

Протокол Статус
VLESS + Reality основной сценарий
VLESS + TLS поддерживается
Trojan поддерживается
VMess поддерживается
Shadowsocks / Shadowsocks 2022 поддерживается
SOCKS4 / SOCKS5 upstream поддерживается
Hysteria2 поддерживается через sing-box
TUIC v5 поддерживается через sing-box
WireGuard поддерживается как sing-box outbound без kernel WG-интерфейса
AmneziaWG отдельный будущий слой, не равен обычному WireGuard

Форматы импорта

Поддерживаются:

  • vless://
  • vmess://
  • trojan://
  • ss://
  • socks://, socks4://, socks4a://, socks5://
  • hysteria2://, hy2://
  • tuic://
  • vpn:// Amnezia
  • WireGuard .conf и encoded WireGuard URI
  • подписки с base64/plain URI list
  • QR-коды

Пока не реализовано:

  • Clash YAML import;
  • sing-box JSON import;
  • v2rayNG backup import.

Выбор серверов и тесты

Все сохранённые nodes попадают в sing-box как outbounds. Если серверов несколько, runtime renderer создаёт urltest outbound с тегом proxy, а маршрут по умолчанию указывает на него.

В UI есть Проверить все:

  • TCP connect показывает время соединения до адреса сервера.
  • URL delay показывает задержку реального запроса через конкретный outbound, если core уже запущен.
  • Если URL-проба отдаёт тело ответа, UI также показывает измеренную скорость ответа и умеет сортировать nodes по скорости.

Для белых списков важно смотреть не только TCP ping. Низкий ping не гарантирует нормальную скорость: при ограничении со стороны ТСПУ пакет может отвечать быстро, но реальный HTTP/HTTPS response будет идти секунды. Поэтому главная метрика для авто-выбора - URL response / delay, а ping используется как вспомогательная диагностика.

Правила маршрутизации

В настройках есть режим Правила и редактор доменов/IP:

  • Домены напрямую и IP/CIDR напрямую обходят прокси;
  • Домены через прокси и IP/CIDR через прокси принудительно идут через RKNnoVPN;
  • Заблокированные домены и Заблокированные IP/CIDR отклоняются.

Правила задаются по одному значению в строке. Для доменов используйте обычные имена вроде example.com, для IP - адреса или CIDR-сети вроде 203.0.113.10 или 203.0.113.0/24.

Отдельная защита Российские сайты напрямую добавляет прямой маршрут для российских IP и доменов .ru, .su, .рф. Её лучше оставлять включённой: если выключить защиту, российские сервисы могут увидеть VPN-трафик и IP прокси-сервера.

Режимы приложений

Текущая модель:

  • общий urltest/proxy outbound по умолчанию;
  • группы серверов: у node можно задать Группа, а несколько nodes в одной группе рендерятся как отдельный group urltest/selector outbound;
  • на вкладке Приложения можно назначить приложению конкретную группу серверов;
  • список приложений через прокси или список приложений в обход;
  • правила доменов/IP для прямого маршрута, принудительного прокси и блокировки;
  • быстрые кнопки Выбрать все и Снять весь выбор.

Ограничения текущей модели:

  • привязка идёт к группе node, а не к произвольному raw outbound tag;
  • для отдельного urltest под браузеры/мессенджеры нужно разнести nodes по соответствующим группам вручную.

Сборка

Требования:

  • Go 1.22+ для root runtime helpers;
  • Go 1.24.x для сборки актуального sing-box;
  • JDK 17 + Android SDK для APK;
  • Linux/macOS для кросс-сборки.

Команды:

make runtime   # rknnovpn-runtime для arm64 + armeabi-v7a
make singbox   # статическая сборка sing-box для arm64 + armv7
make module    # Magisk module ZIP
make apk       # debug APK
make all

По умолчанию make singbox пытается взять последний релиз sing-box через GitHub CLI. Можно зафиксировать версию:

make singbox SINGBOX_VERSION=1.14.0-alpha.16

CI/CD

Тег v* запускает GitHub Actions:

git tag v1.4.2
git push origin v1.4.2

Workflow:

  • собирает rknnovpn-runtime для arm64 и armv7;
  • резолвит актуальный release sing-box;
  • собирает sing-box статически;
  • собирает module ZIP;
  • собирает APK;
  • создаёт GitHub Release;
  • обновляет update.json.

Диагностика

Проверка состояния:

su -c '/data/adb/modules/rknnovpn/bin/rknnovpn-runtime status'

Запуск:

su -c '/data/adb/modules/rknnovpn/bin/rknnovpn-runtime start'

Логи core:

su -c 'cat /data/adb/modules/rknnovpn/logs/sing-box.log'

Логи runtime:

su -c '/data/adb/modules/rknnovpn/bin/rknnovpn-runtime logs --lines 100'

Если sing-box упал до открытия порта 10853, ошибка в приложении должна содержать хвост sing-box.log.

Что пока не готово

  • AmneziaWG runtime.
  • Отдельный полный speed-throttle probe для диагностики второго типа белых списков; базовая скорость уже измеряется, если URL-проба отдаёт тело ответа.

Лицензия

MIT

Благодарности