RustDesk部署小记

1. 什么是RustDesk

RustDesk 是一款开源的远程桌面控制软件,允许用户通过互联网或局域网远程访问和控制其他计算机。它类似于 TeamViewer、AnyDesk 、ToDesk、向日葵等商业远程桌面工具,但 RustDesk 强调隐私、安全自托管能力,适合个人和企业使用。

主要特点

  1. 跨平台支持:支持 Windows、macOS、Linux、Android、iOS 等主流操作系统。甚至可以在树莓派等嵌入式设备上运行。
  2. 开源与隐私保护:代码完全开源(基于 MIT 和 Apache 双协议),用户可以审查代码,确保无后门或数据泄露风险。默认使用端到端加密(基于 NaCl 加密库),保护远程连接的安全。
  3. 自托管选项:用户可以搭建自己的中继服务器(替代官方服务器),避免依赖第三方服务,适合企业内网或对隐私要求高的场景。
  4. 轻量高效:客户端体积小,资源占用低,连接延迟低,支持 60fps 的高帧率远程控制。
  5. 功能丰富:文件传输、剪贴板同步、远程终端、多显示器支持、会话录制等。支持无人值守访问(通过设置固定密码)。
  6. 多编解码器支持:支持 VP8 / VP9 / AV1 软件编解码器和 H264 / H265 硬件编解码器。

官方网站:RustDesk官网

项目地址:RustDesk开源项目地址

2. RustDesk 架构

RustDesk 采用 C/S(客户端-服务器)P2P(点对点)混合架构,具体分为以下模块:

组件 作用
客户端(Client) 运行在你的设备上(Windows,macOS,Linux,Android, iPhone)用于连接两个设备的软件,它负责监听来自客户端的连接请求,并在建立连接后向客户端发送屏幕更新和接收输入事件。
中继服务器(Relay Server) 运行在服务器上,充当客户端之间的桥梁,转发来自一方的数据包到另一方。在某些环境中(如经过 NAT 出网)设备之间无法进行 P2P 连接,可以用服务器来中转
信令服务器(ID Server) 管理客户端在线状态、ID 解析(类似“电话簿”)。用于维护客户端及中继服务器的连接信息,促进设备之间建立 P2P 连接。
P2P 直连 在 NAT 穿透成功时,客户端直接通信,避免服务器中转,降低延迟。
+-------------------+       +-------------------+       +-------------------+
|   Client A        |<----->|   Relay Server    |<----->|   Client B        |
| (被控端)          |       | (中继转发)        |       | (控制端)          |
+-------------------+       +-------------------+       +-------------------+
        ↑                           ↑                           ↑
        | P2P 直连 (优先尝试)        | 信令交互                   | P2P 直连 (优先尝试)
        |                           |                           |
+-------------------+       +-------------------+       +-------------------+
|   ID Server       |       |  自托管服务器     |       |   NAT 穿透        |
| (在线状态管理)    |       | (可选私有化部署)  |       | (UPnP/STUN/TURN)  |
+-------------------+       +-------------------+       +-------------------+

在 RustDesk 的自托管架构中,hbbshbbr 是两个核心服务器组件,分别承担不同的角色。

2.1 hbbs(ID 服务器)

  • 身份与状态管理:维护所有客户端的在线状态(类似“电话簿”),负责解析客户端 ID 到 IP/端口的映射。同时生成和分配唯一的 设备 ID
  • NAT 穿透协调:协助客户端之间建立 P2P 直连(通过 STUN 协议交换公网信息)。
  • 访问控制:支持配置白名单/黑名单,限制非法设备连接(需在启动参数或配置文件中设置)。

简单来说就是:hbbs 是RustDesk的中介服务器(Broker Server),用于管理和协调客户端连接。它帮助客户端找到并建立P2P连接。hbbs 负责维护客户端的在线状态,并处理连接请求。当客户端A希望连接客户端B时,它会向hbbs发送请求,hbbs会帮助它们建立连接。

[!tip]

hbbss仅处理信令(不转发实际数据),所以资源占用极低。

2.2 hbbr(中继服务器)

  • 数据中继转发:当客户端无法直接 P2P 连接时(如复杂的 NAT 环境),负责转发音视频、文件传输等流量。
  • 流量加密中转:即使中继流量,数据仍保持端到端加密(hbbr 无法解密内容)。
  • 带宽管理:支持限制单个会话的带宽(通过启动参数配置)。

简单来说就是:RustDesk 中继服务器,如果P2P无法连接,会使用hbbr进行流量中继。hbbr 是RustDesk的中继服务器(Relay Server),用于在两台客户端之间进行连接中继。它允许无法直接建立P2P连接的客户端通过中继服务器进行通信。当客户端A和客户端B之间无法建立直接连接时,它们会通过hbbr中继服务器进行数据传输。

[!tip]

关键特性

  • 高性能转发:基于 Rust 的异步 I/O(tokio),支持高并发连接。
  • 无状态设计:不存储客户端数据,仅做实时转发。

P2P直连说明:

  • RustDesk 首先尝试建立直接 P2P 连接,如果 P2P 失败,将使用中继服务器。
  • 确认连接方式,首先连接到远程主机,可以将鼠标移动到工具栏图标(绿色图标),将显示它是直接连接还是通过中继服务器连接。

使用端口说明:

序号 服务 端口 协议 用途 是否可选
1 hbbs 21114 TCP 用于 Web 控制台API,仅在专业版中可用 可选
2 hbbs 21115 TCP NAT类型测试 必选
3 hbbs 21116 TCP/UDP UDP用于ID注册和心跳服务,TCP用于TCP打洞和连接服务 必选
4 hbbr 21117 TCP 用于Relay服务 必选
5 hbbs 21118 TCP 用于支持Web客户端 可选
6 hbbr 21119 TCP 用于支持Web客户端 可选

3. 部署rustdesk-server

参考文档:GitHub中rustdesk-server文档

4. 为什么现在推荐部署 RustDesk

当前是部署 RustDesk 自建中继服务器的绝佳时机,尤其是因为国内多家公有云厂商近期推出了轻量高带宽服务器。这些服务器以低成本、高性能和充足带宽著称,非常适合运行 RustDesk 的中继和信号服务器。以下是具体理由:

  • 成本效益高:轻量服务器通常提供 1 核 CPU、1 GB 内存起步的配置,已足以满足 RustDesk 服务器的最低硬件需求,且价格亲民,年费甚至可能低至 30(如某些活动价格),大大降低了自建服务器的门槛。
  • 高带宽支持:RustDesk 的中继服务器在处理多用户连接和数据传输时对带宽要求较高,而国内轻量高带宽服务器提供的 200M 无限带宽和 BGP 接入,足以支持稳定、低延迟的远程连接,特别适合远程办公或团队协作场景。
  • 快速部署与扩展:这些服务器通常支持 Docker 一键部署,结合 RustDesk 的开源特性,你可以快速搭建并根据需求灵活扩展,无论是个人使用还是企业级应用都游刃有余。
  • 本地化优势:依托国内云服务商的服务器,连接速度更快,延迟更低,特别适合在中国大陆地区使用,规避了国际链路可能带来的不稳定性和速度瓶颈。

需要注意的是,近期有不法分子利用 RustDesk 进行诈骗活动。如果有人通过电话要求你安装 RustDesk,尤其是你不认识或不信任的人,请立即挂断电话并拒绝安装,以保护你的隐私和财产安全。

注意不法分子

5. 部署RustDesk

我这里直接演示docker-compose的方式进行部署。

networks:
  dozzle_default:
    external: false
 
services:
  hbbs: # RustDesk ID/Rendezvous 服务器
    container_name: hbbs
    ports:
      - 21115:21115 # 用于 NAT 类型测试的 TCP
      - 21116:21116 # TCP打孔
      - 21116:21116/udp # UDP心跳/ID服务器
      - 21118:21118 # 如果要运行web客户端,则使用TCP进行web套接字
    image: rustdesk/rustdesk-server:latest
    command: hbbs
    volumes:
      - /www/dk_project/dk_app/RustDesk/hbbs:/root
    environment:
      - 'RELAY=example.com' # 运行这些容器的服务器的【IP:port】或域名
      - 'ENCRYPTED_ONLY=1' # 开启加密,开启之后,双方都需要输入key才可建立连接
      #- 'KEY=自定义key' # 自定义KEY,去掉这一行可以自动生成
    networks:
      - dozzle_default
    depends_on:
      - hbbr
    restart: unless-stopped
 
  hbbr: # RustDesk 中继服务器
    container_name: hbbr
    ports:
      - 21117:21117 # TCP中继
      - 21119:21119 # 如果要运行web客户端,则使用TCP进行web套接字
    image: rustdesk/rustdesk-server:latest
    command: hbbr
    volumes:
      - /www/dk_project/dk_app/RustDesk/hbbr:/root
    networks:
      - dozzle_default
    restart: unless-stopped

[!warning]

这里的自定义key好像非pro用户设置了,会导致客户端出现非加密连接的情况。这个我文档还没有仔细看,后续可能会优化,所以这里我先用它自动生成的吧。

之后执行命令运行即可:

sudo docker-compose up -d

[!important]

这里服务器需要放行的端口为:TCP的21115~21119端口;UDP的21116端口。

如果你是公有云,比如阿里云、腾讯云等云服务商的服务器,还需要再对应的服务器控制台模块放行对应的端口。

6. 连接验证

服务端搭建好后,在要连接的两个客户端设备上都下载 RustDesk 客户端。

下载地址是:RustDesk客户端下载地址

设置界面入口

设置网络中的ID/中继服务器设置

ID/中继服务器/Key的设置

这里的注意一下:

  • ID服务器:我这里只写了域名,这是因为我的docker-compose文件中的RELAY环境变量设置的。并且默认端口为21116时可以省略端口配置。
  • 中继服务器:我这里只写了域名,这是因为我的docker-compose文件中的RELAY环境变量设置的。并且默认端口为21117时可以省略端口配置。
  • Key:这里的key的内容位于hbbs容器中volumes配置卷里面的 id_ed25519.pub 文件中的内容,由于我的hbbs容器中volumes配置卷目录为:/www/dk_project/dk_app/RustDesk/hbbs,所以,key的内容就是/www/dk_project/dk_app/RustDesk/hbbs/id_ed25519.pub文件中的内容。
  • 所有客户端必须都完成相应配置,才可以进行远程连接。

之后回到主页,输入对方ID就可以连接对方了:

加密中继连接

显示通过加密中继连接,说明两台机器位于不同网络,无法通过P2P直连,要经过自己的rustdesk-server中继连接。