rustdesk自建服务
# 使用 Docker 自建 RustDesk 远程桌面服务
本文档旨在帮助您使用 Docker 快速部署自己的 RustDesk 开源远程桌面服务。RustDesk 是一款优秀的开源远程桌面软件,可作为 TeamViewer 和 AnyDesk 的替代品。通过自建服务器,您可以拥有一个完全独立、安全且不受限制的远程连接环境。
# 一、 RustDesk 功能特性
RustDesk 作为一个功能齐全的远程桌面解决方案,具备以下核心特性:
- 跨平台支持: 客户端支持 Windows, macOS, Linux, iOS, Android 以及 Web 端,覆盖了绝大多数使用场景。
- 数据安全: 所有通信流量都经过端到端的加密,确保您的数据在传输过程中的安全。自建服务意味着数据完全由您自己掌控。
- 高性能: 底层采用 Rust 语言编写,保证了其运行效率和稳定性,提供低延迟的远程桌面体验。
- 文件传输: 在远程会话中可以方便地与远程计算机互传文件。
- 内置 TCP 隧道: 可以轻松设置 TCP 隧道,用于内网穿透等高级功能。
- 完全开源: 无论是客户端还是服务器端都是开源的,您可以自由审查、修改和部署。
- 自定义: 您可以自定义客户端的界面,包括 Logo、名称等,打造属于您自己或公司的品牌。
# 二、核心组件与参数解析
RustDesk 服务器主要由两个核心服务组成:hbbs 和 hbbr。
hbbs- ID/注册服务器 (ID/Rendezvous Server)- 功能: 这是 RustDesk 的入口服务。它负责处理客户端的 ID 注册、心跳维持和连接协商。当您在客户端输入对方的 ID 时,
hbbs会帮助两个客户端找到彼此并尝试建立直接连接(P2P)。 - 默认端口:
21115(TCP, 用于NAT类型测试),21116(TCP/UDP, 用于ID注册和心跳服务),21118(TCP, 用于Web客户端支持)。
- 功能: 这是 RustDesk 的入口服务。它负责处理客户端的 ID 注册、心跳维持和连接协商。当您在客户端输入对方的 ID 时,
hbbr- 中继服务器 (Relay Server)- 功能: 当两个客户端因为网络限制(如处于复杂的 NAT 网络后)而无法建立直接的 P2P 连接时,
hbbr会作为中继,转发它们之间的所有通信流量。 - 默认端口:
21117(TCP, 用于中继服务),21119(TCP, 用于Web客户端支持)。
- 功能: 当两个客户端因为网络限制(如处于复杂的 NAT 网络后)而无法建立直接的 P2P 连接时,
# 三、Docker 安装与使用步骤
请按照以下步骤操作。由于您在 Windows 环境下操作,我们将省略 sudo 并调整网络参数。
# 前提条件
- 已安装 Docker Desktop for Windows。
- 确保您的防火墙或云服务商的安全组策略已放行以下端口:
- TCP:
21115,21116,21117,21118,21119 - UDP:
21116
- TCP:
# 第一步:拉取 RustDesk 服务器镜像
打开 PowerShell 或 CMD,执行以下命令来从 Docker Hub 拉取最新的官方镜像。
docker image pull rustdesk/rustdesk-server
# 第二步:创建数据目录并运行 hbbs (ID 服务器)
首先,在您喜欢的位置创建一个用于存放数据的文件夹,例如 /root/rustdesk。
mkdir /root/rustdesk
cd /root/rustdesk
2
然后,运行 hbbs 容器。注意,我们移除了 --net=host 并使用 -p 参数来手动映射端口。
-td: 这是-t和-d的组合。-d(detached) 表示在后台运行容器(守护式运行),-t(tty) 为容器分配一个伪终端。组合使用可以确保容器在后台稳定运行。--net=host: 这个选项让容器直接共享宿主机的网络命名空间。容器将不会拥有自己独立的IP地址,而是直接使用宿主机的IP地址和端口。这样做的好处是性能更好,并且无需手动进行端口映射(-p参数)。注意:此选项在 Windows 和 macOS 的 Docker Desktop 上不生效,主要用于 Linux 环境。在 Windows 上部署时应移除此参数,并改用-p参数手动映射端口。
docker run --name hbbs -v /root/rustdesk:/root -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -td --restart unless-stopped rustdesk/rustdesk-server hbbs -r [你的域名或公网IP]
# 第三步:运行 hbbr (中继服务器)
接着运行 hbbr 容器。它会使用与 hbbs 相同的持久化数据目录。
docker run --name hbbr -v /root/rustdesk:/root -p 21117:21117 -p 21119:21119 -td --restart unless-stopped rustdesk/rustdesk-server hbbr
# 第四步:验证安装
执行 docker ps 命令,您应该能看到 hbbs 和 hbbr 两个容器都处于 Up 状态。
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
... rustdesk/rustdesk-server "hbbr" ... Up ... 0.0.0.0:21117->21117/tcp, 0.0.0.0:21119->21119/tcp hbbr
... rustdesk/rustdesk-server "hbbs" ... Up ... 0.0.0.0:21115->21115/tcp, 0.0.0.0:21116->21116/tcp, 0.0.0.0:21118->21118/tcp hbbs
2
3
4
同时,检查 /root/rustdesk 目录,您会发现 Docker 自动生成了一些配置文件,特别是以 id_ed25519 命名的公钥(.pub)和私钥文件。请务必妥善保管这些文件,尤其是私钥!
# 四、使用 Docker Compose 安装 (推荐方式)
如果您希望管理更加方便,可以使用 docker-compose.yml 文件。在您的数据目录下创建该文件:
version: '3'
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r xxxxxx.com -k _
volumes:
- ./data:/root
network_mode: "host" # Linux 推荐使用 host 模式
# 如果是 Windows/macOS,请注释掉 network_mode 并取消下面 ports 的注释
# ports:
# - 21115:21115
# - 21116:21116
# - 21116:21116/udp
# - 21118:21118
restart: unless-stopped
depends_on:
- hbbr
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr -k _
volumes:
- ./data:/root
network_mode: "host"
# ports:
# - 21117:21117
# - 21119:21119
restart: unless-stopped
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
参数说明:
-k _: 这个参数非常重要。它强制要求客户端必须配置正确的 Key 才能连接。这能有效防止未经授权的用户占用您的服务器带宽。
启动命令:
docker-compose up -d
# 五、客户端配置
客户端下载地址:
蓝奏云 (opens new window) 密码:6v3z
现在您的服务器已经运行起来了。打开 RustDesk 客户端,进行如下配置:
点击您ID右侧的三个点
...菜单。选择 "ID/中继服务器"。
在 "ID 服务器" 输入框中,填入您服务器的公网 IP 地址或域名(例如
your-server-ip)。将 "中继服务器" 和 "API 服务器" 留空,客户端会自动推断。
在 "Key" 输入框中,填入您服务器上
/root/rustdesk\id_ed25519.pub文件中的公钥内容。点击 "确定" 保存。

配置完成后,客户端标题栏的下方会显示 "就绪" 以及一个绿色的圆点,表示已成功连接到您自己的服务器。现在您可以开始享受安全、独立的远程桌面服务了。
# 五、一些功能上的问题
# 1. 如何使用内网穿透(TCP隧道)功能?
RustDesk 本身的设计初衷就是为了实现内网穿透。只要您的 hbbs 和 hbbr 服务器部署在拥有公网 IP 的服务器上(或通过路由器做了端口映射),处于任何内网环境下的客户端都可以通过该服务器建立连接。
步骤:
- 在远程控制窗口的菜单中,您可以找到 "TCP 隧道"。
- 这允许您将远程机器上的某个端口(如 3389 RDP 端口或 80 网页端口)映射到本地机器的端口上,实现类似 SSH Tunnel 的功能。
TCP 隧道允许您将远程计算机上的某个端口映射到您本地的端口,从而安全地访问远程内网的服务(如 SSH、RDP、数据库、Web 服务等)。
使用场景举例:
假设您有一台位于办公室的电脑 A(受控端),它所在的内网中还有一台只对内网开放的 GitLab 服务器(地址为 192.168.1.100:80)。您希望在家里的电脑 B(控制端)上直接访问这个 GitLab。
操作步骤:
- 建立远程连接: 从电脑 B 远程控制电脑 A。
- 设置隧道: 在远程控制窗口的顶部菜单栏,找到并点击 "TCP 隧道"。
- 添加隧道规则:
- 本地端口: 填入您希望在本地(电脑 B)监听的端口,例如
8080。 - 远程 IP: 填入目标服务在远程内网中的 IP,即
192.168.1.100。 - 远程端口: 填入目标服务在远程内网中的端口,即
80。 - 点击 "添加"。
- 本地端口: 填入您希望在本地(电脑 B)监听的端口,例如
- 访问服务: 现在,在您的本地电脑 B 上打开浏览器,访问
http://localhost:8080,您就会发现自己已经可以访问办公室的 GitLab 页面了。
# 2. 如何确保使用 P2P 而不是中继?
RustDesk 总是会优先尝试 P2P (点对点) 直接连接。只有在 P2P 连接尝试失败后,才会自动切换到 中继 (Relay) 模式。

要提高 P2P 连接的成功率,请确保:
- 放行 UDP 21116 端口: P2P 打洞(NAT Hole Punching)高度依赖 UDP 协议。如果该端口仅开启了 TCP,将无法进行 P2P 连接。
- 网络环境: P2P 的成功率取决于两端网络 NAT 类型(如对称型 NAT 较难打洞)。
- 查看状态: 在连接成功后,点击顶部的状态图标,如果显示 "直接连接"(Direct Connection),则说明当前是 P2P 模式;如果显示 "通过中继服务器连接"(Relay Connection),则说明当前是中继模式。
什么是udp打洞:
它是实现 P2P 直连 的核心技术。
- 原理: 当两个客户端都处于 NAT(路由器)后时,服务器(hbbs)会协助它们交换内网和外网的 IP 及端口信息。然后两个客户端尝试直接向对方发送 UDP 包。如果成功,数据将直接在两个客户端之间传输,不再经过您的服务器。
- 优势: 极低延迟,不消耗服务器带宽。
- 建议: 在客户端设置中勾选 "启用 UDP 打洞",并确保服务器的 UDP 21116 端口已放行。
# 3. 可以传输文件吗?
可以。 RustDesk 提供了两种文件传输方式:
- 专门的文件传输模式: 在发起连接前,可以选择 "文件传输" 而不是 "远程控制"。这会打开一个类似 FTP 客户端的左右双栏界面,方便批量管理文件。
- 远程控制中传输: 在远程控制窗口中,您可以直接通过顶部菜单的 "传输文件" 功能进行操作,或者简单的通过剪贴板复制粘贴文件(取决于客户端支持情况)。
# 4. 什么是 "允许 IP 直接访问"?
这个功能允许客户端 绕过 ID 服务器 直接通过 IP 地址进行连接。
- 使用场景:
- 局域网内连接: 两台电脑在同一个路由器下,直接通过局域网 IP (如 192.168.1.x) 连接,速度极快。
- 固定公网 IP: 如果受控端有固定公网 IP 且映射了端口(默认 21118),您可以直接输入该 IP 连接。
- 设置方法: 勾选 "允许 IP 直接访问",然后在连接端输入
IP:端口。
# 5. RustDesk API 服务简介与推荐
在基础的 RustDesk 部署中,hbbs 和 hbbr 只负责连接通讯,无法实现地址簿同步、用户登录、设备备注、在线状态等功能。为此,你可以部署 API 服务,为 RustDesk 提供账户管理、地址簿同步、设备标签、在线状态显示和安全策略等能力,相当于为远程桌面加上“大脑”和“数据库”。
目前主流的 API 服务有:
- rustdesk-api (opens new window) (推荐):Go 语言开发,轻量高效,支持地址簿、在线状态、用户管理、设备备注和 Web 管理后台。
- rustdesk-api-server (opens new window):Python 开发,功能全面,支持完整 API 和 Web 管理界面,便于多用户和设备管理。
官方 API 服务(Pro版)为付费,以上开源方案均支持 Docker 一键部署。
客户端配置 API 服务方法:
- 部署好 API 服务(如
http://your-server-ip:8080)。 - 打开 RustDesk 客户端,进入 设置 -> 网络 -> ID/中继服务器。
- 在 API 服务器 一栏填入你的 API 服务地址(如
http://your-server-ip:8080)。 - 回到主界面,点击左侧“未登录”,用 API 服务后台账号登录。
- 登录后,远程设备列表、备注等信息将自动同步,无需担心丢失。