自建 RustDesk 服务器(基本步骤)
一、环境和目标效果
- 设备列表
- Android平板(控制端)
- Windows电脑(被控制端)
- Ubuntu云服务器(中转服务器)
- 目标效果:使用自己的云服务器搭建一个私有远程控制枢纽,Android通过它找到Windows并实现远程控制(当然只要知道了目标客户端的ID,就可以进行控制,下面的搭建过程则是以Android控制Windows场景为例),数据协调和中继都走自己的云服务器,而不再依赖官方服务器
二、搭建过程
第一步:云服务器(中转服务器)上安装RustDesk服务端
说明:RustDesk服务端包含两个核心组件
组件 作用 默认端口 hbbs ID注册服务器,负责设备注册和连接协商 TCP:21115、21116、21118
UDP:21116hbbr 中继转发服务器,当P2P直连失败时负责转发流量 TCP:21117 安装方式一:通过 Docker 安装(推荐)
检查/安装 Docker
下载 RustDesk 服务端编排文件并启动
shell# 创建并进入专用目录,便于后续管理 sudo mkdir -p /opt/rustdesk && cd /opt/rustdesk # 下载官方提供的 OSS(开源版)Docker Compose 配置文件 sudo wget rustdesk.com/oss.yml -O compose.yml # 以后台模式启动 hbbs 和 hbbr 两个容器 sudo docker compose up -d
安装方式二:原生安装
shell# 该脚本会自动下载 hbbs 和 hbbr,并创建 systemd 服务实现开机自启 sudo wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh sudo chmod +x install.sh ./install.sh
第二步:获取hbbs首次运行时自动生成的公钥(这个公钥是客户端之间建立加密连接所必需的)
如果是通过 Docker 安装
shellcat /opt/rustdesk/data/id_ed25519.pub如果是通过 原生 安装
shellcat /var/lib/rustdesk-server/id_ed25519.pub # 或 cat /opt/rustdesk/id_ed25519.pub上述命令效果:终端会输出一串 Base64 编码的字符串,如下,下面内容中的 vN3xKq8mZ2pL9wR5tY7uI1oP4aS6dF8gH0jK2lM= 就是生成的公钥,找个地方保存一下(注意:公钥文件在 hbbs 首次启动后才会生成,可能需要等待,如果文件不存在,稍等片刻后再重试)
texzhanghl@VM-24-16-ubuntu:/opt/rustdesk$ cat /opt/rustdesk/data/id_ed25519.pub vN3xKq8mZ2pL9wR5tY7uI1oP4aS6dF8gH0jK2lM=zhanghl@VM-24-16-ubuntu:/opt/rustdesk$
第三步:配置云服务器安全组放行端口
目标:允许外部流量通过 RustDesk 所需端口访问服务器
添加的安全组规则
协议 授权对象 端口 说明 TCP 全部IPv4地址(0.0.0.0/0)21115NAT类型测试 TCP 全部IPv4地址(0.0.0.0/0)21116信令/连接服务 UDP 全部IPv4地址(0.0.0.0/0)21116必须同时放行 UDP TCP 全部IPv4地址(0.0.0.0/0)21117中继转发服务
第四步:配置客户端(Android 和 Windows)
目标:让 Android手机 和 Windows电脑 通过云服务器进行连接
操作步骤(两端操作完全一致)
在 Android 和 Windows 上分别下载 RustDesk 客户端(官网下载地址 或 Github release 地址),下载最新版即可
这里要单独说一下,Windows 上下载.exe文件并双击打开后,并不意味着可以使用所有的功能了,需要点击左下角的安装按钮进行实际的安装,否则后续解锁网络设置等等功能都无法使用!!!

解锁网络设置:点击主界面 ID 旁边的菜单按钮 ⋮ → 选择 网络


解锁网络设置后,点击 ID/中继服务器 选项,填入下面两项内容(中继服务器 和 API服务器 两个字段可以留空,RustDesk 会自动推导),确认后,在首页底部状态栏会显示 “就绪” 或类似绿点标识。如果显示 “未就绪”,请检查公钥是否正确、安全组端口是否放行



Windows电脑设置一个固定的连接密码:点击主界面 ID 旁边的菜单按钮 ⋮ → 选择 安全 → 解锁安全设置 → 切换使用固定密码并设置

测试连接:Android端输入远程Windows端的ID,并输入密码,就可以连接上了

三、使用建议:网络波动时,控制端勾选 ”强制走中继连接“
背景知识
自建中继服务器的作用:“兜底” 和 “替代官方中继服务器”
RustDesk 默认的连接策略: P2P直连优先,中继服务器兜底
维度 P2P 直连 中继 理想条件下网络延迟 最低(双方直连 RTT) 稍高(控制端和被控制双方到中继 RTT 之和) 网络波动时的连接稳定性 差,容易卡顿/断连 好,TCP 保障 带宽消耗 零服务器带宽 全部画面数据经过服务器 对服务器依赖 无 中继服务器不可用时完全无法连接 画质上限 取决于两端宽带 取决于中继服务器上行带宽 控制端与被控制端连接过程解释:RustDesk控制端默认是不勾选 强制走中继 这个选项的,所以控制端和被控制端在建立连接的时候默认是 P2P(因为 P2P 在理想条件下确实是更优的,服务器带宽消耗为0、服务器负载为0、双方直连延迟更低),但是架不住有时候网络波动不稳定,导致 P2P 连接不稳定,会陷入 “卡顿 → 连接中断 → 自动重连” 的循环(我在雨天尝试远控的时候就出现了这种情况,在勾选了 强制走中继连接 选项后,问题得到了解决)


基于上面的背景知识,对 P2P 和 中继服务器 的选择场景参考如下:
场景 P2P 表现 中继表现 谁更好 双方网络稳定、延迟低 极佳 稍差(多一跳) P2P 一方或双方网络波动大、丢包严重 卡顿、花屏、频繁重连 稳定,TCP 自动重传 中继 对称 NAT / 防火墙封 UDP 打洞失败,无法连接 正常连接 中继(唯一选择) 移动网络(4G/5G)下使用 基站切换导致断连 相对稳定 中继 追求最低延迟(如游戏、高频操作) 更低 稍高 P2P 隐私要求高,不希望数据经过第三方 不经过服务器 经过自建服务器(可控) 看需求
自建 RustDesk 服务器(更安全的做法)
一、适用前提与加固目标
本节接续前面的“基本步骤”:Ubuntu 云服务器已经运行 OSS(开源版)的 hbbs、hbbr,Android 与 Windows 已能连接。下面继续使用这套服务,在现有配置上补充密钥校验、端口限制和客户端访问控制。
以下命令以 Docker 安装方式为例,沿用 /opt/rustdesk/compose.yml、./data:/root 数据挂载和 network_mode: "host"。若前文选择了原生安装,应使用原服务的数据目录和启动配置,不能直接照抄 Compose 命令。
先明确三个不同的安全环节:
| 项目 | 作用 |
|---|---|
服务端公钥 id_ed25519.pub | 供客户端校验服务端签名、建立可信的加密连接;也用于下文的 Key 匹配校验 |
| 被控制端的连接密码或人工确认 | 决定是否允许访问这台 Windows 电脑;知道设备 ID 并不等于获得控制权限 |
| 安全组、防火墙或私有网络 | 限制哪些网络来源能够访问 hbbs、hbbr |
**公钥不是保密的访问口令,-k _ 也不是设备白名单。**持有正确公钥的其他人仍可能使用服务端,因此不能把“自建 + 填写 Key”理解成“只有自己的设备才能使用”。
二、备份现有配置和密钥
在没有远程会话的维护时间执行以下命令。备份时短暂停止两个服务,避免直接复制正在写入的数据库:
cd /opt/rustdesk
sudo install -d -m 700 /opt/rustdesk-backups
sudo docker compose stop hbbs hbbr &&
sudo tar -czf "/opt/rustdesk-backups/rustdesk-$(date +%Y%m%d-%H%M%S).tar.gz" -C /opt rustdesk
sudo docker compose start hbbs hbbr确认备份成功、服务恢复后再继续。备份中包含 compose.yml 和 data,应限制备份文件的访问权限。
data/id_ed25519是私钥,保留在服务端,不发送给客户端、不上传公开仓库;文件权限应只授予实际运行服务的用户及必要的管理员。data/id_ed25519.pub是公钥,客户端填写的是它的完整内容。- 沿用现有数据挂载和密钥,避免误用空目录导致生成新的密钥。更换密钥后,客户端原来的 Key 将不再匹配。
三、让 hbbs 和 hbbr 都校验 Key
先查看实际运行的版本:
cd /opt/rustdesk
sudo docker compose exec hbbs hbbs --version
sudo docker compose exec hbbr hbbr --version以 OSS 1.1.16 源码为例,hbbs 的 Key 参数默认使用已有密钥;hbbr 在没有指定 -k 或 KEY 环境变量时,默认不进行同样的 Key 匹配校验。因此不能因为客户端已经填写公钥,就认为两个服务都限制了未携带正确 Key 的连接请求。参见 hbbs 启动参数、hbbr 启动参数。
编辑现有的 /opt/rustdesk/compose.yml,为两个服务的启动命令明确添加 -k _:
# 仅展示需要修改的 command 字段,不是完整的 compose.yml
services:
hbbs:
command: hbbs -k _
hbbr:
command: hbbr -k _**只修改对应的启动参数,保留原有 image、volumes、network_mode 等配置。**如果 hbbs 原来已经带有 -r 等参数,应保留它们再补充 -k _;如果已有 -k,应调整原参数,避免重复添加。
这里的 _ 是程序约定的特殊值:从工作目录中的现有私钥取得对应公钥,用于检查客户端请求。前文的两个容器都挂载 ./data:/root,应继续共享同一套密钥。不能把 _ 填进客户端的“密钥”字段。具体行为参见 hbbr Key 校验与密钥读取源码。
检查配置,只有检查成功才应用:
cd /opt/rustdesk
sudo docker compose config -q && sudo docker compose up -d hbbs hbbr
sudo docker compose ps
sudo docker compose logs --tail=50 hbbs hbbr修改 Compose 的启动参数后应执行 up -d,仅执行 restart 不会应用新的容器配置。确认两个服务正常运行,且使用原来的公钥。原生安装则需要在已有 systemd 服务的启动命令中做相同调整,保留原工作目录;修改服务配置后执行 daemon-reload 并重启对应服务。
四、收紧云服务器的公网访问
对于本文的 Android、Windows 原生客户端,继续保留前文已经使用的端口:
| 协议 | 端口 | 用途 |
|---|---|---|
| TCP | 21115 | NAT 类型测试 |
| TCP | 21116 | 连接协商与 TCP 打洞 |
| UDP | 21116 | ID 注册与心跳 |
| TCP | 21117 | hbbr 中继转发 |
**不能为了“只开放 443”而关闭这些原生端口,尤其不能关闭 UDP 21116。**本场景无需开放 Pro Web 控制台使用的 TCP 21114,也无需开放 Web 客户端使用的 TCP 21118、21119;若之前额外放行过,应移除这些不需要的公网规则。端口用途见官方 OSS Docker 文档。
按实际网络条件调整前文的 0.0.0.0/0 规则:
- 两端都有固定公网出口 IP:将上述四项规则的来源限制为 Android 和 Windows 所在网络的出口 IP(单个 IPv4 地址使用
/32)。不能只放行控制端,被控制端同样需要注册和连接中继。 - Android 经常切换 Wi-Fi、移动网络,或家庭公网 IP 会变化:不要把当前临时 IP 当成长期白名单,否则换网后会无法连接。需要随时从这些网络接入时,可以保留必要端口的公网访问,并依靠 Key 校验和被控端认证;这仍属于公网服务。
- 要求只有自己的设备能够访问服务端:需另行建立有设备认证的 VPN / 私有网络,确认两端通过该网络完成注册和中继后,再关闭原生端口的公网入口。单靠域名或公钥不能实现这一要求。
新增窄范围规则后,还应检查所有关联安全组中是否仍存在 0.0.0.0/0 的同端口或全端口放行规则;这些宽范围规则会使来源限制失效。服务器启用公网 IPv6 时,也要检查 ::/0 等 IPv6 规则。SSH 和其他业务端口按原用途单独保留。
前文官方 Compose 使用主机网络,服务直接在宿主机监听,应同时检查云安全组及现有主机防火墙。若自行改成 Docker 桥接网络并发布端口,不能仅凭 ufw status 判断访问已受限,Docker 发布的流量可能绕过 UFW 的常规规则。参见 Docker 防火墙说明。
五、复核客户端与被控端权限
Android 和 Windows 的“ID/中继服务器”继续采用 OSS 原生连接配置:
| 字段 / 选项 | 设置 |
|---|---|
| ID 服务器 | 原来的云服务器公网 IP,或直接解析到该 IP 的域名;默认端口不需要另填 |
| 中继服务器 | 同机、默认端口部署可继续留空;需要显式指定时,填写同一服务器的地址及 :21117 |
| API 服务器 | 留空,OSS 不提供 Pro 的账户 / 管理 API |
| 密钥(Key) | 现有 id_ed25519.pub 的完整内容 |
| 使用 WebSocket | 关闭 |
| 禁用 UDP | 保持关闭(如果客户端提供此选项) |
其中 API 留空的原因是 OSS 不使用这项 API,不是客户端会自动推导出一个可用的 OSS API 地址。客户端基本字段说明见官方客户端配置文档。
如需把 IP 换成域名,可以将 rustdesk.qnmdmyy.top 的 DNS A 记录指向原服务器公网 IP,再在客户端填写域名;这只是地址管理方式的变化。原生连接无需添加 https://、申请网站证书或配置 Nginx HTTP 反向代理。
在 Windows 被控制端进一步调整安全设置:
- 无人值守时,设置独立、足够长的随机固定密码,并选择只使用固定密码,避免仍允许较短的临时密码连接。
- 有人在电脑旁时,可按需要采用人工确认连接;不要把“密码或点击确认”误认为必须同时满足密码和人工确认。
- 在权限中关闭不需要的文件传输、剪贴板同步、TCP 隧道等功能,只保留实际需要的控制权限。
密码验证方式与权限选项见官方安全设置说明。
六、验证加固后的连接
- 两端核对 ID 服务器和公钥,确认状态就绪,再从 Android 输入 Windows 的 ID 和连接密码,实际检查画面及输入是否正常。“就绪”只表示注册 / 心跳等基本状态,不能单独证明 Key 校验和远程访问认证全部通过。
- 单独测试一次中继:在目标 ID 后临时添加
/r发起连接,例如123456789/r(替换为实际 ID),并确认会话显示为中继连接。这样可以发现 hbbr 端口或 Key 配置问题;只测到 P2P 直连不足以验证 hbbr。测试后去掉/r恢复正常连接方式。参见官方强制中继说明。 - 收紧安全组后,用两端实际会使用的网络重新连接;设置了固定来源限制时,还应从未获准的外部网络确认这些入口不可访问。服务器本机的监听状态不能证明公网访问规则有效。
- 后续更新客户端或服务端时,先备份配置和数据,再查阅对应版本说明并重复上述连接测试。本文关于默认 Key 行为的核对基于 OSS 1.1.16,不能仅凭镜像名中的
latest判断正在运行的版本。
本节采用 OSS 的原生协议完成加固。官方“所有平台通过 WebSocket 接入”的方案要求客户端 ≥ 1.4.0、Pro 服务端 ≥ 1.5.7,属于另一种部署方案,不能直接套到前文 OSS 服务上再关闭原生端口。参见官方 WebSocket 适用条件。
RustDesk 画质模糊及优化点
一、问题现象与原因
现象:在使用 RustDesk 进行远程桌面连接时,会存在画面模糊、文字不清晰,尤其在高分辨率显示器(如4K)环境下更为明显,问题通常表现为:
- 文本边缘锯齿严重,难以阅读
- 图标和界面元素出现模糊或重影
- 高DPI缩放后内容失真
- 动态画面有块状压缩痕迹
原因:RustDesk默认采用的视频编码策略偏向于 带宽节省,而非视觉保真度,也就是说,RustDesk 在带宽有限(尤其是走中继服务器时)触发的自适应降质机制,滚动或播放视频时,需要传输的数据量骤增,编码器为了不卡顿,优先急剧降低画质压缩数据量,等画面重新静止,码率需求降下来,画质才慢慢恢复清晰,所以走自建中继服务器这种情况下,上行带宽瓶颈很可能是核心原因
解决方式(控制端方)
将图像质量改成“自定义”,手动拉高码率和调整帧率
RustDesk 默认的“平衡”模式码率上限较低。进入 设置 → 显示 → 默认图像质量,改为 自定义,然后将 码率(Bitrate)拉到 100%,帧率调到 60 FPS 或更高
注意:码率设置可能需要重新连接才能生效。100% 意味着不人为限制编码器输出,让它在你的网络带宽允许范围内尽可能输出高质量画面
切换编码器:优先尝试 AV1,其次 VP9
进入 设置 → 显示 → 默认编解码器,优先选择 AV1。如果你的显卡不支持 AV1,次选 VP9。如果 VP9 也出现色块或模糊,可以退回 VP8 试试
注意:控制端设置的编码器,被控制端显卡或CPU必须支持该编码器,否则选项为灰色或自动回退
编码器 动态画面表现 带宽效率 硬件要求 AV1 最佳,快速滚动时文字不糊 最高 较新 GPU,CPU 也可软编 VP9 较好,但部分场景有模糊或色块 较高 软件编码,CPU 占用高 H.264/H.265 一般,动态场景文字易产生压缩伪影 中 硬件加速支持最广泛 VP8 较差,带宽消耗大 低 兼容性最好 在控制端的显示菜单调整分辨率
如果被控制端是 2K 或 4K 屏幕,动态画面需要传输的数据量是 1080p 的 2~4 倍,所以在会话中,将分辨率降到 1920×1080,能在不改变画质设置的前提下大幅减少带宽压力(调整的分辨率实际上是被控制端的分辨率)
关闭音频和剪贴板同步(不建议,看个人需求)
在控制端的会话菜单里关闭音频、剪贴板同步,当然被控制端也可以关闭,进一步省带宽
解决方式(被控制端方)
开启硬件编码支持(两端都建议开,但是侧重点不同)
被控制端开硬件编码,负责把屏幕画面压成视频;
控制端开硬件编码,负责把视频解出来显示;
性能检查
被控制端的 CPU、GPU 和网络带宽不能成为瓶颈
解决方式(中继服务器方)
检查云服务器的上行带宽并提升
服务器的上行带宽就是画面传输硬上限,所以如果带宽不够,尝试升级套餐或改成按量付费
优化中继路径
把
hbbr部署到离两端更近、带宽更大的服务器。hbbs可以继续留在原阿里云,只要密钥一致
RustDesk 设置开机自启动
按
Win + R,输入:tex# 为当前用户设置开机自启动 shell:startup # 为所有用户设置开机自启动(需要管理员权限) shell:common startup把该应用的 快捷方式 复制/拖进去
RustDesk 控制端(Android)切屏后需重连的问题解决方案
一、原因
Android 系统(尤其是国产定制系统)为了省电,会严格限制应用在后台的活动。当你把 RustDesk 切到后台时:
- 系统冻结或杀死进程:系统可能很快将 RustDesk 的进程冻结,甚至直接关闭,导致它与被控端的连接中断。
- 网络连接被切断:系统可能会切断应用的后台网络连接,以节省电量。
- “省电模式”或“电池优化”:这些系统功能会主动限制后台应用的活动,导致连接无法维持。
二、解决方案
- 关闭电池优化:进入手机
设置 → 应用 → RustDesk → 电池,将电池策略设置为 “无限制” 或 “不受限制”(不同品牌叫法可能略有不同)。 - 锁定后台:在手机的多任务界面(最近任务),找到 RustDesk,通常可以通过下拉或长按来 “锁定” 该应用,防止被一键清理。
- 开启自启动:在应用权限设置中,允许 RustDesk “自启动”。
- 允许后台活动:在应用权限中,确保允许 RustDesk “在后台运行”。
- 关闭省电模式:在不需要时,关闭手机的 “省电模式”。
三、注意事项
- 即使完成了上述所有设置,在某些系统(如 MIUI、澎湃 OS、荣耀等)上,RustDesk 的后台存活率依然可能不高,这是系统层面的限制导致的。所以修改的上述设置只是尽可能延长它在后台的存活时间,减少重连的频率。