RustDesk 自建服务器教程
适用场景:
- 被控或控制端:Windows 10
- 自建服务器:Ubuntu 20.04/22.04/24.04
- 使用 RustDesk 开源版服务端
- 推荐使用 Docker 部署
hbbs和hbbr
RustDesk 自建服务端主要包含两个组件:
hbbs:ID/Rendezvous 服务,帮助客户端发现彼此hbbr:Relay 中继服务,直连失败时转发桌面数据
一、准备条件
你需要准备:
- 一台有公网 IP 的 Ubuntu 服务器
- 一个可以访问服务器的域名,例如:
text
rustdesk.example.com
没有域名也可以直接使用公网 IP。
- 服务器最好满足:
text
CPU:1 核以上
内存:1 GB 以上
系统:Ubuntu 20.04/22.04/24.04
如果服务器在阿里云、腾讯云、华为云、AWS 等云平台,还需要在云控制台的安全组中放行相应端口。
注意:如果 Ubuntu 服务器位于家庭路由器后面,必须配置端口转发;如果运营商使用 CGNAT,通常无法直接从公网访问,需要更换有公网 IPv4 的服务器或使用 IPv6/VPS。
二、安装 Docker
通过 SSH 登录 Ubuntu 服务器:
bash
ssh root@你的服务器IP
更新系统:
bash
apt update
apt upgrade -y
安装 Docker:
bash
curl -fsSL https://get.docker.com | sh
启动 Docker 并设置开机启动:
bash
systemctl enable --now docker
确认安装成功:
bash
docker --version
docker compose version
如果系统没有 docker compose 命令,可以安装 Compose 插件:
bash
apt update
apt install -y docker-compose-plugin
再次检查:
bash
docker compose version
三、创建 RustDesk 服务端目录
创建数据目录:
bash
mkdir -p /opt/rustdesk-server/data
cd /opt/rustdesk-server
创建 Docker Compose 配置文件:
bash
nano docker-compose.yml
填入以下内容:
yaml
services:
hbbs:
container_name: rustdesk-hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r 你的服务器公网IP:21117
volumes:
- ./data:/root
network_mode: host
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: rustdesk-hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./data:/root
network_mode: host
restart: unless-stopped
把:
text
你的服务器公网IP
替换成实际公网 IP。
例如:
yaml
command: hbbs -r 203.0.113.10:21117
如果使用域名,也可以写成:
yaml
command: hbbs -r rustdesk.example.com:21117
保存文件:
Ctrl + O- 回车
Ctrl + X
这里使用 network_mode: host,可以避免 Docker 端口映射和 UDP 转发带来的额外问题。
四、启动 RustDesk 服务端
在 /opt/rustdesk-server 目录下执行:
bash
docker compose up -d
查看容器状态:
bash
docker compose ps
正常情况下应看到两个容器处于运行状态:
text
rustdesk-hbbs running
rustdesk-hbbr running
查看日志:
bash
docker compose logs -f
看到类似以下内容,通常说明服务已经启动:
text
INFO hbbs
INFO hbbr
按 Ctrl + C 退出日志查看。
五、开放服务器端口
RustDesk 常用端口如下:
| 端口 | 协议 | 用途 |
|---|---|---|
| 21115 | TCP | NAT 类型检测 |
| 21116 | TCP | ID/Rendezvous 服务 |
| 21116 | UDP | 客户端打洞和发现 |
| 21117 | TCP | 中继服务 |
| 21118 | TCP | Web 客户端相关功能 |
| 21119 | TCP | Web 客户端相关功能 |
普通 Windows 客户端使用时,至少开放:
text
21115/tcp
21116/tcp
21116/udp
21117/tcp
在 Ubuntu 上配置 UFW:
bash
ufw allow 22/tcp
ufw allow 21115/tcp
ufw allow 21116/tcp
ufw allow 21116/udp
ufw allow 21117/tcp
ufw enable
查看规则:
bash
ufw status
如果使用云服务器,还要在云平台安全组中添加相同规则。仅配置 Ubuntu 的 UFW,而没有配置云安全组,外部仍然可能无法访问。
不建议直接开放:
text
21115-21119 全部 TCP/UDP
如果只是 Windows 客户端远程控制,通常不需要开放 21118 和 21119。
六、查看服务器公钥
RustDesk 客户端需要填写服务端公钥,用于验证连接的是你的服务器。
查看公钥:
bash
cat /opt/rustdesk-server/data/id_ed25519.pub
输出一般类似:
text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxx
复制整行内容,包括开头的:
text
ssh-ed25519
不要复制换行,也不要复制私钥文件:
text
id_ed25519
私钥不要泄露。
如果公钥文件还没有生成,可以重启服务:
bash
docker compose restart hbbs
然后再次查看:
bash
cat /opt/rustdesk-server/data/id_ed25519.pub
七、Windows 10 安装 RustDesk 客户端
在 Windows 10 上安装 RustDesk 客户端。
安装后打开 RustDesk,进入设置。不同版本界面名称可能略有差异,一般路径是:
text
设置 → 网络 → ID/中继服务器
填写以下内容。
ID 服务器
填写:
text
你的服务器域名或公网IP
例如:
text
rustdesk.example.com
或者:
text
203.0.113.10
中继服务器
填写:
text
你的服务器域名或公网IP
例如:
text
rustdesk.example.com
或者:
text
203.0.113.10
Key
填写前面获取的公钥内容:
text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxx
保存后,完全退出 RustDesk,再重新打开。
在另一台电脑上重复相同配置。
八、检查客户端是否连接到自建服务器
在 Windows 客户端中检查:
- RustDesk 设置中的 ID 服务器已经填写
- Key 已经填写
- 重新启动 RustDesk
- 检查 RustDesk 窗口底部或网络状态
- 使用另一台配置相同服务器的电脑测试连接
如果连接正常,客户端会通过你的 hbbs 获取设备信息。
连接方式通常有两种:
直连
两台设备之间网络条件较好时,RustDesk 会尝试建立点对点连接。
优点:
- 延迟低
- 不占用服务器中继带宽
中继连接
直连失败时,客户端通过 hbbr 转发数据。
优点:
- 适用于复杂 NAT、校园网、公司网络等环境
缺点:
- 服务器会消耗上行带宽
- 延迟通常比直连高
九、验证端口是否正常
在服务器上查看监听端口:
bash
ss -lntup | grep -E '21115|21116|21117'
应该能看到 21115、21116、21117 相关监听信息。
查看容器状态:
bash
docker ps
查看服务日志:
bash
docker logs rustdesk-hbbs
docker logs rustdesk-hbbr
从另一台 Linux 或 macOS 设备测试 TCP 端口:
bash
nc -vz 你的服务器IP 21115
nc -vz 你的服务器IP 21116
nc -vz 你的服务器IP 21117
Windows PowerShell 也可以测试:
powershell
Test-NetConnection 你的服务器IP -Port 21115
Test-NetConnection 你的服务器IP -Port 21116
Test-NetConnection 你的服务器IP -Port 21117
如果结果中出现:
text
TcpTestSucceeded : True
说明 TCP 端口可以访问。
21116/udp 不能通过普通 TCP 测试判断,需要结合 RustDesk 实际连接和服务器日志确认。
十、常见问题
1. ID 服务器填写后无法连接
依次检查:
bash
docker compose ps
ufw status
ss -lntup | grep -E '21115|21116|21117'
然后确认云服务器安全组是否放行:
text
21115 TCP
21116 TCP
21116 UDP
21117 TCP
还要确认填写的是公网 IP,而不是:
text
127.0.0.1
192.168.x.x
10.x.x.x
172.16.x.x
2. 可以发现设备,但无法控制
通常是中继端口或 -r 参数配置问题。
检查 Compose 文件中的这一行:
yaml
command: hbbs -r 你的服务器公网IP:21117
确认地址和端口正确,然后重启:
bash
docker compose up -d
同时确认:
text
21117/tcp
已经在 UFW 和云安全组中放行。
3. Key 错误
确认 Key 是从以下文件中复制的:
bash
/opt/rustdesk-server/data/id_ed25519.pub
不要复制:
text
id_ed25519
不要把命令行提示符一起复制进去,例如:
text
root@server:~#
如果服务端重建过数据目录,公钥可能会变化,此时需要把新的公钥重新配置到所有客户端。
4. Docker 容器不断重启
查看日志:
bash
docker compose logs hbbs
docker compose logs hbbr
常见原因:
- 公网 IP 写错
- YAML 缩进错误
- Docker 镜像下载失败
- 端口已经被其他程序占用
- 服务器资源不足
检查配置文件:
bash
docker compose config
如果配置正确,该命令会输出解析后的 Compose 配置;如果有缩进或语法问题,会直接提示错误。
5. 服务器没有公网 IPv4
如果服务器只能通过内网地址访问,外部客户端无法直接连接。可以选择:
- 更换带公网 IPv4 的 VPS
- 配置路由器端口转发
- 使用公网 IPv6,并确保客户端网络支持 IPv6
- 使用 RustDesk Pro 或其他带打洞/网络接入能力的方案
- 通过 VPN 将客户端和服务器放入同一网络
十一、升级 RustDesk 服务端
进入部署目录:
bash
cd /opt/rustdesk-server
拉取最新版镜像:
bash
docker compose pull
重新创建容器:
bash
docker compose up -d
查看状态:
bash
docker compose ps
数据目录位于:
text
/opt/rustdesk-server/data
升级前建议备份:
bash
tar -czf /root/rustdesk-data-backup.tar.gz -C /opt/rustdesk-server data
重点保护以下文件:
text
id_ed25519
id_ed25519.pub
其中私钥尤其重要。不要把它提交到 Git,也不要发送给其他人。
十二、推荐的最终配置
目录结构:
text
/opt/rustdesk-server/
├── docker-compose.yml
└── data/
├── id_ed25519
└── id_ed25519.pub
服务器端 Compose 配置:
yaml
services:
hbbs:
container_name: rustdesk-hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r 203.0.113.10:21117
volumes:
- ./data:/root
network_mode: host
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: rustdesk-hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./data:/root
network_mode: host
restart: unless-stopped
客户端填写:
text
ID 服务器:203.0.113.10
中继服务器:203.0.113.10
Key:id_ed25519.pub 的完整内容
服务器开放:
text
21115/tcp
21116/tcp
21116/udp
21117/tcp
这样配置后,Windows 10 客户端和其他 RustDesk 客户端就可以使用你自己的 ID 服务和中继服务。
