适用于工程师的向日葵替代工具RustDesk远程桌面搭建

但是实际情况是向日葵免费版因为存在带宽限速问题,远程连接经常卡顿,而我们常用Teamviewer,anydesk等远程工具的授权又很贵。Todesk海外版本也存在向日葵同样问题。
其实很久前有一款开源的软件叫RustDesk,但为什么现在才开始火起来呢?首先Rustdesk早期版本不是很稳定,而且中继网关没有完全开源。现在Rustdesk终于全部开源了。现在我们可以通过自己建立中继站,完全享受独占的带宽资源。
我们先来了解下这个软件。
一 原理讲解:
RustDesk 采用客户端 - 服务器混合模型,通过 P2P 直连优先、中继兜底的策略实现设备互联:与TeamViewer类似
1. ID 服务器(hbbs):
o 维护设备在线状态和网络信息(IP、端口),支持 UDP 打洞和 NAT 穿透。
o 设备启动后通过 21116 UDP 发送心跳,更新自身网络地址,并通过 ICE 协议尝试建立 P2P 连接。
o 支持多 ID 服务器配置通过 DNS 轮询实现负载均衡。
2. 中继服务器(hbbr):
o 当 P2P 失败时,通过 21117 TCP 转发数据,支持 BBR 拥塞控制算法降低延迟。
o 企业级部署可配置多台中继服务器,通过地理位置优化提升传输效率。
3. 连接流程:
o UDP 打洞:客户端 A 和 B 向 hbbs 交换网络信息后,通过 UDP 尝试直接通信。若成功,双方通过 零拷贝技术直接传输屏幕数据。
o 中继回退:若打洞失败,客户端分别与 hbbr 建立加密通道,数据通过中继服务器中转,平均带宽消耗约 180 KB / 秒。
二 输入事件处理
RustDesk 通过分层协议和状态同步实现跨平台输入一致性:
1. 输入重定向架构:
-
二进制协议封装:鼠标、键盘事件通过高效二进制格式传输,与视频流严格同步。
-
三重模式适配:
-
Map 模式:直接映射扫描码,适合专业键盘布局。
-
Translate 模式:字符级翻译(如 Windows 到 macOS 的 Command 键转换),确保语义一致。
-
Legacy 模式:兼容特殊键和组合键(如 Ctrl+Alt+Del)。
2. 状态同步机制:
-
修饰键跟踪:实时同步 CapsLock、NumLock 等状态,避免输入混乱。
-
延迟补偿:通过 RTT(往返时间)计算动态调整输入响应,确保操作与画面一致。
三 服务端搭建
Server 项目核心是两个二进制程序:hbbs(信号服务器) 和 hbbr(中继服务器)。
RustDesk Server/Client核心模块调用关系图
1. 核心作用
· hbbs:负责用户身份验证、设备注册、Peer 节点发现和 NAT 穿透协商,不转发实际桌面流量。
· hbbr:仅在 P2P 穿透失败时启动,作为中继转发桌面流和控制指令,保证连接可用性。
2. 技术架构
· 异步运行时:采用 tokio,高效处理大量并发连接。
· 网络通信:基于 tokio-util、bytes 等库封装自定义协议,支持 TCP/UDP 双模式。
3. 关键流程
· Client 启动后先连接 hbbs,上报自身 IP、端口和设备信息。
· 控制端向 hbbs 请求目标设备信息,hbbs 转发双方网络参数,触发 P2P 穿透尝试。
· 穿透失败时,hbbs 分配 hbbr 中继节点,双方通过 hbbr 建立间接连接。
四 配置说明(此处以linux为例):
1、防火墙开放端口:
表. 端口说明
2、RustDeskServer.toml配置文件
# hbbs 核心配置 [hbbs] # 监听地址(默认0.0.0.0,即所有网卡) listen_addr = "0.0.0.0" # 核心端口(默认21115,对应TCP 21115) port = 21115 # P2P协商端口(TCP+UDP,默认21116) nat_port = 21116 # 备用端口(默认21117,可选) alt_port = 21117 # 中继服务器地址(hbbr的IP/域名,客户端通过hbbs获取此地址) # 若hbbs和hbbr在同一机器,可填127.0.0.1;若分开部署,填hbbr的公网地址 relay_server = "127.0.0.1:21118" # 加密密钥(重要!默认使用内置密钥,生产环境必须自定义) # 生成方式:执行 ./hbbs --genkey 生成随机密钥,替换下方字符串 key = "your_custom_secret_key_here" # 日志配置 [log] # 日志级别:trace/debug/info/warn/error(默认info) level = "info" # 日志文件路径(默认stdout,即控制台输出) file = "/var/log/rustdesk/hbbs.log" # 其他可选配置 [options] # 允许的最大在线设备数(默认不限) max_peers = 1000 # NAT类型检测超时时间(秒,默认10) nat_timeout = 10
3、启动代码:
启动hbbs(后台运行,Linux可加 &) ./hbbs --config /path/to/RustDeskServer.toml & 启动hbbr ./hbbr --config /path/to/RustDeskServer.toml &
4、 启动验证
netstat -tulpn | grep hbbs # 应显示21115、21116(TCP/UDP)
5、 客户端介绍:
客户端的代码解构图
核心工作流程
(1)初始化:启动后加载配置,连接指定的 hbbs 服务器。
(2)设备发现:通过 hbbs 搜索在线设备,或输入目标设备 ID/IP 发起连接。
(3)连接建立:优先尝试 P2P 穿透,失败则自动切换到 hbbr 中继。
(4)数据传输:建立加密通道后,实时传输屏幕帧数据和输入指令,同步设备剪贴板。
根据Rustdesk server配置的
添入ID server的地址和端口号,中继服务器的地址和端口号
Ip地址+端口号 例如格式: 192.168.1.1:26117
也支持域名 domain.Test.com:26117
Key为连接server端的密码。
权限配置,基本默认就可以了。
这个界面大家都很熟悉吧,反正就是输入远程的号码,然后密码就能远程访问了。
编译客户端这一块的话,下一篇再展开讲讲。
我们为什么要学会编译客户端,首先,我们不方便把key和token直接告诉客户,我们可以通过编译直接把这个写入到客户端中,让客户拿到直接打开就能用。
2025年12月


