用 Docker 自建 RustDesk 服务端:从内网到公网的完整实战

3834 字
19 分钟
用 Docker 自建 RustDesk 服务端:从内网到公网的完整实战

这篇是写给未来自己的 RustDesk 服务端部署备忘录:一次搞清楚 hbbs / hbbr 是什么、需要开哪些端口、怎么配 Docker、怎么配客户端,以后无论是给自己还是给公司搭内网远程桌面,都能 “照着步骤抄一遍” 秒起服务。

一、RustDesk 与自建服务端的关系#

RustDesk 是一款开源的远程桌面软件,被很多人叫作 “开源版 TeamViewer / AnyDesk”。

它有两个重要组成部分:

  • 客户端:安装在被控端(Server)和控制端(Client)机器上,负责画面采集、控制等;
  • 服务端:包括两个核心组件:
    • hbbs:RustDesk 信令 / 中继服务器(ID 注册、信令、NAT 协调等);
    • hbbr:RustDesk 中继服务(在点对点穿透失败时做流量中继)。

默认情况下,你可以直接使用官方公共服务端,但这样会有几个顾虑:

  • 数据与连接经过第三方,隐私 / 合规压力更大
  • 公共中继服务器延迟、带宽都难以保证,体验不稳定
  • 无法完全控制接入策略、日志、限流等。

因此,自建 RustDesk 服务端 是很多团队和个人的首选:

  • 所有连接流量在自己服务器上;
  • 可以按需做防火墙、IP 限制、审计;
  • 自己控制服务器位置,降低延迟。

本文将用 Docker 一步步搭建:

  1. 认识 hbbshbbr 需要的端口和角色;
  2. docker run 跑起服务端,完成最小可用部署;
  3. docker-compose 标准化部署(方便一键启动/停止);
  4. 配置域名和 TLS 证书,让客户端信任;
  5. 讲清楚常见网络场景(公有云 / 家宽 / NAT)下的端口需求;
  6. 完整演示如何在 RustDesk 客户端中填写自建服务端地址;
  7. 列出部署过程中高频踩坑与排查方式。

二、RustDesk 服务端组件与端口规划#

RustDesk 服务端最重要的概念就是两个进程:hbbshbbr

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 上:

Terminal window
mkdir -p ~/docker-data/rustdesk
cd ~/docker-data/rustdesk

Windows(PowerShell)类似:

Terminal window
mkdir C:\docker-data\rustdesk
cd C:\docker-data\rustdesk

RustDesk 官方服务端镜像一般会在容器内使用某个目录来存放配置和密钥,例如 /root/.config/rustdesk(以实际镜像为准)。
我们会通过挂载卷的方式保证这些配置和密钥能够持久化。

四、获取 RustDesk 服务端 Docker 镜像#

RustDesk 社区常用的镜像命名类似(实际以官方发布为准,比如 rustdesk/rustdesk-serverrustdesk/rustdesk-server-s6 等):

Terminal window
docker pull rustdesk/rustdesk-server:latest

拉取完成后,确认镜像:

Terminal window
docker images | grep rustdesk

如果你更在意稳定性,可以换成具体版本号,例如:

Terminal window
docker pull rustdesk/rustdesk-server:1.1.0

总之,生产环境建议固定镜像版本,而不是直接用 latest

五、最小可用:用 docker run 快速起一套服务端#

在正式写 compose 之前,我们先用命令行跑一个最小版本,验证:

  • 服务端能起来;
  • 端口能访问;
  • 客户端能连上。

1. 运行 RustDesk 服务端容器#

假设镜像名为 rustdesk/rustdesk-server,运行命令示例:

Terminal window
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

启动后检查容器:

Terminal window
docker ps
docker logs rustdesk-server

如果日志中提示 hbbs / hbbr 正常启动,并监听对应端口,就说明服务端基础部分已经就绪。

2. 初次生成密钥对(如适用)#

某些版本的 RustDesk 服务端镜像在首次启动时,会自动生成一对公私钥,用于客户端校验。
这些密钥会保存在 /root/.config/rustdesk 中,因此我们已经通过卷挂载保证了它们可持久化。

你可以进容器查看(了解即可):

Terminal window
docker exec -it rustdesk-server bash
ls -l /root/.config/rustdesk

命令行一般会看到类似 id_ed25519id_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 所在目录执行:

Terminal window
docker compose up -d

检查容器:

Terminal window
docker compose ps
docker compose logs -f

如果启动正常,说明你已经有了一套可用于客户端连接的 RustDesk 服务端。

1. 防火墙与安全组#

如果你的服务器在公有云(阿里云 / 腾讯云 / AWS 等),记得:

  • 安全组 中放行 21114–21117 对外访问;
  • 如果有系统级防火墙(如 ufw / firewalld),也要放开对应端口。

示例(Ubuntu + ufw):

Terminal window
sudo ufw allow 21114:21117/tcp
sudo ufw allow 21115:21116/udp
sudo ufw allow 21117/udp
sudo ufw reload

随后你可以用 ss -tulnpnetstat -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

随后,可以在本机测试解析:

Terminal window
ping rustdesk.your-domain.com

能解析到你服务器 IP 即可。

2. 获取 TLS 证书(参考思路)#

如需为 hbbs / hbbr 开启 TLS,可以用常见的证书获取工具:

  • certbot
  • acme.sh

大致流程(以 acme.sh 为例,伪代码,仅做思路参考):

Terminal window
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. 在客户端填写自建服务器信息#

不同版本界面略有差异,一般步骤类似:

  1. 打开 RustDesk 设置页 / 菜单;
  2. 找到 “网络” / “服务端地址” / “ID 服务器”等相关选项;
  3. 填写:
    • ID/中继服务器地址rustdesk.your-domain.com(或你的公网 IP);
    • 如果能分开设置 ID ServerRelay Server,则都填写为你自建的域名或 IP;
  4. 保存设置,重启客户端。

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 服务端,
  • 并希望在外网(公司、出差等)也能通过它访问家里的电脑。

则需要:

  1. 在家庭路由器上做端口转发:
    • 把外网的 21114–21117 映射到内网服务端主机;
  2. 服务端主机防火墙放行对应端口;
  3. 公网 IP 注意是否为运营商 NAT(大部分家宽是 CGNAT,外网无法直接访问)。

如果你是运营商大内网(没有真正公网 IP),那么:

  • 直接在家宽上搭 RustDesk 服务端,对公网访问通常不现实;
  • 可以考虑:
    • 在云服务器搭 RustDesk 服务端;
    • 家里所有设备和外网设备都只连云服务器。

3. 纯内网场景(公司内网)#

在公司内部局域网中:

  • 可以在某台内网服务器上搭 RustDesk 服务端;
  • 所有被控端 / 控制端都在同一内网下;
  • 无需对外开放端口,只做内网防火墙规则。

优点:

  • 数据完全在内网中流转,安全性更高;
  • 延迟极低,非常适合公司内部远程运维 / 支持。

注意点:

  • 需要确保所有客户端能访问该服务器的 21114–21117(及你实际使用的端口);
  • 如果网络划分了多个 VLAN,需要跨网段路由可达。

十、备份、升级与迁移#

RustDesk 服务端的核心状态主要包含:

  • 密钥(公私钥);
  • 配置文件;
  • (如果启用数据库或其他持久化存储,也包括对应目录)。

由于我们已经把这些都挂载到宿主机 ~/docker-data/rustdesk/config 中,所以:

  • 迁移:只需要把这个目录打包复制到新机器,拉同版本镜像并挂载即可;
  • 升级:改 compose 中镜像版本,docker compose pull && docker compose up -d
  • 备份:定期打包该目录。

示例备份命令:

Terminal window
cd ~/docker-data/rustdesk
tar czf rustdesk-config-backup-$(date +%Y%m%d).tar.gz ./config

建议:

  • 把备份文件存到另一台机器或对象存储;
  • 在升级镜像前做一次备份,有问题可以及时回滚。

十一、常见问题与排查路径#

1. 客户端连不上服务端#

排查顺序:

  1. 服务器上 docker logs rustdesk-server 看是否有客户端连接日志;
  2. 从客户端机器上 telnet 服务器IP 21114 / 使用 nc 测试端口连通性;
  3. 确认云服务器安全组、系统防火墙都已放行端口;
  4. 确认客户端 RustDesk 设置中填写的是你的 IP/域名,而不是默认官方;
  5. 如果是家宽环境,检查路由器 UPnP、端口映射是否正确。

2. 可以看到 ID,但连接非常慢或失败#

通常意味着:

  • 信令(hbbs)可以打通,但实际画面中继(hbbr)有问题;
  • 或双方网络质量极差。

排查建议:

  • 确认 21117/TCP+UDP 端口完全开放并正确映射;
  • 检查服务器和客户端之间的网络延迟(pingmtr 等);
  • 查看服务器指标(CPU / 内存 / 带宽)是否打满。

3. 端口已被占用#

如果 docker compose up 报端口冲突:

  • ss -tulnp | grep 2111 看看哪些进程正在占用;

  • 或者在 compose 中改成:

    ports:
    - "22114:21114"
    - "22115:21115"
    - "22115:21115/udp"
    ...

    然后客户端填写服务端地址时,就用映射后的宿主机端口(例如 22114 等)。

4. 日志在哪里看?#

最直接的方法:

Terminal window
docker logs -f rustdesk-server

如果你做了日志挂载或启用了额外的日志系统,也可以在对应目录 / 平台统一查看。
通过日志可以看到:

  • 新设备注册;
  • 连接尝试;
  • 可能出现的错误信息(证书 / 协议 / 网络等)。

十二、总结:RustDesk Docker 服务端部署清单#

最后,再把这篇长文的关键步骤压缩成一份清单,方便以后快速复盘:

  1. 选择一台服务器(公有云 / 内网机器),安装好 Docker;
  2. 创建 ~/docker-data/rustdesk 目录;
  3. 拉取镜像:docker pull rustdesk/rustdesk-server:版本号
  4. docker run 起一个最小实例,确认 hbbs/hbbr 正常启动;
  5. 写好 docker-compose.yml,挂载 ./config:/root/.config/rustdesk,映射 21114–21117 端口(含 UDP);
  6. 放开云服务器安全组和系统防火墙对应端口;
  7. (推荐)为服务器绑定一个域名,并按需配置 TLS;
  8. 在 RustDesk 客户端中填入你的服务端地址(IP 或域名),重启客户端;
  9. 测试几台机器之间的远程连接,观察体验和日志;
  10. 定期备份 ./config,升级镜像前务必先备份,保持可回滚。

做到这些,你就拥有了一套完全掌握在自己手里的远程桌面基础设施:
不再依赖任何第三方云服务,也能在复杂网络环境下为团队、家人和自己提供安全可靠的远程访问能力。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
用 Docker 自建 RustDesk 服务端:从内网到公网的完整实战
https://firefly.cuteleaf.cn/posts/docker-rustdesk-deploy/
作者
Airio_
发布于
2026-02-26
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Airio_
Hello, I'm Airio_.
公告
欢迎来到OfoCa Space。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
6
分类
1
标签
16
总字数
18,733
运行时长
0
最后活动
0 天前

目录