适用于工程师的向日葵替代工具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月