自建RustDesk中继服务器:远程控制稳定免费可自控的完整指南
公司办公室里临时要改家里服务器的配置怎么远程都不顺于是我干脆弄了一台公网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后面或者路由器开了严格的对称NATP2P握手根本打不通。这时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服务端要开放的端口并不复杂四类端口各有用处计划部署时先在表格里列清楚。端口协议使用者用途21116TCPUDPhbbsID注册、连接握手、NAT打洞21117TCPhbbr中继服务器转发数据通道21118TCPhbbsWeb客户端连接使用可选21119TCPhbbrWeb客户端连接使用可选如果你从不用浏览器端21118和21119可以不开放减少暴露面。但21116的UDP尤其重要我见过太多朋友只开放了TCP结果远程列表能看到设备连接却总卡在“正在连接”全是UDP包进不来导致的。云服务器默认安全组、本地ufw防火墙、还有服务进程本身的监听行为三层都要检查。很多云厂商安全组单独管理入方向和出方向你只放行出方向等于白改。2.3 域名、密钥和系统时钟三件小事部署之前先把三件准备工作做完。第一准备好一个域名。其实直接用IP填客户端也可以但域名的好处是以后换服务器IP时不用重装所有客户端统一改DNS解析即可。建议用A记录直接指向VPS不要套CDN因为RustDesk需要长连接和UDPCDN转发基本会拖垮打洞成功率。第二确认服务器时间准确并开启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] DescriptionRustDesk ID Server Afternetwork-online.target [Service] Typesimple Userroot Grouproot WorkingDirectory/opt/rustdesk-server ExecStart/opt/rustdesk-server/hbbs -r your-server-ip:21117 Restartalways RestartSec3 [Install] WantedBymulti-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_qdiscfq和net.ipv4.tcp_congestion_controlbbr。这一步不是必须但实测在高延迟网路上画面会更平滑属于性价比很高的优化项。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客户端做反向代理团队小规模使用时直接在浏览器里远控省得每台电脑都装客户端。如果公司有多个分支还可以在多地部署多台中继服务器客户端按优先网络选择连接虽然官方对多中继的配置支持需要更多摸索但只要做好了线路冗余和容错能力会好很多。我个人踩过几次坑之后的最大体会是别把服务端配置当成一次性工作跑通之后依旧要定期看日志、备份密钥、观察带宽。公网中继服务器说白了是你远程控制体系里最关键的桥梁桥稳了家里那些机器才敢真正放心远程去折腾。