从零部署 RustDesk 自建服务器,使用 Docker Compose 运行 hbbs 与 hbbr,涵盖云服务器端口、安全组、密钥保护、客户端配置、P2P 直连和中继排错。
自建 RustDesk 中继服务器教程:Docker 部署 hbbs 与 hbbr

用 Docker Compose 部署 hbbs 与 hbbr,把远程桌面的连接入口、密钥和中继带宽放在自己能管理的服务器上。
如果你需要从外部设备访问家中的开发环境、文件和桌面应用,自建 RustDesk 可以把部署控制权交给你自己。它并不等于“零维护”或“绝对安全”,但通过固定版本、限制端口、保护密钥和定期更新,可以形成一条边界清晰、便于审计的远程访问链路。
一、为什么选择自建 RustDesk
商业远控软件通常更省配置,公共组网工具更适合轻量互联,而 RustDesk 自建方案适合希望掌握服务端入口、连接密钥和中继带宽的个人或小团队。它支持 Windows、macOS、Linux、Android 和 iOS,远程桌面、文件传输等能力仍由 RustDesk 客户端完成。
适合的理由
- 入口可控:客户端指向自己的 ID 与中继服务器。
- P2P 优先:网络条件允许时,桌面数据可在两端直连。
- 平台覆盖广:适合办公、开发和临时协作。
- 成本可预估:主要成本是云服务器、带宽和维护时间。
需要承担的工作
- 维护系统补丁、防火墙规则和 Docker 版本。
- 保管服务器密钥并准备备份与恢复方案。
- 中继流量会消耗带宽,体验取决于两端网络。
- 服务升级前需要阅读版本变更并验证回滚。
二、hbbs、hbbr 与 P2P 的工作原理
三、服务器准备与端口规划
| 项目 | 建议 | 说明 |
|---|---|---|
| 系统 | Ubuntu 22.04/24.04 或 Debian 12 | 选择仍在支持周期内的发行版 |
| 资源 | 1 核 1 GB 起步 | 轻量个人使用通常足够,中继并发高时再扩容 |
| 带宽 | 按中继并发量规划 | 画面、文件和音频都可能占用出口带宽 |
| 域名 | rd.example.com | 便于更换服务器时只更新 DNS |
| 镜像 | 固定 RustDesk Server 版本 | 不要把 latest 直接用于生产环境 |
| 端口 | 协议 | 用途 | 是否必需 |
|---|---|---|---|
| 21115 | TCP | NAT 类型检测 | 按客户端版本与功能确认 |
| 21116 | TCP | ID 服务的 TCP 通道 | 建议开放 |
| 21116 | UDP | ID 注册、心跳和打洞相关流量 | 必须重点检查 |
| 21117 | TCP | hbbr 中继服务 | 使用中继时必需 |
| 21118/21119 | TCP | WebSocket 与 Web 中继 | 需要网页客户端时再开放 |
四、Docker Compose 部署 hbbs 与 hbbr
安装 Docker 确认 Docker Engine 与 Compose 插件可用,并设置 Docker 开机启动。
创建数据目录 把服务数据和 Ed25519 密钥放在独立目录,便于备份和迁移。
启动两个服务 使用固定版本镜像运行 hbbs 与 hbbr,检查容器日志和监听端口。
复制公钥 只把 id_ed25519.pub 填入客户端,私钥 id_ed25519 不离开服务器。
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:1.1.16
command: hbbs
volumes:
- ./data:/root
network_mode: "host"
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:1.1.16
command: hbbr
volumes:
- ./data:/root
network_mode: "host"
restart: unless-stoppedmkdir -p ~/rustdesk/data
cd ~/rustdesk
docker compose up -d
docker compose ps
docker compose logs --tail=100 hbbs hbbr
cat ./data/id_ed25519.pub五、客户端配置与首次连接
rd.example.com:21116rd.example.com:21117id_ed25519.pub 内容并保存| 字段 | 示例 | 注意事项 |
|---|---|---|
| ID 服务器 | rd.example.com:21116 | 确认 DNS、TCP/UDP 安全组和系统防火墙 |
| 中继服务器 | rd.example.com:21117 | 只在直连失败或策略要求时承担桌面流量 |
| Key | id_ed25519.pub | 不要粘贴私钥或把密钥提交到仓库 |
六、安全加固与性能优化
限制数据目录权限,备份私钥并记录恢复流程。
只开放必需端口,SSH 管理入口限制来源。
固定镜像版本,升级前查看发布说明并保留回滚点。
监控中继出口流量,避免把高并发会话压在低带宽实例上。
| 问题 | 优先处理 | 原因 |
|---|---|---|
| 连接延迟高 | 检查是否走 hbbr、选择近端机房、优化两端网络 | 中继路径和丢包会直接影响交互 |
| 画面卡顿 | 降低画质、关闭不必要的文件/剪贴板重定向 | 减少带宽与编码压力 |
| 中继带宽不足 | 限制并发或升级出口带宽 | hbbr 会转发完整的加密会话流量 |
七、常见问题排查
客户端一直显示未就绪
现象
客户端能打开,但无法注册 ID 或连接服务器。
原因
最常见是 21116/UDP 未在云安全组或系统防火墙放行,也可能是域名解析到了旧地址。
解决方案
- 检查 DNS 与服务器监听端口
- 分别放行 21116 TCP 和 UDP,并确认本机防火墙
- 查看 hbbs 日志,重启客户端后再次观察状态
可以连接,但速度明显变慢
现象
连接成功,画面却卡顿,文件传输速度也低。
原因
两端 NAT 无法打洞,连接回退到 hbbr;或中继实例的出口带宽不足。
解决方案
- 确认连接路径并查看 hbbr 日志
- 选择距离两端更近的机房或提升出口带宽
- 在客户端降低画质并关闭不需要的重定向
服务器重启后没有恢复
现象
容器停止,客户端全部离线。
原因
Docker 未设置开机启动、Compose 文件路径不对,或固定镜像版本拉取失败。
解决方案
- 执行 systemctl is-enabled docker
- 执行 docker compose ps 和 docker compose logs
- 恢复数据目录与密钥后再启动,不要重新生成客户端 Key
密钥错误或无法验证服务器
现象
填写服务器地址后,客户端提示 Key 不匹配。
原因
客户端粘贴了错误公钥,或服务端数据目录被替换导致密钥对变化。
解决方案
- 重新读取服务端 data/id_ed25519.pub
- 确认所有客户端使用同一套公钥
- 不要删除旧密钥后直接重建,先完成备份和迁移
八、与其他远程方案怎么选
| 方案 | 控制权 | 复杂度 | 适合场景 |
|---|---|---|---|
| 自建 RustDesk | 服务端、密钥与中继可控 | 中等 | 多平台远控、希望掌握连接入口 |
| Tailscale + RDP | 网络策略可控,依赖官方控制平面 | 较低 | Windows 主机与可信设备组网 |
| ZeroTier + RDP | 虚拟网络可控,需理解网络成员管理 | 较低 | 需要虚拟局域网语义的设备互联 |
| 商业远控 | 依赖厂商账号与服务 | 最低 | 临时协助、移动端和复杂网络 |
九、部署完成检查清单
支持与分享
觉得这篇文章有点用,就把它递给下一位读者。
- 作者
- Demius
- 发布于
- 2026年9月25日
- 许可协议
- CC BY-NC-SA 4.0

评论区
分享你的想法,与大家交流讨论。