简要介绍

核心诉求:想通过主控端控制多台可以访问互联网的被控端,被控端挂载家庭宽带的路由器上,是内网地址,无法通过ip直连的方式来连接,前一篇帖子的软件就满足不了需求了。使用向日葵等类似的软件,首先面临的就是安全风险问题,相当于把自己的所有东西都交给了向日葵等远控软件公司。其次是即使用向日葵这类软控软件,它们免费版对被控端数量、被控端分辨率、网速都有限制,要交费才行,体验很差。故在上一稿直连版的基础上,让智能体继续干活,做出我想要的中继版,参考向日葵、rustdesk等知名远控软件,把其中一台机器用来做中继,其它所有终端都注册到中继上,当想控制某台机器时,通过中继来转发。

做中继的机器原则上要有固定公网ip地址才行,这里采用的是ddns跟踪动态公网ip地址来实现,在这台机器所挂的光猫上做个虚拟主机端口映射,定期自动上报ddns信息,域名我用的是阿里云,在访问控制里添加用户和配置权限,这儿不给详细操作步骤了,后面文档里有。

开发过程:依然是claude code+glm-5.3这个组合,完美实现了自己的想法。

开源地址:

https://github.com/QinKunming/RControlRelay

https://gitee.com/qinkunming/RControlRelay

操作界面:

中继端,运行rcontrol_relay.exe,会自动注册ddns,更新域名指向的IP地址。

被控端,相比直连版稍微复杂一点,除了设置端口、访问密码之外,还要配置中继信息,保存配置,然后启动服务即可。

主控端,输入目标机器的ip地址、端口、访问密码,即可连接,支持多被控端清单管理,只要控制一次后,保持被控端登录状态,下次都不用输入密码啥的,当要管理多台机器时比向日葵的体验好太多了。

连接被控端后,按F9开启文件传输页面。


说明文档

RControlRelay

RControl 中继版远程控制软件 —— 在直连版 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_guiegui 跨平台主控端(Win/Linux/macOS 同一套代码)
rcontrol_androidclient_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

[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 <crate> --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

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐