RustDesk 自建部署实战:阿里云 ECS 上手动部署 RustDesk Server OSS

最近为了让远程控制链路更稳定,也为了摆脱对公共中继服务的依赖,我把 RustDesk Server OSS 单独部署到了自己的阿里云 ECS 上。

这篇文章按实际操作过程,完整记录一下 RustDesk 服务端手动部署 的步骤。整套方案不依赖 Docker,也不使用 Pro 安装脚本,更适合自己长期维护和排查问题。

一、这篇文章适合什么场景

如果你符合下面这些情况,这篇文章应该会比较有参考价值:

  • 手里有一台公网 Linux 服务器
  • 想搭建自己的 RustDesk 服务端
  • 不想依赖官方公共服务器
  • 希望通过自己的域名接入客户端
  • 更偏好“原生二进制 + systemd”的部署方式

本文采用的是 RustDesk Server OSS 原生二进制手动部署

二、整体架构

最终架构比较简单:

1
2
3
4
RustDesk 客户端
-> rustdesk.YOUR_DOMAIN
-> 阿里云服务器
-> hbbs + hbbr

其中:

  • hbbs:负责 ID / rendezvous
  • hbbr:负责 relay

三、为什么选择手动部署

我一开始尝试过其他方式,比如:

  1. Docker 部署
  2. 安装脚本部署

但在实际使用里会遇到一些问题:

  • Docker Hub 拉取镜像不一定稳定
  • 某些脚本容易走到 Pro 安装路径
  • 自动化安装虽然方便,但不够透明
  • 后续排障时,原生部署方式通常更直接

所以最后我还是选择了最朴素的一套方案:

直接下载 RustDesk Server OSS 的 Linux 原生二进制,手动写 systemd 服务。

它的优点也很明显:

  • 依赖少
  • 结构清晰
  • 出问题时更容易排查
  • 适合整理成自己的长期维护文档

四、前置准备

1. 配置域名

我给 RustDesk 分配的域名是:

1
rustdesk.YOUR_DOMAIN

DNS 解析到阿里云 ECS 的公网 IP:

1
rustdesk.YOUR_DOMAIN -> YOUR_SERVER_IP

2. 放行安全组和防火墙

RustDesk Server OSS 至少需要放行这些端口:

  • 21115/tcp
  • 21116/tcp
  • 21117/tcp
  • 21116/udp

如果你还要使用 Web Client,可以额外放行:

  • 21118/tcp
  • 21119/tcp

3. 系统环境

本文记录时的环境:

  • Ubuntu 24.04
  • x86_64
  • 阿里云 ECS

五、获取 RustDesk Server OSS 二进制

我最终使用的是解压后的原生二进制目录,包含:

1
2
3
hbbs
hbbr
rustdesk-utils

例如目录结构:

1
2
3
4
5
6
~/tools/restdesk/
├── rustdesk-server-linux-amd64.zip
└── amd64/
├── hbbs
├── hbbr
└── rustdesk-utils

六、安装到正式目录

先创建正式安装目录:

1
sudo mkdir -p /opt/rustdesk-server

复制可执行文件:

1
2
3
cd ~/tools/restdesk/amd64
sudo cp hbbs hbbr rustdesk-utils /opt/rustdesk-server/
sudo chmod +x /opt/rustdesk-server/hbbs /opt/rustdesk-server/hbbr /opt/rustdesk-server/rustdesk-utils

检查:

1
ls -l /opt/rustdesk-server

七、创建专用用户和数据目录

为了避免直接使用 root 运行服务,可以单独创建一个系统用户:

1
sudo useradd --system --home /opt/rustdesk-server --shell /usr/sbin/nologin rustdesk 2>/dev/null || true

再创建数据目录并调整权限:

1
2
sudo mkdir -p /opt/rustdesk-server/data
sudo chown -R rustdesk:rustdesk /opt/rustdesk-server

八、配置 hbbr 服务

编辑 systemd 文件:

1
sudo nano /etc/systemd/system/hbbr.service

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=RustDesk Relay Server (hbbr)
After=network.target

[Service]
Type=simple
User=rustdesk
Group=rustdesk
WorkingDirectory=/opt/rustdesk-server
ExecStart=/opt/rustdesk-server/hbbr
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

九、配置 hbbs 服务

编辑:

1
sudo nano /etc/systemd/system/hbbs.service

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=RustDesk ID/Rendezvous Server (hbbs)
After=network.target hbbr.service
Wants=hbbr.service

[Service]
Type=simple
User=rustdesk
Group=rustdesk
WorkingDirectory=/opt/rustdesk-server
ExecStart=/opt/rustdesk-server/hbbs
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

这里的配置思路比较直接:

  • hbbr 先启动
  • hbbs 依赖 hbbr
  • 两个服务都在 /opt/rustdesk-server 下运行

十、启动服务

重载 systemd:

1
sudo systemctl daemon-reload

启动 relay 服务:

1
sudo systemctl enable --now hbbr

启动 ID 服务:

1
sudo systemctl enable --now hbbs

查看状态:

1
2
sudo systemctl status hbbr --no-pager
sudo systemctl status hbbs --no-pager

理想状态应该能看到:

1
active (running)

十一、检查端口监听情况

执行:

1
ss -lntup | grep -E '21115|21116|21117|21118|21119'

至少应看到这些核心端口:

  • 21115/tcp
  • 21116/tcp
  • 21117/tcp
  • 21116/udp

十二、生成并获取服务端公钥

hbbs 首次正常启动后,会自动生成密钥文件。

查找方式:

1
sudo find /opt/rustdesk-server -name "id_ed25519.pub" -o -name "id_ed25519"

我这里最终得到的公钥内容如下:

1
YOUR_RUSTDESK_PUBLIC_KEY

查看命令:

1
cat /opt/rustdesk-server/id_ed25519.pub

这里要注意:

  • id_ed25519.pub 是公钥,客户端需要填写它
  • id_ed25519 是私钥,不要泄露

十三、客户端配置方法

在 RustDesk 客户端中,进入网络设置后,填写:

  • ID Serverrustdesk.YOUR_DOMAIN
  • KeyYOUR_RUSTDESK_PUBLIC_KEY
  • Relay Server:可以先留空,如果连接不稳定再填 rustdesk.YOUR_DOMAIN
  • API Server:OSS 版本通常不需要填写

十四、Windows 端口连通性测试

如果在 Windows 上测试端口,由于默认没有 nc,可以直接使用 PowerShell:

1
2
3
Test-NetConnection rustdesk.YOUR_DOMAIN -Port 21115
Test-NetConnection rustdesk.YOUR_DOMAIN -Port 21116
Test-NetConnection rustdesk.YOUR_DOMAIN -Port 21117

简写也可以:

1
2
3
tnc rustdesk.YOUR_DOMAIN -Port 21115
tnc rustdesk.YOUR_DOMAIN -Port 21116
tnc rustdesk.YOUR_DOMAIN -Port 21117

如果输出中看到:

1
TcpTestSucceeded : True

就说明从本地到服务器的 TCP 连通性没有问题。

十五、我当前的连通性结果

我实际测试的结果是:

  • 21115/tcp:通
  • 21116/tcp:通
  • 21117/tcp:通

这基本可以说明:

  • 服务已经对公网开放
  • 阿里云安全组规则正确
  • 服务器本机监听正常
  • 域名解析没有问题

十六、常见问题

1. Windows 里没有 nc

PowerShell 默认没有 nc,报错通常类似:

1
nc : The term 'nc' is not recognized ...

这种情况下,直接改用 Test-NetConnectiontnc 就可以。

2. 服务启动了,但找不到 id_ed25519.pub

建议优先检查:

1
2
3
4
journalctl -u hbbs -n 100 --no-pager
journalctl -u hbbr -n 100 --no-pager
ls -la /opt/rustdesk-server
ls -la /opt/rustdesk-server/data

很多时候不是“没生成”,而是服务没有在正确的工作目录下运行。

3. 客户端配置了域名和 Key 仍然连接不上

可以按下面顺序排查:

  1. DNS 是否解析到正确公网 IP
  2. 安全组是否放行 21115/21116/21117
  3. 本机防火墙是否放行
  4. hbbs / hbbr 是否正在运行
  5. 客户端填写的 Key 是否完整正确

4. Relay Server 要不要填

一般可以先不填。

如果后续出现中继不稳定、点对点穿透效果不好,再明确填写:

1
rustdesk.YOUR_DOMAIN

十七、总结

这套部署方式的优点比较明确:

  • 不依赖 Docker
  • 不依赖复杂安装脚本
  • 可控性高
  • systemd 管理清晰
  • 适合长期维护和问题排查

最终只要保证下面几点:

  • 域名解析正确
  • 端口放行正确
  • hbbs / hbbr 正常运行
  • 客户端填写的 ID ServerKey 无误

基本就可以把自己的 RustDesk 服务稳定跑起来。

十八、关键配置汇总

安装目录

1
/opt/rustdesk-server

systemd 服务文件

  • /etc/systemd/system/hbbs.service
  • /etc/systemd/system/hbbr.service

公网域名

1
rustdesk.YOUR_DOMAIN

客户端公钥

1
YOUR_RUSTDESK_PUBLIC_KEY

关键端口

  • 21115/tcp
  • 21116/tcp
  • 21117/tcp
  • 21116/udp

十九、完整命令清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo mkdir -p /opt/rustdesk-server

cd ~/tools/restdesk/amd64
sudo cp hbbs hbbr rustdesk-utils /opt/rustdesk-server/
sudo chmod +x /opt/rustdesk-server/hbbs /opt/rustdesk-server/hbbr /opt/rustdesk-server/rustdesk-utils

sudo useradd --system --home /opt/rustdesk-server --shell /usr/sbin/nologin rustdesk 2>/dev/null || true
sudo mkdir -p /opt/rustdesk-server/data
sudo chown -R rustdesk:rustdesk /opt/rustdesk-server

sudo systemctl daemon-reload
sudo systemctl enable --now hbbr
sudo systemctl enable --now hbbs

sudo systemctl status hbbr --no-pager
sudo systemctl status hbbs --no-pager

ss -lntup | grep -E '21115|21116|21117|21118|21119'
cat /opt/rustdesk-server/id_ed25519.pub

如果后续我继续折腾 RustDesk 的 Web Client、反向代理或多节点中继,也会在这篇文章基础上继续补充。