# RControlRelay **Repository Path**: qinkunming/RControlRelay ## Basic Information - **Project Name**: RControlRelay - **Description**: RControl 中继版 | 中继穿透内网 NAT · 多平台主控端 Win/Linux/macOS/Android · 端到端加密,中继只见密文 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-14 - **Last Updated**: 2026-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RControlRelay **RControl 中继版远程控制软件** —— 在[直连版 RControl](https://github.com/qinkunming/RControl) 基础上新增中继穿透:被控端在 NAT/内网后(公司、家人电脑、无公网 IP)也能被远程控制; 同时新增 Linux / macOS / Android 主控端。Rust 实现,单文件免依赖,端到端加密贯穿全程。 设计原则是**"加中继,不改已有"**:直连模式原样保留,两种模式共存; 端到端加密协议(nonce 握手 → HKDF → AES-256-GCM)一行未动,在隧道里原样运行, **中继服务器只见密文**。 ``` ┌─────────┐ ①被控端主动出连注册 ┌──────────────┐ ①主控端连入请求 ID ┌─────────┐ │ 被控端 │ ──────────────────────→ │ rcontrol_ │ ←────────────────────── │ 主控端 │ │ (内网) │ ←────────────────────── │ relay │ ──────────────────────→ │ (任意) │ └─────────┘ ②配对成功后双向转发 │ (公网机器) │ ②配对成功后双向转发 └─────────┘ └──────── 端到端加密数据(中继只见密文)────────┘ ``` ## 功能特性 **远程控制(与直连版一致)** - 远程画面 1:1 原始分辨率显示、键鼠控制、文件传输(双栏管理器)、剪贴板文本双向同步 - 锁屏/登录界面下可远程登录(服务模式 + Ctrl+Alt+Del) - 被控端支持 Windows 7 / Server 2019 / Win10 / Win11,服务模式开机自启 **中继版新增** - **中继穿透**:被控端主动出连注册中继(NAT 天然放行,无需端口映射), 主控端经中继按 ID 配对连接;直连/中继可同时开启 - **中继端自带运维能力**:内置阿里云 DDNS(家宽动态 IP 自动跟新域名解析)与 UPnP 端口映射尝试;固定公网 IP 的云服务器一个 `[relay]` 配置段即可 - **多平台主控端**:Windows(Win32 版 + egui 版)、Ubuntu Linux(egui,实测 11/11)、 macOS(egui)、**Android 手机**(Kotlin + JNI,手势操作 + 软键盘 + 蓝牙键盘) - **在线状态探测**:清单里逐台检测被控端在线/会话中/离线(无需改被控端/中继端) ## 架构设计 | crate | 职责 | |---|---| | `rcontrol_common` | 协议与编解码,含中继控制消息 `RelayCtrl` | | `rcontrol_server` | 被控端(服务 + worker,含中继注册客户端)| | `rcontrol_client` | 主控端 Win32 GUI(支持 Win7)| | `rcontrol_client_core` | **纯 std Rust** 连接核心(无平台依赖,供多平台复用)| | `rcontrol_client_gui` | egui 跨平台主控端(Win/Linux/macOS 同一套代码)| | `rcontrol_android` | client_core 的 JNI 包装(cdylib,供安卓 APK 调用)| | `rcontrol_relay` | 中继端:ID 注册表 + 配对 + 双向转发,内置 DDNS/UPnP | **中继为什么是反向隧道**:被控端**主动出连**注册,NAT/防火墙天然放行(和上网一样), 被控端不需要任何端口映射;主控端只连得到中继,由中继按 ID 配对后拼接两条 TCP 流。 配对完成后中继不再解析任何字节(纯 splice 转发)。 **中继控制协议 RelayCtrl**(配对前走既有帧格式): | 消息 | 方向 | 说明 | |---|---|---| | `Register` | 被控端→中继 | 注册;HMAC-SHA256(key, nonce‖id‖ts) 鉴权 | | `Connect` | 主控端→中继 | 请求连接某 ID(同款鉴权)| | `Ok` | 中继→两端 | 配对成功,随后是纯字节管道 | | `Err` | 中继→发起方 | `NO_ID` / `BUSY` / `AUTH` / `BANNED` | | `Ping/Pong` | 双向 | 保活 | **复用关键设计**:中继隧道到手后直接交给被控端现有 `worker::handle_conn` / 主控端现有 `connect()`——把"直连拿到的流"换成"经中继配对拿到的流", 加密与会话逻辑零改动。这是"加中继不降安全性"的根本保证。 ## 安全机制 - 端到端 AES-256-GCM 加密:密钥由口令 + 双方随机数派生,每次连接不同; 中继只见密文,无法解密画面/文件/口令 - 双向认证:口令错误无法连接,且能防服务端伪造 - **中继接入认证**:接入中继需持同一中继密钥(HMAC 签名 + ±60 秒时间窗防重放); 连错 5 次封 IP 60 秒 - 同一被控端同一时间只接受一个主控连接(直连/中继共用规则,后来者收"忙") - 中继端日志只记录 IP / ID / 时长 / 流量字节数,不记录内容数据 ## 部署 ### 中继端(一台有公网 IP 的机器) 云服务器(固定 IP)或家庭公网宽带(动态 IP,程序 DDNS 自动维护域名)均可。 放好 `rcontrol_relay.exe`(Linux 为 `rcontrol_relay`),同目录写 `config.toml`: ```toml [relay] key = "自己编一个长随机串" # 中继接入密钥,被控端和主控端填同一个 port = 9999 # 监听端口,防火墙/端口映射按这个放行 # 固定公网 IP 到这就完了。家庭宽带动态 IP 再加 DDNS 段: [ddns] provider = "aliyun" domain = "relay.example.com" # 你的子域名 access_key_id = "..." # 阿里云 RAM 子账户 AccessKey(最小授权) access_key_secret = "..." interval = 60 ``` 网络侧:防火墙放行 TCP 9999 入站;家宽需在光猫/路由器做端口映射(程序启动时也会 自动尝试 UPnP)。DDNS 使用前先在阿里云做一次性配置:创建 RAM 子账户 AccessKey (只授权 `dns:DescribeSubDomainRecords` / `dns:AddDomainRecord` / `dns:UpdateDomainRecord` 三个动作),再手动添加一条占位 A 记录(TTL 600);此后程序每 60 秒经外部接口 检测公网 IP、仅变化时更新解析。 ### 被控端 / 主控端 与直连版相同(管理员运行 `rcontrol_server.exe`,安装服务)。被控端在设置窗口 "中继 (内网穿透)"区勾选启用,按**所在位置**填中继地址(跑中继的机器填 `127.0.0.1:9999`、 同一局域网填中继机内网 IP、**跨网络必须填域名**)和中继密钥,自动生成数字 ID。 **主控端地址格式**: ``` 直连:192.168.1.10:3333 # 端口不填默认 3333 中继:relay.example.com:9999/1234567 # 中继地址 + / + 被控端 ID,默认端口 9999 带密钥:relay.example.com:9999/1234567#密钥 # 推荐写法,随清单保存 ``` ## 编译构建 **Windows 全套**(stable-msvc): ``` cargo build --release ``` 产物:`rcontrol_server.exe`(被控端)、`rcontrol_client.exe`(主控端 Win32 版)、 `rcontrol_client_gui.exe`(主控端 egui 版)、`rcontrol_relay.exe`(中继端)。 中继端也可在 Linux 服务器上直编:`cargo build --release -p rcontrol_relay`。 **Win7 兼容版**(被控端 + 主控端):rustc 1.77.2 + `x86_64-pc-windows-gnu` 静态链接 CRT,`cargo +1.77.2 build --release -p --target-dir target_win7` (Cargo.lock 已钉好兼容版本)。 **Ubuntu Linux 主控端**:`cargo build --release -p rcontrol_client_gui`, 先装依赖 `build-essential pkg-config libx11-dev libxi-dev libxcursor-dev libxrandr-dev libxinerama-dev libgl1-mesa-dev libxkbcommon-dev fonts-wqy-microhei` (最后一项是中文字体,不装则中文显示为方块)。 **Android APK**:WSL/Ubuntu 里 `bash android/wsl_build.sh` 一键构建(自动装 JDK/SDK/NDK),或 Android Studio 打开 `android/` 后先 `cargo ndk -t arm64-v8a -o android/app/src/main/jniLibs build -p rcontrol_android --release` 再 Build APK。要求手机 Android 8.0+ / arm64。 ## 快速上手(主控端) 1. 运行主控端,被控端清单里双击一台即连(清单存 `hosts.txt`,可手编) 2. 远程桌面内鼠标键盘直接操作;`Esc` 断开,`F9` 文件传输,`Ctrl+Shift+Del` 发 SAS 3. 安卓端:单指滑动移鼠标、双指轻点右键、双指捏合缩放、软键盘 + 剪贴板输入中文 **自动化自测**(三平台行为一致,11 项检查,退出码 0 = 全过): ``` rcontrol_client.exe --selftest 192.168.1.10:3333 口令 rcontrol_client.exe --selftest relay.example.com:9999/1234567 口令 ``` ## 仓库结构 ``` rcontrol_relay_v2/ ├── rcontrol_common/ # 协议与编解码(含 RelayCtrl) ├── rcontrol_server/ # 被控端(含中继注册客户端) ├── rcontrol_client/ # 主控端 Win32 GUI(Win7+) ├── rcontrol_client_core/ # 纯 std 连接核心(多平台复用) ├── rcontrol_client_gui/ # egui 跨平台主控端(Win/Linux/macOS) ├── rcontrol_android/ # Android JNI 包装(cdylib) ├── rcontrol_relay/ # 中继端(转发 + DDNS + UPnP) ├── android/ # Gradle 工程(Kotlin 程序化 UI) ├── shots/ # 构建/测试/截图验证脚本(PowerShell) └── README.md / LICENSE ``` ## 版本 - **v1.0**(2026-09):首个开源版本。中继版功能在直连版 v1.0 基础上开发完成并通过 真实三机部署验证(含跨网络家宽 + Win7 场景) - 版本分支独立维护:`v1.0` 分支冻结本期内容,`main` 跟随最新版本 ## 声明 本项目仅供**合法授权**的远程管理与技术学习使用——请仅在你拥有或已获得明确授权的 设备上部署使用,遵守当地法律法规。使用者须自行承担不当使用的责任。 ## 许可证 [MIT](LICENSE)