LTechnologies0/OnionVPN

GitHub: LTechnologies0/OnionVPN

一款 Android 隐私 VPN 应用,通过 Tor 路由全部流量并结合 DNSCrypt 加密 DNS,提供交互式防火墙与 kill switch 防止流量泄露。

Stars: 9 | Forks: 0

# OnionVPN 注重隐私的 Android VPN,**将所有设备流量通过 Tor 路由**,并为应用 DNS 提供 **DNSCrypt** 支持(默认通过 Tor SOCKS;FakeDNS / SOCKS5A 作为设置中的回退方案)。灵感来自 InviZible 和 Mullvad 式的防泄漏保护。 **包名:** `ltechnologies.onionphone.onionvpn` **Min SDK 26 · Target / Compile SDK 37 · Java/Kotlin 21 · Jetpack Compose** ### 功能说明 | 功能 | 描述 | |---------|-------------| | Tor 隧道 | 通过 hev-socks5-tunnel → Tor SOCKS 实现全局设备 VPN;当隧道断开时,通过 kill switch 阻断流量 | | DNSCrypt | 通过 DNSCrypt 解析应用 DNS(上游通过 Tor);TunDnsMux 位于 `10.8.0.1` | | 交互式防火墙 | OpenSnitch 风格的新出站连接 Accept / Deny(通知 + 提示,FIFO 队列,永久 / 会话 / 临时规则) | | 域名威胁列表 | HaGeZi 列表在提示框中为目标添加颜色标记:🟢 安全(未列出),🟠 广告/追踪/遥测,🔴 恶意软件/C2 —— 当隧道启动时,更新会优先使用 Tor | | 应用锁 | 锁定 UI 而不停止隧道或 kill switch | | Tor 调优 | 线路轮换预设,流隔离模式,可编辑 `torrc` / `dnscrypt-proxy.toml` | | Tor 引擎 | 双后端:**C Tor** (`libtor.so`,默认) 或实验性的 **Arti** (Rust, `arti-mobile`) | ## 架构 | 层级 | 角色 | |-------|------| | Tor | SOCKS + DNSPort(临时端口),根据 DNS 模式决定是否启用 SafeSocks | | Arti(可选启用) | 通过 `org.torproject:arti-mobile` 实现的进程内 Rust Tor;一个共享的 SOCKS + DNS;无经典 ControlSocket | | DNSCrypt | 通过 TunDnsMux 处理应用 DNS;上游通过 Tor SOCKS;通过 Tor DNSPort 引导 | | VPN | `OnionVpnService` + hev-socks5-tunnel;客户端 `10.8.0.2`,DNS `10.8.0.1` | | 防火墙 | 运行于 TUN 之上的 `InteractiveFirewallEngine`;用于提示 UI 的 DNS 主机名缓存 + 本地信誉数据库 (HaGeZi / URLhaus / Yoyo / uAssets) | 模块:`app`, `core:model`, `core:tor`, `core:dnscrypt`, `core:vpn`, `core:validation`。 ## 构建 ``` # 如果缺失,始终获取 natives (arm64-v8a + x86_64) ./scripts/fetch-native-binaries.sh # Debug (设备 ABI) ./gradlew :app:assembleDebug -Ponionphone.devAbi=arm64-v8a # Release splits (arm64-v8a, x86_64) ./gradlew :app:assembleRelease ``` 需要 JDK 21 和 Android SDK。创建包含 `sdk.dir=...` 的 `local.properties` 文件(未提交)。 ### 测试 ``` ./gradlew test ``` ## 安装 (debug) ``` adb install -r app/build/outputs/apk/debug/app-debug.apk ``` ## 发布 (GitHub Actions) 推送 `v*.*.*` 标签(或使用标签输入运行 **Release** 工作流)以发布已签名的特定 ABI 的 APK: - `onionvpn--arm64-v8a.apk` - `onionvpn--x86_64.apk` - `SHA256SUMS.txt` **Obtainium / 侧载:** 在 Pixel 和大多数手机上,只需使用 **`arm64-v8a`** APK。 `x86_64` 适用于模拟器(在 arm64 设备上会报错 `INSTALL_FAILED_NO_MATCHING_ABIS`)。 在 Obtainium 中,设置匹配 `arm64-v8a` 的 APK 过滤器。如果安装失败并提示 `INSTALL_FAILED_UPDATE_INCOMPATIBLE`,请卸载 **所有用户/配置文件**(包含工作/测试配置文件)中使用了不同签名密钥的残留安装,然后重试。 ### CI 签名密钥 | 密钥 | 描述 | |--------|-------------| | `RELEASE_KEYSTORE_BASE64` | Base64 编码的 `.jks` / `.keystore` | | `RELEASE_KEYSTORE_PASSWORD` | Keystore 密码 | | `RELEASE_KEY_ALIAS` | 密钥别名(在 gradle 中默认为:`onionvpn`) | | `RELEASE_KEY_PASSWORD` | 密钥密码(默认与 keystore 密码相同) | 本地操作:复制 `keystore.properties.example` → `keystore.properties`(已被 gitignore 忽略)。 ## 原生二进制文件 预构建的 Tor / DNSCrypt 和 hev-socks5-tunnel 位于 `app/src/main/jniLibs/{arm64-v8a,x86_64}/` 目录下。 使用 `scripts/fetch-native-binaries.sh` 进行刷新: - **Tor (C / little-t)** — [LTechnologies0/Tor-Android-build-script](https://github.com/LTechnologies0/Tor-Android-build-script) (我们 fork 自 Gedsh 的 Android Tor 构建脚本;GitHub Release `libtor-*.so`) — 默认引擎 - **Arti (Rust)** — [arti-mobile](https://gitlab.com/guardianproject/tormobile/arti-mobile) Maven AAR (`org.torproject:arti-mobile`)附带了 `libarti_mobile_ex.so`;在 设置 → Tor 下选择 **Arti** - **DNSCrypt** — InviZible Lite **v7.5.0** APK 提取 - **hev-socks5-tunnel** — sockstun APK 提取 **没有**运行时的 Tor 二进制 OTA 更新;请通过刷新 jniLibs / AAR 并发布新的 OnionVPN APK 来发布更新。 ### Tor 引擎 (Settings → Tor) 在运行时选择 **C Tor** 或 **Arti**。各项功能通过 `TorEngineCapabilities` (UI、验证、恢复、Automap)进行控制。 | 功能 | C Tor | Arti | |------------|-------|------| | SOCKS 代理 | 多端口 SessionGroups | 单个共享 SOCKS (+ SOCKS 用户名/密码) | | `.onion` Automap | 原生 DNSPort Automap | 应用端合成器 → SOCKS5A | | 经典 ControlSocket | 是 | 否 (`arti.status` + Ext JNI / 合成) | | 线路 / 流 UI | 是 | 否 (无 list-circuits API) | | ExitNodes 国家 | StrictNodes | 通过 `StreamPrefs::exit_country` 设置单个 `{cc}` (geoip) | | Entry / ExcludeNodes | 是 | 否 | | Conjure PT | 是 | 是 (`TransportConfig` + `libConjure.so`) | | DORMANT / ACTIVE | SIGNAL | `TorClient::set_dormant` (修补过的 SO) | | MaxCircuitDirtiness | 实时 SETCONF | Ext JNI `reconfigure` (修补过的 SO) | | NewCircuitPeriod | 实时 SETCONF | `prediction_lifetime` 类似物 (修补过的 SO) | | RESOLVE | ControlPort | `TorClient::resolve` Ext JNI (DNSPort 回退) | | 换身份 | SIGNAL NEWNYM | 运行时重启 | | Bridges + Lyrebird | 是 | 是 (托管路径) | OnionVPN 在 `app/src/main/jniLibs/` 目录下附带了修补过的 `libarti_mobile_ex.so`(参见 `native/arti-mobile-ex/`),它在 Maven AAR Java API 之上导出了 `ArtiControlNative` control-api≥2。使用 `./native/arti-mobile-ex/build-onionvpn.sh` 进行重新构建。 使用 `[patch.crates-io]` → `third_party/arti-1.7.0-onionvpn` 以支持 SOCKS 出口国家。 ## 许可证 专有软件 / OnionPhone 系列 —— 发布后请参阅仓库许可证。
标签:Android应用, DNSCrypt, JS文件枚举, Kotlin, Tor, VPN, 网络安全, 防火墙, 隐私保护