用 Docker 自建 RustDesk 服务端:从内网到公网的完整实战
这篇是写给未来自己的 RustDesk 服务端部署备忘录:一次搞清楚 hbbs / hbbr 是什么、需要开哪些端口、怎么配 Docker、怎么配客户端,以后无论是给自己还是给公司搭内网远程桌面,都能 “照着步骤抄一遍” 秒起服务。
一、RustDesk 与自建服务端的关系
RustDesk 是一款开源的远程桌面软件,被很多人叫作 “开源版 TeamViewer / AnyDesk”。
它有两个重要组成部分:
- 客户端:安装在被控端(Server)和控制端(Client)机器上,负责画面采集、控制等;
- 服务端:包括两个核心组件:
hbbs:RustDesk 信令 / 中继服务器(ID 注册、信令、NAT 协调等);hbbr:RustDesk 中继服务(在点对点穿透失败时做流量中继)。
默认情况下,你可以直接使用官方公共服务端,但这样会有几个顾虑:
- 数据与连接经过第三方,隐私 / 合规压力更大;
- 公共中继服务器延迟、带宽都难以保证,体验不稳定;
- 无法完全控制接入策略、日志、限流等。
因此,自建 RustDesk 服务端 是很多团队和个人的首选:
- 所有连接流量在自己服务器上;
- 可以按需做防火墙、IP 限制、审计;
- 自己控制服务器位置,降低延迟。
本文将用 Docker 一步步搭建:
- 认识
hbbs和hbbr需要的端口和角色; - 用
docker run跑起服务端,完成最小可用部署; - 用
docker-compose标准化部署(方便一键启动/停止); - 配置域名和 TLS 证书,让客户端信任;
- 讲清楚常见网络场景(公有云 / 家宽 / NAT)下的端口需求;
- 完整演示如何在 RustDesk 客户端中填写自建服务端地址;
- 列出部署过程中高频踩坑与排查方式。
二、RustDesk 服务端组件与端口规划
RustDesk 服务端最重要的概念就是两个进程:hbbs 和 hbbr。
1. hbbs(信令服务器)
主要职责:
- 管理客户端 ID 注册;
- 处理连接建立前的握手、信令交换(谁要连谁);
- 协调 NAT 穿透。
默认端口(以 RustDesk 官方文档为基准,实际端口可能有细微变更,部署前建议对照命令行帮助或 README):
- 21114/TCP:TCP 信令端口;
- 21115/TCP/UDP:NAT 打洞 / 信令端口;
- 21116/TCP/UDP:辅助信令 / 打洞端口;
- 21118/TCP:Web 控制台 / API(部分版本)。
你可以把 hbbs 想象成:所有客户端联系你服务端的第一个门。
2. hbbr(中继服务器)
职责:
- 当两个客户端之间无法点对点直连(NAT 太复杂、防火墙阻断)时,提供中转流量的通道;
- 进行加密流量转发。
典型端口:
- 21117/TCP/UDP:中继端口。
在家庭宽带 / 异地办公等复杂网络场景中,hbbr 几乎必不可少。
3. 总体端口表(默认值)
整理一下默认常用端口(具体以你实际版本 / 配置为准):
hbbs:- 21114/TCP
- 21115/TCP+UDP
- 21116/TCP+UDP
- (可选)21118/TCP 用于 Web 管理等
hbbr:- 21117/TCP+UDP
推荐习惯:
- 公网服务器上,在安全组和防火墙中明确放开这些端口;
- 哪些只让内网访问、哪些允许公网访问,你可以按需求控制。
三、准备 Docker 环境与目录结构
本文继续沿用前几篇的惯例:
- 默认你已经安装好 Docker(或 Docker Desktop),
docker version能正常输出; - 我们会在宿主机上准备一个专门目录放 RustDesk 数据。
1. 创建数据目录
假设在 Linux / macOS 上:
mkdir -p ~/docker-data/rustdeskcd ~/docker-data/rustdeskWindows(PowerShell)类似:
mkdir C:\docker-data\rustdeskcd C:\docker-data\rustdeskRustDesk 官方服务端镜像一般会在容器内使用某个目录来存放配置和密钥,例如 /root/.config/rustdesk(以实际镜像为准)。
我们会通过挂载卷的方式保证这些配置和密钥能够持久化。
四、获取 RustDesk 服务端 Docker 镜像
RustDesk 社区常用的镜像命名类似(实际以官方发布为准,比如 rustdesk/rustdesk-server 或 rustdesk/rustdesk-server-s6 等):
docker pull rustdesk/rustdesk-server:latest拉取完成后,确认镜像:
docker images | grep rustdesk如果你更在意稳定性,可以换成具体版本号,例如:
docker pull rustdesk/rustdesk-server:1.1.0总之,生产环境建议固定镜像版本,而不是直接用 latest。
五、最小可用:用 docker run 快速起一套服务端
在正式写 compose 之前,我们先用命令行跑一个最小版本,验证:
- 服务端能起来;
- 端口能访问;
- 客户端能连上。
1. 运行 RustDesk 服务端容器
假设镜像名为 rustdesk/rustdesk-server,运行命令示例:
docker run -d \ --name rustdesk-server \ -p 21114:21114 \ -p 21115:21115 \ -p 21115:21115/udp \ -p 21116:21116 \ -p 21116:21116/udp \ -p 21117:21117 \ -p 21117:21117/udp \ -v ~/docker-data/rustdesk:/root/.config/rustdesk \ rustdesk/rustdesk-server:latest参数说明:
--name rustdesk-server:容器命名,方便后续管理;-p:端口映射,把容器内的端口暴露到宿主机;-v ~/docker-data/rustdesk:/root/.config/rustdesk:- 将宿主机的
~/docker-data/rustdesk映射到容器内配置目录,实现配置和密钥持久化;
- 将宿主机的
- 镜像:
rustdesk/rustdesk-server:latest。
启动后检查容器:
docker psdocker logs rustdesk-server如果日志中提示 hbbs / hbbr 正常启动,并监听对应端口,就说明服务端基础部分已经就绪。
2. 初次生成密钥对(如适用)
某些版本的 RustDesk 服务端镜像在首次启动时,会自动生成一对公私钥,用于客户端校验。
这些密钥会保存在 /root/.config/rustdesk 中,因此我们已经通过卷挂载保证了它们可持久化。
你可以进容器查看(了解即可):
docker exec -it rustdesk-server bashls -l /root/.config/rustdesk命令行一般会看到类似 id_ed25519、id_ed25519.pub 等文件。
提醒:这些私钥属于你的自建服务端,不要随便对外泄露。
六、用 docker-compose 管理 RustDesk 服务端
命令行跑通之后,我们将配置整理成 docker-compose.yml,方便以后用一条命令启动/停止。
在 ~/docker-data/rustdesk 目录下创建 docker-compose.yml:
version: "3.9"
services: rustdesk-server: image: rustdesk/rustdesk-server:latest container_name: rustdesk-server restart: always ports: - "21114:21114" - "21115:21115" - "21115:21115/udp" - "21116:21116" - "21116:21116/udp" - "21117:21117" - "21117:21117/udp" # 如果镜像支持 Web 控制台,可按需暴露,如: # - "21118:21118" volumes: - ./config:/root/.config/rustdesk environment: # 部分镜像可能支持通过环境变量指定公网 IP/域名等,可按实际说明补充 TZ: Asia/Shanghai说明:
- 把配置目录映射到了相对路径
./config,更方便备份和迁移; restart: always保证宿主机重启后服务能自动拉起;- 端口部分完整映射 TCP + UDP。
在 docker-compose.yml 所在目录执行:
docker compose up -d检查容器:
docker compose psdocker compose logs -f如果启动正常,说明你已经有了一套可用于客户端连接的 RustDesk 服务端。
1. 防火墙与安全组
如果你的服务器在公有云(阿里云 / 腾讯云 / AWS 等),记得:
- 在 安全组 中放行 21114–21117 对外访问;
- 如果有系统级防火墙(如
ufw/firewalld),也要放开对应端口。
示例(Ubuntu + ufw):
sudo ufw allow 21114:21117/tcpsudo ufw allow 21115:21116/udpsudo ufw allow 21117/udpsudo ufw reload随后你可以用 ss -tulnp 或 netstat -tulnp 确认端口监听情况。
七、为 RustDesk 服务端配置域名与 TLS(进阶)
默认情况下,客户端可以直接用 IP 连接服务端;
但更推荐的实践是:
- 为服务端配置一个域名,例如
rustdesk.your-domain.com; - 为
hbbs/hbbr提供 TLS 支持(视镜像能力而定),提升安全性; - 并在客户端配置中使用域名而非裸 IP。
1. 域名解析
假设你的服务器公网 IP 是 1.2.3.4,你可以在 DNS 记录中配置:
- 类型:
A - 主机记录:
rustdesk(或者任意你喜欢的前缀) - 值:
1.2.3.4
随后,可以在本机测试解析:
ping rustdesk.your-domain.com能解析到你服务器 IP 即可。
2. 获取 TLS 证书(参考思路)
如需为 hbbs / hbbr 开启 TLS,可以用常见的证书获取工具:
certbot;acme.sh。
大致流程(以 acme.sh 为例,伪代码,仅做思路参考):
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue \ -d rustdesk.your-domain.com \ --standalone
~/.acme.sh/acme.sh --install-cert \ -d rustdesk.your-domain.com \ --key-file /path/to/rustdesk.key \ --fullchain-file /path/to/rustdesk.crt之后,你可以把 /path/to/rustdesk.key 和 /path/to/rustdesk.crt 映射进 Docker 容器,并在 RustDesk 服务端配置中指定证书路径(具体根据镜像支持的参数来写,一般通过环境变量或配置文件实现)。
因为 RustDesk 服务端各版本对 TLS 的支持和配置参数略有差异,实际使用时请对照你拉取镜像的 README 或官方文档进行调整。
八、客户端如何接入自建 RustDesk 服务端
服务器部署完成后,下一步是让各个平台的 RustDesk 客户端走你的自建服务端。
1. 准备客户端
分别在需要远程控制的电脑上安装 RustDesk:
- Windows / macOS / Linux:官网下载对应安装包;
- 如需移动端,可安装 Android / iOS 版本。
安装完成后,打开 RustDesk。
2. 在客户端填写自建服务器信息
不同版本界面略有差异,一般步骤类似:
- 打开 RustDesk 设置页 / 菜单;
- 找到 “网络” / “服务端地址” / “ID 服务器”等相关选项;
- 填写:
- ID/中继服务器地址:
rustdesk.your-domain.com(或你的公网 IP); - 如果能分开设置
ID Server和Relay Server,则都填写为你自建的域名或 IP;
- ID/中继服务器地址:
- 保存设置,重启客户端。
3. 被控端绑定服务端
在被控机器上的 RustDesk,确认:
- 软件中显示的 ID 来自你的自建服务端(不同版本会在 UI 某处露出连接目标);
- 在服务器端日志中(
docker logs rustdesk-server),能看到有设备注册 / 心跳信息。
只要客户端已经指向你的 IP/域名,那么:
- 在控制端输入被控端的 ID;
- 使用事先配置好的密码或安全策略进行连接;
- 实际连线和中继流量就都会走你的自建服务端。
九、典型网络场景与端口策略
RustDesk 的服务端网络部署,核心问题都围绕一个点:
- 客户端能否成功连到你的 hbbs / hbbr 端口。
下面列几个高频场景。
1. 公有云服务器(推荐)
架构:
- 一台具备公网 IP 的云服务器(2 核 4G 起步,根据连接量调整);
- 在上面用 Docker 部署
rustdesk-server; - 云服务商安全组 + 系统防火墙同时放行 21114–21117 端口。
优点:
- 网络可控性强、延迟相对稳定;
- 无需在家庭路由上折腾端口映射;
- 极适合多地远程办公场景。
注意点:
- 根据并发连接量合理选择带宽和配置;
- 对公网暴露端口要做基本安全策略(例如限制管理端口访问、监控异常连接等)。
2. 家庭宽带 + 路由器端口映射
如果你希望:
- 在家里用一台 NAS / 小主机做 RustDesk 服务端,
- 并希望在外网(公司、出差等)也能通过它访问家里的电脑。
则需要:
- 在家庭路由器上做端口转发:
- 把外网的 21114–21117 映射到内网服务端主机;
- 服务端主机防火墙放行对应端口;
- 公网 IP 注意是否为运营商 NAT(大部分家宽是 CGNAT,外网无法直接访问)。
如果你是运营商大内网(没有真正公网 IP),那么:
- 直接在家宽上搭 RustDesk 服务端,对公网访问通常不现实;
- 可以考虑:
- 在云服务器搭 RustDesk 服务端;
- 家里所有设备和外网设备都只连云服务器。
3. 纯内网场景(公司内网)
在公司内部局域网中:
- 可以在某台内网服务器上搭 RustDesk 服务端;
- 所有被控端 / 控制端都在同一内网下;
- 无需对外开放端口,只做内网防火墙规则。
优点:
- 数据完全在内网中流转,安全性更高;
- 延迟极低,非常适合公司内部远程运维 / 支持。
注意点:
- 需要确保所有客户端能访问该服务器的 21114–21117(及你实际使用的端口);
- 如果网络划分了多个 VLAN,需要跨网段路由可达。
十、备份、升级与迁移
RustDesk 服务端的核心状态主要包含:
- 密钥(公私钥);
- 配置文件;
- (如果启用数据库或其他持久化存储,也包括对应目录)。
由于我们已经把这些都挂载到宿主机 ~/docker-data/rustdesk/config 中,所以:
- 迁移:只需要把这个目录打包复制到新机器,拉同版本镜像并挂载即可;
- 升级:改 compose 中镜像版本,
docker compose pull && docker compose up -d; - 备份:定期打包该目录。
示例备份命令:
cd ~/docker-data/rustdesktar czf rustdesk-config-backup-$(date +%Y%m%d).tar.gz ./config建议:
- 把备份文件存到另一台机器或对象存储;
- 在升级镜像前做一次备份,有问题可以及时回滚。
十一、常见问题与排查路径
1. 客户端连不上服务端
排查顺序:
- 服务器上
docker logs rustdesk-server看是否有客户端连接日志; - 从客户端机器上
telnet 服务器IP 21114/ 使用nc测试端口连通性; - 确认云服务器安全组、系统防火墙都已放行端口;
- 确认客户端 RustDesk 设置中填写的是你的 IP/域名,而不是默认官方;
- 如果是家宽环境,检查路由器 UPnP、端口映射是否正确。
2. 可以看到 ID,但连接非常慢或失败
通常意味着:
- 信令(hbbs)可以打通,但实际画面中继(hbbr)有问题;
- 或双方网络质量极差。
排查建议:
- 确认 21117/TCP+UDP 端口完全开放并正确映射;
- 检查服务器和客户端之间的网络延迟(
ping、mtr等); - 查看服务器指标(CPU / 内存 / 带宽)是否打满。
3. 端口已被占用
如果 docker compose up 报端口冲突:
-
用
ss -tulnp | grep 2111看看哪些进程正在占用; -
或者在 compose 中改成:
ports:- "22114:21114"- "22115:21115"- "22115:21115/udp"...然后客户端填写服务端地址时,就用映射后的宿主机端口(例如 22114 等)。
4. 日志在哪里看?
最直接的方法:
docker logs -f rustdesk-server如果你做了日志挂载或启用了额外的日志系统,也可以在对应目录 / 平台统一查看。
通过日志可以看到:
- 新设备注册;
- 连接尝试;
- 可能出现的错误信息(证书 / 协议 / 网络等)。
十二、总结:RustDesk Docker 服务端部署清单
最后,再把这篇长文的关键步骤压缩成一份清单,方便以后快速复盘:
- 选择一台服务器(公有云 / 内网机器),安装好 Docker;
- 创建
~/docker-data/rustdesk目录; - 拉取镜像:
docker pull rustdesk/rustdesk-server:版本号; - 用
docker run起一个最小实例,确认hbbs/hbbr正常启动; - 写好
docker-compose.yml,挂载./config:/root/.config/rustdesk,映射 21114–21117 端口(含 UDP); - 放开云服务器安全组和系统防火墙对应端口;
- (推荐)为服务器绑定一个域名,并按需配置 TLS;
- 在 RustDesk 客户端中填入你的服务端地址(IP 或域名),重启客户端;
- 测试几台机器之间的远程连接,观察体验和日志;
- 定期备份
./config,升级镜像前务必先备份,保持可回滚。
做到这些,你就拥有了一套完全掌握在自己手里的远程桌面基础设施:
不再依赖任何第三方云服务,也能在复杂网络环境下为团队、家人和自己提供安全可靠的远程访问能力。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!