在 VPS 上自建 RustDesk 远程桌面:从部署到用 iPhone 控制 MacBook

起因

我经常需要在外面用 iPhone 查看 MacBook 上的东西。市面上的远程桌面方案要么收费,要么数据经过第三方服务器。

RustDesk 是一个开源远程桌面工具,支持自建服务端。它的架构很清晰:

组件作用
hbbsID 服务器,负责设备注册和握手
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 需要以下端口:

协议端口用途
TCP21114-21119信令 + 中继
UDP21116ID 注册(关键)

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 的输入框默认是灰色锁定的。你需要:

  1. 点击页面上的 “解锁设置” 按钮
  2. 输入 Mac 的管理员密码
  3. Key 的输入框才会出现

填入配置

字段
ID Server你的VPS公网IP
Relay Server留空
API Server留空
Key刚才 cat 出来的公钥

关键点:免费开源版只需要填 ID ServerKey。Relay Server 和 API Server 是 Pro 版功能,留空即可,RustDesk 会自动推导中继地址。

保存后,RustDesk 主界面底部应该显示 “就绪”

第五步:配置 iPhone 客户端

在 iPhone 的 RustDesk App 里,同样进入 设置 → 网络,填入和 Mac 一样的 ID Server 和 Key。

⚠️ 踩坑:iPhone 上没有预先的密码输入框

iPhone 作为控制端,界面逻辑和 Mac 不同:

  1. 先在主界面输入 Mac 的 9 位 ID
  2. 点击连接
  3. 弹出密码框后,再填入 Mac 的密码

不是在连接前预先填密码,而是先连接、后弹密码

第六步:授权 macOS 权限(最关键)

iPhone 连接成功后,如果界面显示 “等待画面” 或黑屏,说明 Mac 没有把屏幕画面交给 RustDesk。

macOS 出于安全考虑,默认不允许任何应用录制屏幕。

开启屏幕录制权限

  1. 打开 Mac 的 系统设置 → 隐私与安全性 → 屏幕录制
  2. 找到 RustDesk,打开开关
  3. 系统提示“需要退出才能生效”,必须点击“退出并重新打开”

开启辅助功能权限

  1. 同样在 隐私与安全性 里,找到 辅助功能
  2. 确保 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 的屏幕录制权限。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注