☰
RustDesk自建远程桌面:3分钟搞定私有服务器与中继
2026/10/2 6:49:19 网站建设 项目流程

市面上的远程控制软件用了不少:要么免费版隔几分钟就弹收费提示,要么为了连一台办公室电脑买授权,要么注册登录之后总感觉数据过了一遍别人的服务器。直到我看到 GitHub 上那个狂揽 62.3k Star 的开源远程桌面项目——可以自己搭全套服务,客户端、中继、ID 注册全在掌握,3 分钟搞定一套自建远程桌面,商业软件的付费限制不存在了,隐私焦虑也基本归零。这篇文章就把我的搭建过程、原理理解和踩坑记录完整分享出来。

先说结论:这个项目是 RustDesk。62.3k Star 的量级在开源远程桌面领域是现象级的,它的思路很简单——服务端和客户端都开源,你可以用自己的云主机或者家里带公网 IP 的机器跑中继服务,所有连接流量都走自己的服务器,不经过任何第三方。下面从为什么选它、原理怎么拆、3 分钟怎么搭、怎么调优、常见坑怎么排,一条条讲清楚。

1. 为什么一个开源项目能有 62.3k Star

1.1 远程桌面市场的现状与痛点

传统远程桌面软件的问题,用户感受最直接的有三个。

第一个是免费版限制越来越狠。TeamViewer 和 AnyDesk 这类商业工具,个人免费版在商业用途判定上很严格,连接时长、会话次数、被控设备数量都可能被卡,我用的时候最烦的就是正开着会突然弹"疑似商业用途"的窗,直接断连,毫无征兆。对于个人用户、小团队、开源爱好者来说,这种限制非常劝退。

第二个是数据路径不可控。商业方案的所有连接信令、控制流量、文件传输日志默认都经过官方服务器。官方说不留存内容,但你的设备列表、IP 地址、在线状态、使用时间段它都看得到。这种“平台代管”的模式对注重隐私的人就是硬伤。

第三个是授权和协议不确定性。商业软件收购、改版、涨价、改隐私政策,用户没有议价权。连自己几十台机器都要将就厂商的脸色。这在真正的生产者眼里,属于不可控风险。

而自建的开源远程桌面把这三点全解决了:license 不存在,软件本身就有完整功能;流量走自己的服务器;代码全开放,就算哪天不想用了,数据、配置、部署方式全在自己手里,随时迁移。

1.2 自建方案的核心价值

自建远程桌面的本质是把“服务”和“数据”的控制权从平台收回到自己手里。我实际用了几个月之后,感受最深的几个点:

  • 隐私边界清晰:所有数据包都经过自己的中继服务器,信令服务器只负责设备注册和连接协商。以前那种“连接前先经过别人的握手服务器”的隐忧,直接消失。
  • 成本极低:跑一个轻量级中继服务,512MB 内存的云主机就够用,成本比商业授权的年费低一两个数量级。
  • 方案可复制:不管是给家里父母电脑装、给公司机房设备装,还是临时帮朋友远程处理问题,只要填上自己的服务器地址和密钥,就能接入同一套自建网络,完全脱离第三方平台。
  • 协议开放、可二次开发:RustDesk 的客户端和服务端分别用 Rust 和 Flutter 实现,会 Rust 的人可以直接改协议、改加密配置、接自己的鉴权,这对技术型用户的价值是商业软件给不了的。

1.3 Star 量背后的真实信号

GitHub 上 62.3k 的 Star,当然不能说明这个项目零缺陷,但至少代表了三件事:

  • 高关注度与活跃生态:持续增长的 Star 意味着大量个人开发者和企业在看、在测、在用。项目的高频 commit、活跃的 issue 讨论区,说明它不是一次性的玩具 demo,而是真正有人长期维护的工程产品。
  • 跨平台能力被广泛验证:Windows、macOS、Linux、iOS、Android、Web 客户端都覆盖,服务端支持 Docker 和 Linux 二进制,用户量大自然会把各种系统组合都测过。
  • 社区口碑背书:开源工具没有销售团队吹,Star 就是用户用脚投票。大量“在公司内网搭了一套”“用树莓派跑中继很稳”的讨论,让后来者心里有底。

2. 核心原理:远程桌面到底是怎么跑起来的

2.1 一条连接链路的完整旅程

很多人以为远程桌面就是“A 软件连 B 软件”这么简单。实际上,两台电脑之间大概率不知道对方在哪里,尤其是双方都在 NAT 后面时,要完成一次连接需要经过多个角色。

RustDesk 的架构里,核心角色有三个:

  • 客户端:发起连接的一方(主控端)和接受连接的一方(被控端);
  • ID/中继服务器(hbbs):负责注册设备 ID、维护在线状态、交换 NAT 信息、协商打洞路径;
  • 中继服务(hbbr):负责把数据流从一端转发到另一端,在双方无法直接打通时兜底。

一次完整的连接流程是这样的:

  1. 被控端启动客户端,向 ID 服务器(hbbs)注册自己的 ID 和当前网络信息,并维持心跳;
  2. 主控端发起连接请求,hbbs 告知主控端被控端的网络地址信息,同时通知被控端“有人要连你”;
  3. 双方尝试 UDP 打洞建立直连,成功后数据流点对点传输,不走中继;
  4. 打洞失败,hbbr 中继服务器介入,双方的数据流全部通过中继服务器转发。

这套分工很清楚:hbbs 只做“牵线搭桥”,不碰业务数据;hbbr 才是真正可能接触数据流的角色。所以自建时最应该保管好的就是你自己那台机器上的 hbbr,它决定了你的数据走哪条路。

2.2 NAT 穿透:为什么两台电脑能直接找到

两台电脑如果都在同一个局域网,连接自然很简单。问题在于大多数场景是跨互联网,双方都在家庭或公司路由器后面。路由器会把内网 IP 隐藏起来,对外只暴露一个公网 IP 加端口映射,这就是 NAT(网络地址转换)。

NAT 穿透的关键是“猜测”对方路由器的映射规律。RustDesk 的 hbbs 会先让双方做一个 NAT 类型检测——用自己的服务器触发客户端发送探测包,通过观察源地址和端口的变化,判断是完整的圆锥型 NAT、受限圆锥型 NAT、还是对称型 NAT:

  • 圆锥型 NAT(Full Cone):一旦内网主机向外发过包,外部任何人使用那个公网 IP:端口就能访问回来,打洞最顺利;
  • 受限圆锥型(Restricted Cone):必须等内网先发给特定外部地址,对方才能打进来,增加一点协商难度;
  • 对称型 NAT(Symmetric):每次会话都分配新的公网端口,双方无法靠常规打洞直接通信,大概率只能走中继。

实际打洞的过程有点像“双方互相向对方可能的外网端口同时发 UDP 包”,一边猜一边堵,堵上了就能直连。这就是为什么有时候远程连接画质很好、延迟很低,而有时候突然卡顿——前者大概率是打洞成功直连了,后者多半是中继转发或打洞失败后的兜底链路。

注意,IPv6 环境下打洞要容易得多,因为 IPv6 地址几乎没有 NAT 私有化的问题。如果双方都是 IPv6 网络,直连成功率会显著提升。

2.3 密钥机制:一句话讲清安全模型

RustDesk 的安全模型核心在密钥(Key)。

部署服务端时,目录下会生成两把加密相关的密钥文件。客户端连接时必须与服务端密钥匹配,这个 Key 相当于“门禁卡”,它确保只有携带正确密钥的客户端才能注册到你的 ID 服务器、使用你的中继服务器。

更细一点说,连接过程中 RustDesk 还采用端到端加密,也就是主控端和被控端之间的会话内容是加密的,就算数据包被截获也没法直接解出来。这个特性意味着就算你用的是公共服务器、或者被控端在弱网环境走了中继,数据内容本身对服务端不透明。

所以自建时有两件事必须做好:

  • 密钥文件要备份:重新部署服务器时如果没有原密钥文件,客户端全部要重配,我之前就吃过这个亏,后面细说;
  • 不要把服务端默认生成的 Key 当摆设:公共服务器用不了这个 Key,但自己搭了就必须填,不然客户端连接时会因为密钥不匹配被拒绝。

3. 3 分钟自建:从零到可用实操

3.1 准备工作

先明确一件事:你需要一台可以被互联网访问到的机器作为服务器。这台机器不一定很贵,但必须有公网 IP,或者在路由器上做了有效端口映射。

我用过的几种方案:

场景服务器选择优缺点
有云主机阿里云/腾讯云/Vultr 等轻量应用服务器,最低 1C1G 即可公网 IP 固定,带宽可控,适合长期稳定使用
有公网 IP 的家庭宽带路由器做 DDNS + 端口映射免费,但宽带 IP 可能会变,需要动态域名兜底
有闲置小主机树莓派/NUC 装 Linux低功耗,内存足够,但同样受限于网络上联带宽

服务器系统我建议直接用Ubuntu 22.04 LTS,生态最全,文章里的命令都是基于这个写的。Windows Server 也能跑服务端,但是 Linux 部署更轻、更稳、更适合无头运行。

端口方面需要提前弄清楚,RustDesk 服务端默认占用这几个:

  • 21115:TCP 和 UDP,用于 NAT 类型检测;
  • 21116:TCP 和 UDP,用于客户端 ID 注册、心跳和打洞协商;
  • 21117:TCP,用于中继服务器转发数据流;
  • 21118/21119:Web 客户端的相关端口,按需开启。

如果我是在云主机上搭,第一步就是去控制台的安全组把以上端口加到放行规则里。这是我踩过最普遍的坑——服务端日志显示一切正常,但客户端永远连不上,十有八九是安全组没放行。

3.2 Docker 部署(推荐)

RustDesk 官方提供 Docker 镜像,这是所有部署方式里最快、最省事的一条路。只要服务器装了 Docker,三行命令就能把服务拉起来。

docker run --name rustdesk-server \ --net host \ -e "RELAY=你的服务器公网IP或域名" \ -v /etc/rustdesk:/data \ -d rustdesk/rustdesk-server:latest

解释几个参数:

  • --net host:让容器直接使用宿主机网络,避免再手动做端口映射。这是最省心的方式;
  • -e RELAY:告诉服务端中继服务器的对外地址,客户端用它来连接中继;
  • -v /etc/rustdesk:/data:把运行产生的密钥、配置持久化到宿主机。这个很重要,容器重建后密钥不会丢。

启动后可以看下日志:

docker logs -f rustdesk-server

正常的输出会显示 hbbs 和 hbbr 两个进程都在监听,并且会打印出公钥、私钥的相关信息。看到日志里有公钥指纹输出,基本就成了。

3.3 二进制部署(不用 Docker 时)

有些机器装不了 Docker,或者你想把资源占用压到最低,直接用二进制也完全没问题。

# 下载服务端程序,这里以 Linux x86_64 为例 wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.10/rustdesk-server-linux-amd64.zip unzip rustdesk-server-linux-amd64.zip cd amd64 # 运行 ID/中继服务器,并指定中继地址为公网 IP ./hbbs -r 你的服务器公网IP或域名 & ./hbbr &

两条命令分别对应 hbbs 和 hbbr 两个进程。加上-r参数是为了让 hbbs 在告诉客户端“去哪里找中继”时,带上正确的地址。

跑起来后用ss -lntup验证一下:

ss -lntup | grep -E '21115|21116|21117'

如果 21116 的 TCP/UDP 和 21117 都处于监听状态,服务端就绪。

这里有个细节:Ubuntu 22.04 上如果遇到端口被占用或防火墙拦截,可以用sudo ufw allow 21115:21119/tcp && sudo ufw allow 21116/udp来放行。我遇到过一台机器上 ufw 默认规则把端口全挡了,导致日志正常但外部连不进来,排查半天才找到原因。

3.4 客户端 3 分钟配置

服务端起来之后,剩下的就是客户端操作。下面以 Windows 客户端为例:

  1. 下载对应系统的 RustDesk 客户端(从项目 Release 页下载最新版);
  2. 安装后打开客户端主界面,左侧会显示本机 ID 和临时密码——这个 ID 就是被控端的唯一标识;
  3. 点击右上角“三个点”菜单 → “设置” → “网络”,找到 ID 服务器和中继服务器两个输入框;
  4. ID 服务器填写你的服务器公网 IP 或域名,中继服务器填写同一地址;
  5. 输入 Key(密钥)——这个 Key 可以从 Docker 容器的日志里看,或者看服务端目录下生成的public_key文件;
  6. 保存后,看左下角状态是否从“就绪”变成“就绪(已连接)”之类表示注册成功的状态。

这里非常关键的一点:主控端和被控端都要填服务器信息。只在一端填是没用的。两端的 ID 服务器、密钥必须完全一致,否则会提示密钥不匹配。

填完之后,在主控端输入被控端的 ID,点击连接,输入被控端密码就能进入桌面。整个过程真正手速快一点,3 分钟确实够。

如果你的服务器有域名,直接用域名最好,比公网 IP 稳定,IP 变了不用改客户端配置。

4. 进阶优化:让自建远程桌面更好用

4.1 安全加固三板斧

服务器搭好只是第一步,真正面向公网使用,安全不能裸奔。我自己用下来总结了三个基础且重要的加固手段。

第一,开启访问密码确认。客户端设置里有“允许连接请求密码确认”之类的选项,连接时必须由被控端再次确认才能进入桌面。这个功能非常适合个人远程协助场景,能有效防止别人拿到 ID 后偷偷连入。

第二,使用强密钥并妥善备份。自建服务器的 Key 是安全模型的核心,我强烈建议把public_key和私有密钥文件都下载保存到本地离线位置。之前我重置过一台云主机,忘记备份密钥,结果所有已经装了客户端的机器全部要重新填入新 Key,体验极其痛苦。

第三,关闭不必要的中继端口。如果确认自己的网络环境打洞成功率很高,可以不把 21117 暴露到公网;但一般情况下保留中继作为兜底更稳妥。要注意的是,中继会承载所有打洞失败的流量,如果你的腾讯云主机是 1M 小水管带宽,还要评估中继带来的带宽压力。

4.2 带宽与画质调优

远程桌面的体验主要由两个参数决定:延迟和画质。延迟受网络链路影响大,画质则和客户端设置直接相关。

在 RustDesk 客户端的显示设置里,有几个关键的调整项:

  • 分辨率:默认“匹配被控端分辨率”在跨网络时往往带宽不够,建议设置为 1280x720 或 1920x1080,根据实际带宽选择;
  • 帧率:默认 30fps,如果带宽紧张或画面变化不频繁(比如只写代码、看文档),可以降到 15fps 甚至 10fps,流畅度感知差距不大,但带宽占用会明显下降;
  • H.264 硬件编码:如果设备支持,打开硬件编码能大幅降低 CPU 占用、提高编码速度,画面更流畅;
  • 音频:不需要听对方电脑声音时,直接关闭音频传输,省下的带宽很可观。

实际经验是:跨运营商网络时,优先保证 1280x720 + 15fps,这是流畅度和带宽的黄金平衡点。局域网环境则可以直接拉满画质。

4.3 刷新率提升与流畅度体验

搜索里很多人问“RDP 远程桌面刷新率怎么提高”,Windows 自带的 RDP 在刷新率上限制明显,某些场景下鼠标拖动画布就是觉得飘。RustDesk 的优化思路不一样,它更像“视频直播”式画面传输。

我实测下来,影响流畅度最大的因素是是否走了中继。直连状态下(双方打洞成功),画质、延迟、刷新率都很理想,4K 屏幕缩放拖动也基本没有撕裂感。但一旦走了中继,尤其是云主机带宽只有 1-2Mbps 时,刷新率会明显降到 10fps 以下,表现为画面一卡一卡。

所以提升刷新率最有效的手段是让连接尽量直连,方法是:

  • 确保两端网络类型不是对称型 NAT(比如手机热点在部分运营商下就是对称型);
  • 检查 21116 UDP 端口是否畅通,UDP 封禁是打洞失败最常见的原因;
  • 优先选择双方都在同一运营商网络下测试。

另一个技巧是使用TCP 模式:RustDesk 客户端支持下层协议选择,有时 UDP 被运营商 QoS 后,手动切换到 TCP 反而更稳定。这个要靠实际环境测,不要盲改。

4.4 Windows 家庭版的救星

Windows 家庭版默认不带 RDP 服务端,想远程家里人电脑,传统思路是装第三方服务或者用 RDPWrap 这类修改系统组件的偏门方案。RDPWrap 需要替换系统文件,一更新可能就失效,风险不低。

RustDesk 完全没有这个问题——它就是普通应用软件,不需要改系统文件,也不需要系统有 RDP 授权服务器。Windows 家庭版、专业版、Server 版都能直接跑,不存在“远程桌面授权服务器没有许可证”这类报错。

这也是我在家庭场景里最推荐它的原因:给父母电脑装一个,我这边填好服务器信息,任何时候都能看到他们的屏幕,帮他们解决操作问题。不用折腾系统组件,也不用付费申请授权。

5. 常见问题与排查技巧实录

5.1 连不上:先看这 5 个地方

我把实际遇到过的“连不上”问题以及排查顺序整理成了表,按这个顺序查,大概率能解决 90% 的问题:

现象可能原因处理方式
客户端状态“未连接”,ID 服务器填完无反应21116 端口未放行检查云主机安全组、宿主机防火墙、ufw 规则
连接时提示“密钥不匹配”主控端与被控端 Key 不一致两端重新填入服务端公钥,确认一致
ID 填了服务器地址,状态仍然“就绪”但不显示已连接hbbs 进程没起来或地址填错服务端查看进程是否监听 21116,确认地址为公网 IP 而非内网 IP
能连上但画面黑屏被控端显卡驱动异常或客户端未登录系统检查被控端显示设置,确认系统未锁屏
有时能连有时不能打洞失败且中继端口 21117 未放行确保 21117 也已放行,作为兜底链路

5.2 打洞失败、全部走中继的问题

判断打洞失败的依据很简单:连接建立后,打开客户端的连接信息面板,如果显示 L=中继(relay)而不是直连(direct),说明数据流正在过服务器中转。

这种情况最明显的体验是:画面马赛克、声音卡顿、延迟高,而且云主机带宽一小就彻底卡死。对策有三步:

  1. 检查 21116 UDP 端口:很多云平台安全组默认只放行 TCP,UDP 容易被忽略。RustDesk 打洞协商全靠 UDP,没有它就只能中继;
  2. 两端尽量使用同一运营商的网络测试,跨运营商打洞成功率会低一些;
  3. 如果双方都有 IPv6,优先使用 IPv6 地址直连,没有 NAT 问题,中继几乎用不上。

5.3 服务端和客户端版本不匹配

这个坑很不显眼但非常真实。RustDesk 的客户端迭代很快,服务端如果停在老版本,新客户端的某些握手协议可能不兼容,表现就是连接后白屏、闪退、或者一直转圈。

我的建议是:客户端和服务端尽量拉同一大版本。要么都紧跟最新 Release,要么干脆锁定一个稳定版本长期使用。个人使用场景没有必要频繁升级服务端,除非是想体验新功能。在 Docker 部署时,把镜像 tag 固定成具体版本,避免latest悄悄变了导致客户端失联。

5.4 网页端和其他杂项问题速查

除了桌面客户端,RustDesk 还提供 Web 客户端,可以从浏览器直接发起远程连接。很多人第一次搭服务端时会去访问http://服务器IP,结果发现打不开,误以为部署失败。

实际上 Web 客户端也是通过客户端软件拉起的,服务端本身不提供标准的 HTTP 网页托管。想用网页远程控制,需要额外做 Web 客户端部署和配置,这超出基础使用范围了,不是必须项。如果只是手机临时控电脑,装 Android/iOS 客户端就行,体验比网页版稳定得多。

另外有人会遇到 Ubuntu 系统设置里打开“远程桌面”就卡死,这通常是 GNOME 自带的远程桌面功能和 RustDesk 同时操作显示服务造成的冲突。解决方法是直接在系统的“软件”里禁用 GNOME 自带的远程桌面功能,只用 RustDesk 一家,别让两个远程方案抢占同一个显示回话。

6. 写在最后的一些实际体会

从第一次跑通到现在,这套自建方案已经稳定运行了几个月。最直接的好处是:所有设备都编入了自己服务器的管辖范围,任何一台连不上直接看服务端日志就能定位。相比以前用商业软件黑盒排查,这种“一切尽在掌握”的感觉确实很值。

我个人建议第一次搭的时候一定要做的三件事:一是确认端口全放行,二是备份密钥文件,三是固定服务端版本。做到这三点,这套远程桌面基本就可以长期甩手不管了。

如果之后想扩展,可以研究的方向是:给服务端配 HTTPS 域名、接自己的身份认证体系、用 Docker Compose 管理服务编排。不过在那之前,建议先把基础的自建链路摸透,再考虑网页端和移动端。希望这篇分享能帮你少走点弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询