RKNnoVPN/README.md

240 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## RKNnoVPN (Роскомнадзор, Нет ВПН!)
<img width="3339" height="1516" alt="image" src="https://github.com/user-attachments/assets/3edf3387-5c72-42ed-bb7a-35461b991e65" />
Прозрачный прокси для rooted Android без `VpnService`, TUN-интерфейса и VPN-иконки.
Проект состоит из Magisk/KernelSU/APatch-модуля и Android-приложения-контроллера. Трафик выбранных приложений перехватывается на уровне ядра через `iptables TPROXY` и отправляется в `sing-box`.
Устойчивый к методам обнаружения типа [YourVPNDead](https://github.com/loop-uh/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`.
## Как это работает
```text
Приложение 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 для кросс-сборки.
Команды:
```bash
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. Можно зафиксировать версию:
```bash
make singbox SINGBOX_VERSION=1.14.0-alpha.16
```
## CI/CD
Тег `v*` запускает GitHub Actions:
```bash
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`.
## Диагностика
Проверка состояния:
```sh
su -c '/data/adb/modules/rknnovpn/bin/rknnovpn-runtime status'
```
Запуск:
```sh
su -c '/data/adb/modules/rknnovpn/bin/rknnovpn-runtime start'
```
Логи core:
```sh
su -c 'cat /data/adb/modules/rknnovpn/logs/sing-box.log'
```
Логи runtime:
```sh
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
## Благодарности
- [sing-box](https://github.com/SagerNet/sing-box)
- [box_for_magisk](https://github.com/taamarin/box_for_magisk)
- [RKNHardering](https://github.com/xtclovver/RKNHardering)