在 VPS 上自建 RustDesk 远程桌面:从部署到用 iPhone 控制 MacBook
起因
我经常需要在外面用 iPhone 查看 MacBook 上的东西。市面上的远程桌面方案要么收费,要么数据经过第三方服务器。
RustDesk 是一个开源远程桌面工具,支持自建服务端。它的架构很清晰:
| 组件 | 作用 |
|---|---|
| hbbs | ID 服务器,负责设备注册和握手 |
| hbbr | 中继服务器,P2P 打不通时转发数据 |
自建之后,所有连接都经过自己的 VPS,数据完全可控。
第一步:Docker 部署服务端
RustDesk 官方提供了 Docker Compose 文件,部署非常简单。
bash
# 下载官方 Compose 文件 wget rustdesk.com/oss.yml -O compose.yml # 启动服务 sudo docker compose up -d # 确认容器状态 docker ps | grep rustdesk
预期输出:
text
hbbs rustdesk/rustdesk-server:latest Up hbbr rustdesk/rustdesk-server:latest Up
⚠️ 踩坑:Docker 已安装时不要重复运行安装脚本
官方文档给的安装命令 bash <(wget -qO- https://get.docker.com) 会在检测到已有 Docker 时给出警告,并让你按 Ctrl+C 中止。如果 VPS 上已经装了 Docker,跳过这一步即可。
第二步:放行防火墙端口
RustDesk 需要以下端口:
| 协议 | 端口 | 用途 |
|---|---|---|
| TCP | 21114-21119 | 信令 + 中继 |
| UDP | 21116 | ID 注册(关键) |
bash
ufw allow 21114:21119/tcp ufw allow 21116/udp ufw status
⚠️ 关键:云服务商安全组也要放行 UDP
这是最容易踩的坑。ufw 只是 VPS 内部的防火墙,云服务商(阿里云/腾讯云/AWS)还有一层独立的安全组。
如果 iPhone 连接时报:
text
Failed to connect to: 162.43.92.249:21116
先检查云控制台的安全组里有没有放行 UDP 21116。 很多人只加了 TCP,漏了 UDP,导致 ID 注册失败。
确认 UDP 正在监听
bash
ss -ulnp | grep 21116
应该看到 hbbs 在监听 *:21116。
第三步:获取公钥
RustDesk 服务端首次启动时会自动生成一对密钥。你需要把公钥填入客户端:
bash
cat ./data/id_ed25519.pub
记下输出的这串 Key,稍后用。
第四步:配置 Mac 客户端
打开 Mac 上的 RustDesk,进入 设置 → 网络。
⚠️ 踩坑:Key 输入框被锁定了
Mac 版 RustDesk 的网络设置里,Key 的输入框默认是灰色锁定的。你需要:
- 点击页面上的 “解锁设置” 按钮
- 输入 Mac 的管理员密码
- Key 的输入框才会出现
填入配置
| 字段 | 值 |
|---|---|
| ID Server | 你的VPS公网IP |
| Relay Server | 留空 |
| API Server | 留空 |
| Key | 刚才 cat 出来的公钥 |
关键点:免费开源版只需要填 ID Server 和 Key。Relay Server 和 API Server 是 Pro 版功能,留空即可,RustDesk 会自动推导中继地址。
保存后,RustDesk 主界面底部应该显示 “就绪”。
第五步:配置 iPhone 客户端
在 iPhone 的 RustDesk App 里,同样进入 设置 → 网络,填入和 Mac 一样的 ID Server 和 Key。
⚠️ 踩坑:iPhone 上没有预先的密码输入框
iPhone 作为控制端,界面逻辑和 Mac 不同:
- 先在主界面输入 Mac 的 9 位 ID
- 点击连接
- 弹出密码框后,再填入 Mac 的密码
不是在连接前预先填密码,而是先连接、后弹密码。
第六步:授权 macOS 权限(最关键)
iPhone 连接成功后,如果界面显示 “等待画面” 或黑屏,说明 Mac 没有把屏幕画面交给 RustDesk。
macOS 出于安全考虑,默认不允许任何应用录制屏幕。
开启屏幕录制权限
- 打开 Mac 的 系统设置 → 隐私与安全性 → 屏幕录制
- 找到 RustDesk,打开开关
- 系统提示“需要退出才能生效”,必须点击“退出并重新打开”
开启辅助功能权限
- 同样在 隐私与安全性 里,找到 辅助功能
- 确保 RustDesk 的开关是打开的
如果权限已开还是黑屏
macOS 的权限缓存有时会卡住。在 Mac 终端执行:
bash
tccutil reset ScreenCapture com.carriez.RustDesk tccutil reset Accessibility com.carriez.RustDesk
然后重启 Mac,重新打开 RustDesk 授权。
测试结果
配置完成后,用 iPhone 连接 Mac:
| 环节 | 结果 |
|---|---|
| iPhone 输入 Mac ID | ✅ |
| 密码验证 | ✅ |
| 屏幕画面显示 | ✅ |
| 远程控制(鼠标/键盘) | ✅ |
用 iPhone 的 4G/5G 流量(不用 Wi-Fi)连接成功,说明不是只在局域网内可用。
踩坑记录
1. Docker 已安装时不要重复运行安装脚本
按 Ctrl+C 中止即可。
2. 云服务商安全组漏了 UDP 21116
这是最常见的连接失败原因。ufw 和云安全组是两层独立的防火墙。
3. Mac 客户端 Key 输入框被锁定
需要先点“解锁设置”并输入管理员密码。
4. iPhone 上没有预先的密码框
操作顺序是:输入 ID → 点击连接 → 弹出密码框。
5. macOS 屏幕录制权限
不授权的话,连接成功但只显示“等待画面”。授权后必须重启 RustDesk。
6. WebSocket 端口安全风险
21118 和 21119 是 Web 客户端端口,存在 IP 伪造风险。不用网页版的话建议关闭。
成本分析
| 项目 | 成本 |
|---|---|
| RustDesk 客户端 | 免费开源 |
| RustDesk 服务端 | 免费开源 |
| VPS | 已有,不增加成本 |
| 总计 | 0 元 |
当前状态
| 组件 | 状态 |
|---|---|
| hbbs / hbbr | ✅ VPS 上运行 |
| 防火墙 UDP/TCP | ✅ 已放行 |
| Mac 客户端 | ✅ 已配置 |
| iPhone 客户端 | ✅ 已配置 |
| 屏幕录制 + 辅助功能 | ✅ 已授权 |
| iPhone → Mac 控制 | ✅ 测试成功 |
可优化的方向
1. 设置固定密码
Mac 上的一次性密码每次重启都会变。在 设置 → 安全 里设一个固定密码,以后连接更方便。
2. 关闭 WebSocket 端口
如果不用网页版客户端,在 UFW 里关掉 21118/21119,减少攻击面。
3. 扩展到其他设备
同样的配置可以用于 Windows、Linux 设备,实现全平台远程控制。
4. 用域名替代 IP
给 VPS 绑定一个域名,客户端里填域名而不是 IP,IP 变更时不用重新配置。
一句话总结
在 VPS 上自建 RustDesk,用 iPhone 远程控制 MacBook,全程零成本。 最大的坑不在 Docker 部署,而在云服务商安全组的 UDP 端口和 macOS 的屏幕录制权限。
