公司办公室里临时要改家里服务器的配置,怎么远程都不顺,于是我干脆弄了一台公网VPS,把RustDesk的公网中继服务器架起来,专门用来远控家里那台常开的机器,顺便也能远控办公室里的内网机器。整套方案从头到尾跑通之后,家里、公司两台设备都能随时连上,延迟反而比之前用官方公共中转稳定不少。后来我又把这套自建服务器用到给客户做远程支持的小团队里,大家反馈也明显更好。如果你也在找一条稳定、免费、可自控的远控路线,这篇完整版实操应该能一次帮你把路上该踩的坑都趟干净。适合谁看?工作上有远程办公需求的人,家里有NAS和虚拟机需要维护的玩家,以及要给客户做远程技术支持的小团队。折腾这套东西不需要多深的网络知识,会SSH、会看几条Linux命令就行。
1. 项目概述与整体方案选型
1.1 为什么不用公共中转服务器,非要自建
RustDesk客户端默认连的是官方公共服务器,装完就能用,听起来确实省事。但用久了你会遇到两个很实际的麻烦:一是公共服务器在高峰期的连接质量不稳定,尤其跨网访问时,经常等半天还在转菊花;二是公共服务器不受你控制,远程操作的画面偶尔卡顿,很多时候只能干瞪眼。自建一台公网中继服务器之后,控制端和被控端之间的交互全部走自己的VPS,链路质量、并发数量、流量成本都掌握在自己手里。
自建还带来一个额外好处:能顺手把这套远程控制软件的工作原理吃透。RustDesk服务端分成两个核心组件,一个叫hbbs,负责ID注册、连接握手、NAT打洞协调;另一个叫hbbr,负责真正的桌面画面和操作指令转发。只有理解这两个进程的分工,后续排查问题时才能快速定位是“握手失败”还是“中继通道堵了”。我前后帮几个朋友搭过,他们遇到故障时对着日志一头雾水,就是因为完全不清楚这两个服务的边界。
1.2 流量路径与NAT打洞的完整过程
先说整体架构。被控端电脑开机后,RustDesk客户端会主动连接你指定的hbbs服务器,把当前机器唯一ID注册上去;控制端打开软件,同样连接这台hbbs,然后查询目标ID的网络位置。这时候RustDesk会尝试建立P2P直连通道,也就是业内常说的NAT打洞。原理可以粗线条理解:两端都主动向对方发UDP数据包,互相探测公网映射出来的地址端口。如果双方网络恰好支持,打洞成功,后续画面和操作根本不经过任何中继服务器,延迟最低,体验最好。
打洞失败才是需要公网中继服务器的场景。比如被控端处于多层NAT后面,或者路由器开了严格的对称NAT,P2P握手根本打不通。这时hbbs就把两端的流量切换到hbbr,由hbbr作为公网中继服务器,把被控端的画面包和鼠标键盘指令原样转发。理解这一层你才能明白:中继服务器的带宽就是你的体验上限,单路远程桌面至少需要稳定2Mbps,如果跑1080P全屏,最好给VPS配5Mbps以上的带宽。我之前用1Mbps小水管VPS试过,画面一放大就糊成一团,后来换了带宽才解决。
1.3 自建方案的选型权衡
整个部署有两条主流路线:手动下载二进制文件启动,或者用Docker Compose一键拉起容器。我的观点很明确,服务器上本来就有Docker的,直接用容器版,升级方便;没有Docker也不打算装的,手动二进制反而更省资源。服务端对硬件要求不高,1核1G内存的便宜VPS完全够用,真正要重点看的是带宽和端口是否被限制。不要选那些默认屏蔽UDP端口的机器,RustDesk的ID注册和打洞依赖21116端口的UDP,有些机房默认屏蔽UDP,选了之后所有客户端要么连不上,要么只能靠中继硬扛,体验直线下降。
选型时还有一个容易忽略的细节:服务器磁盘空间不用大,但IP一定要干净。这里说的干净是指这个IP没有被频繁扫描滥用记录,否则你开放公网端口后,几天就能收到一堆扫描告警。个人使用的话,建议选配置最低、带宽中等偏上的VPS,先跑一个月看看稳定性,再决定要不要长期续费,别第一年就冲三年,踩了坑很难退。
2. 环境准备与部署前规划
2.1 服务器配置与地域选择
说句实在话,RustDesk服务端本身的CPU和内存占用几乎可以忽略,300并发以内的个人方案,1核512M也能跑。但在实际操作中,我建议至少给到1核1G,因为你很可能还想在服务器上跑点Nginx反代、Fail2ban之类的辅助组件,内存太紧会影响远程服务质量。存储方面,服务端只保存密钥和日志,占用几十MB,完全不需要大硬盘。系统方面,Debian 11/12、Ubuntu 20.04/22.04都很稳,CentOS已经慢慢停止维护,除非你特别熟练,否则别碰老古董。
地域选择优先考虑你的主要被控端网络环境。如果你绝大部分时间需要远控的是家里宽带,那就选离你家网络路径最近的机房节点,延迟和丢包都会好看很多。实在拿不定主意,就按“先买一个月最低配,在两台内网机器上安装客户端,实际用一周再做决定”的原则来。网上很多教程上来就让买某个区域的机器,其实网络拓扑天天变,最好的方案永远是实测数据。
2.2 端口规划与防火墙开通清单
RustDesk服务端要开放的端口并不复杂,四类端口各有用处,计划部署时先在表格里列清楚。
| 端口 | 协议 | 使用者 | 用途 |
|---|---|---|---|
| 21116 | TCP+UDP | hbbs | ID注册、连接握手、NAT打洞 |
| 21117 | TCP | hbbr | 中继服务器转发数据通道 |
| 21118 | TCP | hbbs | Web客户端连接使用(可选) |
| 21119 | TCP | hbbr | Web客户端连接使用(可选) |
如果你从不用浏览器端,21118和21119可以不开放,减少暴露面。但21116的UDP尤其重要,我见过太多朋友只开放了TCP,结果远程列表能看到设备,连接却总卡在“正在连接”,全是UDP包进不来导致的。云服务器默认安全组、本地ufw防火墙、还有服务进程本身的监听行为,三层都要检查。很多云厂商安全组单独管理入方向和出方向,你只放行出方向等于白改。
2.3 域名、密钥和系统时钟三件小事
部署之前先把三件准备工作做完。第一,准备好一个域名。其实直接用IP填客户端也可以,但域名的好处是以后换服务器IP时不用重装所有客户端,统一改DNS解析即可。建议用A记录直接指向VPS,不要套CDN,因为RustDesk需要长连接和UDP,CDN转发基本会拖垮打洞成功率。第二,确认服务器时间准确并开启NTP同步。启动RustDesk服务端进程时会生成一对密钥文件,如果系统时间不准,后续的验签和握手容易出现“时间戳无效”的报错,尤其虚拟机快照恢复后时间经常飘,提前把这个坑标记上。第三,想清楚密钥如何保管。密钥生成后,客户端必须填写服务器生成的那串公钥才能完成连接,相当于服务器身份的验收凭证。如果私钥丢失,服务一旦重启就会生成新密钥,所有旧客户端都得重新配置,所以别等丢完了才后悔。
3. RustDesk服务器完整部署实操
3.1 二进制方式部署:下载、启动、配置systemd
为了让底层运行机制更直观,先从二进制部署讲起。到RustDesk服务端项目的Release页面下载最新Linux版本,注意区分架构,x86_64服务器就下载amd64版本。很多服务器在国外下载源时速度不稳定,建议先在自己电脑上下载再传上去,或者在服务器上多试几次。拿到压缩包后,先解压并赋予执行权限。如果你服务器是ARM架构,就下载arm64版本,别拿x86包硬跑。我这里以x86_64为例,具体命令如下:
unzip rustdesk-server-linux-amd64.zip cd rustdesk-server-linux-amd64 chmod +x hbbs hbbr第一次启动时,把它放到后台执行:
./hbbs -r your-server-ip:21117 ./hbbr这里的-r参数很关键,它告诉hbbs,你在外部的中继服务器地址是your-server-ip:21117。如果你有域名,就直接写your.domain.com,端口默认走21117。启动完成后,目录下会出现id_ed25519.pub和id_ed25519两个文件,前者是待会填给客户端看的公钥,后者是私钥,再次强调,务必备份好。
直接这样跑会占着终端,所以正经使用要注册成systemd服务。写一个简单的unit文件:
# /etc/systemd/system/rustdesk-hbbs.service [Unit] Description=RustDesk ID Server After=network-online.target [Service] Type=simple User=root Group=root WorkingDirectory=/opt/rustdesk-server ExecStart=/opt/rustdesk-server/hbbs -r your-server-ip:21117 Restart=always RestartSec=3 [Install] WantedBy=multi-user.target中继服务hbbr的unit文件类似,只是ExecStart里不需要-r参数。配置好之后执行systemctl daemon-reload && systemctl enable rustdesk-hbbs rustdesk-hbbr --now,就能开机自启了。这里有一个坑必须提醒:WorkingDirectory必须写成放置密钥文件的目录,不能随意填/。一旦目录不对,hbbs会在别的位置生成新密钥,客户端连接时公钥不匹配,你排查半天才发现是启动目录的问题,浪费时间。
3.2 Docker Compose方式部署:一个yml文件全搞定
如果你服务器上已经装了Docker和Compose插件,我更推荐用容器版,因为升级是真省事。写一个docker-compose.yml,内容如下:
version: "3" services: hbbs: image: rustdesk/rustdesk-server:latest container_name: hbbs command: hbbs -r your-server-ip:21117 volumes: - ./rustdesk-data:/root network_mode: host restart: always hbbr: image: rustdesk/rustdesk-server:latest container_name: hbbr command: hbbr volumes: - ./rustdesk-data:/root network_mode: host restart: always注意这里用了network_mode: host。好处是容器直接复用宿主机网络,端口不依赖端口映射,UDP和TCP都能正常工作;坏处是容器没有隔离网段,但这台VPS本来就要把这些端口暴露到公网,隔离意义不大。默认情况下,docker官方镜像以root用户运行,数据目录挂载到当前目录下的rustdesk-data里面,这里的/root是容器内固定路径,改成别的容器启动时会找不到密钥目录。
启动命令只要一句:
docker compose up -d启动后看日志确认密钥生成:
docker logs hbbs日志里通常能看到id_ed25519.pub文件输出的公钥内容,直接复制下来备用。以后升级到新版本,执行docker compose pull && docker compose up -d,几秒钟就完事,比二进制方式省心不少。
3.3 客户端配置与第一台内网机器的接入
服务器起来了,接下来配置客户端。Windows、macOS、Linux客户端界面基本一致。以Windows为例,装好RustDesk后打开主界面,右上角“ID/中继服务器”菜单,在弹出的窗口里把“ID/中继服务器”填成你的VPS IP或者域名,再把服务器生成的id_ed25519.pub中的公钥字符串填到“Key”字段,保存即可。Android手机端位置在侧边菜单的网络设置里,同样操作。
这里有个关键点:公钥填错时,客户端连接会提示“密钥不匹配”,新手经常以为是服务没启动,其实只要逐个检查三项:填的服务器地址能不能访问、填的公钥是否完整复制、客户端模式是否一致。配置完成后,把这台内网机器的ID记下来,在另一台机器上用这个ID发起连接,输入Windows账号密码就能看到桌面。如果连接顺利,客户端界面上会显示“直连”或“中继”,看到这两个字眼就说明你的环境已经跑通了,接下来就可以安心使用了。
4. 核心机制与性能优化
4.1 hbbs与hbbr的分工协作原理
既然是自建服务器,总想着在此基础上优化,可优化的前提是先把两个进程的分工讲清楚。hbbs负责ID注册、在线状态广播、P2P握手协调,它像一个电话交换机。被控端打上来报名字叫张三,控制端打过来问张三在哪,hbbs把当前网络位置告诉双方,剩下的通话让他们自己聊。hbbs本身不参与大量数据包转发,所以CPU负载很低,很多人的服务器配置过剩,根本不用担心。
hbbr负责真正的内容转发。当P2P打洞失败时,控制端和被控端都主动连接hbbr的21117端口,流量从被控端到hbbr再到控制端,形成完整的中继链路。因为hbbr要一包一包地转发高频画面数据,它才是吃带宽的主力。理解了这一点,优化方向就很清晰:想让P2P成功率更高,就要改善UDP打洞环境;想让中继链路更流畅,就要加大VPS带宽,而不是无脑加CPU核数。
4.2 公钥机制与安全边界
服务端启动后生成的id_ed25519是Ed25519私钥,它派生出的公钥就是客户端要填的那串字符。每次握手时,客户端会验签确认服务器身份,防止连到仿冒服务器。这个机制的好处是自建服务器和官方默认行为完全兼容,坏处是如果私钥泄露,攻击者可以伪造一台同名服务器,诱导控制端连过去,从而截获远控流量。所以私钥文件权限一定要设成600,同时备份时额外加密保存。
安全边界上要说一个很多人忽略的事实:RustDesk服务端没有传统意义上的“账号密码管理后台”,只要别人知道你的ID和连接密码,就能发起远控。所以客户端里设置的连接密码要足够长,别用123456。我自己的实际做法是用云安全组只放行已知办公网络IP到21116和21117端口,虽然这样会影响移动端用流量连接,但大大减少了对公网扫描的暴露面。家用的场景能接受,需要随时随地连的话,再退回全部放行加高强度密码。
4.3 通过系统参数和网络设置做性能优化
VPS带宽有限时,可以为RustDesk客户端做必要的节流。控制端和被控端都能在“设置-显示”里把分辨率限制到合适档位,色彩选择高、中、低三档,帧率调到15-30。远程办公如果只是改配置文件、敲几条命令,设置成低色彩、15帧绰绰有余,带宽占用至少降一半。关键页面需要看清文字时,临时拉高分辨率即可。
长期运行的中继服务器建议加上日志轮转,容器部署时在compose里加logging限制,避免日志铺满磁盘。打开TCP BBR拥塞控制对跨网远程延迟也有一定改善,具体做法是先确认内核支持tcp_bbr模块,然后设置net.core.default_qdisc=fq和net.ipv4.tcp_congestion_control=bbr。这一步不是必须,但实测在高延迟网路上画面会更平滑,属于性价比很高的优化项。
5. 常见问题与排查实录
5.1 客户端一直卡在“正在连接”或“连接到ID服务器失败”
这是自建方案里最常见的故障。第一步,先在客户端看一眼日志,RustDesk在“设置-高级”里可以导出日志,日志会明确告诉你连不上的是ID服务器还是中继服务器。第二步,在客户端机器上测网络连通性:
nc -vz your-server-ip 21116TCP能通不代表UDP能通,21116的UDP才是打洞的关键。可以在VPS上用tcpdump观察:
tcpdump -i eth0 udp port 21116 -n如果客户端连接时有出包但没有回包,十有八九是云安全组或机房防火墙屏蔽了UDP。解决办法是去云控制台的安全组“入方向”规则里明确放行UDP 21116,有些产品默认出入方向分开管理,只改出方向等于白改。另外还要确认服务端进程确实在监听,使用ss -lntup | grep 21116能看到监听信息。
5.2 连接建立后没过多久就断开,或者画面卡到无法操作
这种问题要先判断当前是直连模式还是中继模式。在远程会话窗口的顶部工具栏或连接信息面板里能看到路径,如果是“中继”,问题几乎一定出在VPS带宽或链路稳定性上。建议做两步:第一步,看VPS实时监控,确认带宽是否被打满;如果打满,限制控制端显示分辨率和帧率。第二步,检查丢包率,在同一网络下用ping连续测100个包,丢包超过1%,考虑换线路或检查路由。
还有一个隐性原因是MTU值。有些内网PPPoE或特殊网络环境下默认MTU过大,中继模式下大包容易被丢弃,画面上表现为马赛克和局部花屏。临时把客户端网卡MTU改成1400测试,如果画面立刻改善,就说明确实是分片问题。这种情况在内网跨网远控时比较常见,调整MTU后远程操作的稳定性能好很多。
5.3 密钥找不到、匹配不上怎么办
密钥相关问题是第二大高频故障。排查顺序如下:第一,登录VPS确认id_ed25519.pub文件存在,如果不存在说明服务进程启动目录不对,或者服务根本没跑起来。第二,对比客户端填写的Key值和文件内容是否完全一致,很多人复制时多了一个换行符,或者误复制了日志里的截断输出。第三,确认服务器时间和客户端时间偏差小于5分钟,时间误差太大会导致握手验签失败。
容器部署常见的坑是docker-compose挂载目录权限不对,容器内进程读不到私钥,导致每次重启都重新生成密钥。遇到这种情况,先停掉容器,确认宿主机上rustdesk-data目录下的密钥文件存在且权限正常,再以原目录启动。后来我把密钥单独备份到密码管理器里,只保存纯字符串,不存多余换行,遇到问题直接粘贴比对,少走很多弯路。
5.4 内网设备长时间待机后无法被唤醒
公网远控场景里,被控机很可能长时间没人碰,Windows默认几十分钟后会休眠,休眠后网卡断网,自然无法被RustDesk唤醒。解决方法是把被控端电源设置改成“从不睡眠”,并关闭网卡节能选项,确保网卡在系统待机状态下仍然保持网络连接。如果是台式机,可以开启BIOS里的网络唤醒功能,再用WOL工具从同一内网发魔法包,RustDesk负责唤醒后的控制,两者搭配才能形成完整的远程开机链路。
这个点很容易被忽略。我见过不少朋友搭好服务器后兴冲冲远程过去,结果只能对着黑屏发呆。不用焦虑,先把睡眠关掉,大部分问题就消失了。
6. 长期运行心得与后续扩展
6.1 日志、密钥和服务监控的维护习惯
自己搭的服务能否长期稳定运行,靠的是维护习惯。我的实践是给RustDesk服务端加一个定时探活脚本,每5分钟检测一次21116和21117端口,一旦失败就自动重启对应服务,并把结果写入单独的日志。配合云监控告警,哪天端口异常了,我第一时间就能收到通知,不用等用户反馈才发现。日志方面,默认日志会一直累积,建议用logrotate限制大小,或者用docker logging设置最大文件尺寸,别让日志把磁盘塞满。
密钥备份要养成固定习惯。每次部署完就把id_ed25519.pub和私钥字符串一起放进密码管理器,同时注明服务器地址和部署时间。虽然RustDesk的私钥不需要关心证书过期,但一旦私钥丢失,重新生成的密钥就是新的身份,所有客户端要全部重配,这个代价不值得。我给自己立过规矩:任何一次重装系统、换VPS,第一步永远是备份密钥文件。
6.2 Web远控、多中继和场景化扩展
这套方案后续还能扩展成更完整的家庭远程体系。比如在VPS上配合Nginx给RustDesk的Web客户端做反向代理,团队小规模使用时直接在浏览器里远控,省得每台电脑都装客户端。如果公司有多个分支,还可以在多地部署多台中继服务器,客户端按优先网络选择连接,虽然官方对多中继的配置支持需要更多摸索,但只要做好了,线路冗余和容错能力会好很多。
我个人踩过几次坑之后的最大体会是:别把服务端配置当成一次性工作,跑通之后依旧要定期看日志、备份密钥、观察带宽。公网中继服务器说白了是你远程控制体系里最关键的桥梁,桥稳了,家里那些机器才敢真正放心远程去折腾。