RustDesk自建中继服务器:从端口规划到安全加固的完整指南
1. RustDesk中继服务到底解决了什么问题1.1 远程控制的链路架构拆解先把话说清楚RustDesk不是一个简单的点对点远程桌面工具它的完整链路里有一个很容易被忽略的角色——中继服务器。很多人第一次用RustDesk下载客户端填个ID和密码就能连上体验起来和TeamViewer、向日葵差不多这是因为RustDesk官方帮你兜底跑了一组公共服务器。但公网服务器资源有限、延迟不受控而且一旦官方服务波动你手头正在维护的机器可能说断就断。RustDesk的通信逻辑可以拆成三层。第一层是ID注册和心跳客户端启动后需要去注册服务器hbbs报到告诉它我在线我的ID是xxx。第二层是连接协商你要控制一台机器时控制端会通过hbbs拿到被控端当前的网络地址信息。第三层才是真正的数据通道如果双方能建立P2P直连就走直连如果双方网络环境都严格受限典型的就是两边都在不同内网、都有NATP2P打洞失败数据就走中继服务器hbbr转发。自建中继本质上就是同时部署hbbs和hbbr这两个组件。hbbs管登记和撮合hbbr管转发。所以搭建RustDesk服务器核心就是让这两个进程在公网机器上稳定跑起来并且让所有客户端都指向你自己的服务器。这个逻辑一旦想清楚后面的操作全部都是围绕它展开的。1.2 官方公共服务器和自建中继的差距先说官方服务器的体验小规模用、网络环境简单的场景下确实还不错。但一旦你需要长期维护几十台内网机器就会发现几个切肤之痛。第一是延迟不可控。官方中继服务器部署在海外国内机器互连时数据要绕一圈画面操作延迟经常跑到200ms以上鼠标拖拽有明显滞后感在内网机器上做数据库导出这类精细操作非常难受。第二是不稳定。官方服务偶尔会调整策略高峰期连接失败率明显上升你在外面突然发现连不上公司内网的机器只能干等。第三是安全的隐忧。所有客户端的ID信息都集中登记在官方服务器上虽然密码是加密存储的但对于有安全洁癖、特别是手里管着生产环境服务器的人来说这始终是个心理疙瘩。自建中继解决的就是这三个问题。服务器放国内云主机延迟能压到20~50ms服务完全自己掌控升级、重启、故障排查都透明ID和Key掌握在自己手里访问行为只存在于你自己的服务器日志里。代价就是你得多花一台云主机的钱以及花半小时做一次完整的部署和配置。1.3 什么情况下值得自建我见过不少朋友一上来就问我要不要自建其实得先看场景。如果你只是偶尔远程连一下家里的一台电脑控制端和被控端网络条件都不算太差官方服务器完全够用没必要折腾。但下面这几类情况我强烈建议自建需要跨多个内网维护生产机器每天都要远程操作对稳定性和延迟有要求。公司内部有多台服务器、工控机、收银终端需要一套统一的远控方案并且不想把设备信息暴露给第三方云服务。在内网断网隔离环境部署特定系统需要在外网构建后向内网机器分发镜像RustDesk正好作为前期维护通道这个场景我还真踩过不少坑后面细说。对访问安全有制度化要求需要自己掌握完整的注册和转发链路。明白了这些下面就直接进入正题。服务器怎么选、端口怎么规划、进程怎么跑、客户端怎么填每一步我都会把原因讲清楚而不是只给你一串复制粘贴的命令。2. 服务端搭建前的硬件规划与端口设计2.1 带宽、内存、CPU的最低要求和推荐配置RustDesk自建服务器的资源消耗其实比你想象的低得多。hbbs是轻量注册服务平时CPU占用几乎可以忽略内存占用大概在几十MB级别。hbbr是中继转发服务这个就看你的并发量和流量了。如果你只是自己用、偶尔同时连一两台机器1核1G的云主机跑起来毫无压力。如果你要给一个团队提供服务同时可能有5~10路转发那么2核4G会更从容。真正要重点看的是带宽。中继转发的特点是控制端和被控端之间的屏幕图像数据全部经过你的服务器所以服务器的带宽决定了你能达到的远控画质和帧率。以RustDesk默认画质为例1920x1080分辨率下一帧压缩后的屏幕数据大概在50~200KB之间如果每秒传10帧单路流量大约在4~16Mbps。这意味着如果你用一台1Mbps小水管服务器做中继那基本只能看个静态桌面动一下就糊成一片。我个人的推荐配置是个人使用选1核2G、带宽5Mbps以上的云主机团队使用选2核4G、带宽10Mbps以上带宽不够时优先开画质优先模式让RustDesk自动帧率自适应。国内云主机厂商的轻量应用服务器性价比很高流量包基本够日常维护使用按量付费往往反而更划算。2.2 三个关键端口的功能划分RustDesk服务端最核心的端口是21115、21116、21117它们各管一摊理解清楚了后面的防火墙配置才不会乱。21115TCP端口用于NAT类型测试。客户端启动后会通过这个端口向服务器发送探测包判断它自己当前的网络环境。21116TCP和UDP双栈端口这是hbbs的主端口。客户端的ID注册、心跳保活、连接请求都走这里。UDP主要用于大量短消息的传输和打洞探测TCP用于可靠的长连接。21117TCP端口它是hbbs的连接入口。客户端要建立远程会话时会先通过这个端口和hbbs交互拿到中继服务器的地址信息然后数据流再转向hbbr。如果开了Web客户端支持还会用到21118和21119但基础场景下这三个端口就是全部。很多初次搭建的朋友只放了TCP端口没放UDP结果客户端能注册但P2P打洞一直失败最后所有流量都走中继白白浪费带宽。这个坑我下面会重点提醒。2.3 安全组策略与防火墙放行搞清楚了端口防火墙配置就顺理成章了。以国内主流云厂商的安全组为例你需要添加入站规则TCP 21115、TCP/UDP 21116、TCP 21117。注意21116的UDP一定要放行很多人就是漏了它。服务器本身的firewalld或ufw也要同步放行。CentOS Stream / Rocky Linux习惯用firewalld执行firewall-cmd --permanent --add-port21115/tcp firewall-cmd --permanent --add-port21116/tcp firewall-cmd --permanent --add-port21116/udp firewall-cmd --permanent --add-port21117/tcp firewall-cmd --reloadUbuntu/Debian用ufw的话ufw allow 21115/tcp ufw allow 21116/tcp ufw allow 21116/udp ufw allow 21117/tcp ufw enable另外强烈建议把SSH端口改成非默认端口或者在安全组里限制SSH只允许你自己的办公网IP访问。中继服务器是公网暴露的每天被扫描爆破是常态RustDesk端口反倒不用太担心因为协议本身有Key校验但SSH是重灾区。一次部署顺手做掉这个加固能省掉后面一堆麻烦。3. 公网中继服务器完整搭建流程3.1 部署方式选型Docker还是二进制RustDesk服务端有两种主流部署方式官方Docker镜像和直接跑二进制文件。我两种都用过说说感受。Docker方式适合图省事、不折腾系统环境的场景镜像拉下来一条命令就能跑升级也简单但前提是你的机器能访问镜像仓库。二进制的优势是部署逻辑完全透明进程直接挂在systemd下面出问题排查链路更直接而且不依赖容器环境。考虑到很多人的服务器是国内云主机拉Docker镜像偶尔会遇到源不稳定我建议两种方式都掌握。这里先讲二进制方式因为它能让你看清楚每个组件到底在干什么Docker方式只是把下面这些步骤封装起来了而已。3.2 hbbs和hbbr两个核心进程的启动参数首先下载服务端二进制。到RustDesk的GitHub Release页面找rustdesk-server-linux-amd64的压缩包个人使用选免费版开源版即可。解压后你会看到两个核心可执行文件hbbs和hbbr还有一个后缀为.so的依赖库文件这三个必须放在同一个目录下。启动hbbscd /opt/rustdesk-server ./hbbs -r your.domain.com:21117 -k _启动hbbrcd /opt/rustdesk-server ./hbbr -k _参数讲一下。-r指定的是中继服务器的地址和端口这里要填你自己的域名或公网IP端口就是前面说的21117。-k _表示自动生成一个随机的Key公钥第一次启动后会在当前目录下生成一个id_ed25519私钥文件和对应的公钥字符串。这个公钥很重要客户端配置时需要填它用来做通信加密握手。如果你已经有固定Key想复用-k后面直接填之前生成的公钥内容也可以。实际运维中我建议用自动生成的把私钥文件妥善备份别泄露出去。私钥一旦丢失所有已配置的客户端都得重新更新Key那场面很酸爽。启动hbbr时不需要指定监听端口它默认就监听21117之后的端口范围负责转发数据。3.3 开机自启与守护进程配置直接用命令行跑进程有个毛病SSH断开或者进程崩溃服务就没了。生产环境必须把它注册成systemd服务。创建hbbs服务文件/etc/systemd/system/rustdesk-hbbs.service[Unit] DescriptionRustDesk ID/Registration Server Afternetwork.target [Service] Typesimple WorkingDirectory/opt/rustdesk-server ExecStart/opt/rustdesk-server/hbbs -r your.domain.com:21117 -k _ Restartalways RestartSec5 LimitNOFILE1048576 [Install] WantedBymulti-user.target再创建hbbr服务文件/etc/systemd/system/rustdesk-hbbr.service[Unit] DescriptionRustDesk Relay Server Afternetwork.target [Service] Typesimple WorkingDirectory/opt/rustdesk-server ExecStart/opt/rustdesk-server/hbbr -k _ Restartalways RestartSec5 LimitNOFILE1048576 [Install] WantedBymulti-user.target然后依次执行systemctl daemon-reload systemctl enable --now rustdesk-hbbs systemctl enable --now rustdesk-hbbr启动后用socket查看监听状态ss -lntup | grep -E 2111[567]正常情况下你能看到21115、21116的tcp监听21116的udp监听以及hbbr占用的tcp端口。如果哪个端口没起来检查一下是不是被其他进程占用了这个坑我也在后面统一说。3.4 域名解析与Web控制台配置可选但推荐如果你有域名强烈建议解析一个A记录到服务器IP比如relay.yourdomain.com。这不仅仅是好看更重要的是如果你以后换服务器IP客户端这边只需要改一下域名解析不用挨台机器重配。没有域名直填IP也能用适合临时场景。新版RustDesk服务端自带了一个简单的Web控制台通过21118/21119端口访问可以查看当前注册的ID列表和在线状态。我个人的使用习惯是不加HTTPS反向代理的话这个端口不对外开放需要查在线状态时SSH到服务器上本地访问或者临时放行端口。如果确实想通过浏览器安全访问Nginx反代加Lets Encrypt证书是最常规的做法具体配置网上很多这里不展开。3.5 获取Key与中继地址服务跑起来后去/opt/rustdesk-server目录下找.pub后缀的文件里面就是公钥字符串。用cat打开复制整段内容后面填客户端要用。整个文件内容通常长这样9fJ3Pz8G5XkQwE2rT7uYbNaCcDdEeFfGgHhIiJjKkLlMm公钥的作用是客户端和服务器握手时验证对方身份防止有人冒名顶替你的服务器。这也是自建RustDesk和直接用官方服务器最核心的区别之一——通信链路只信任你自己声明的Key。4. 客户端接入配置与内网机器绑定4.1 Windows客户端的中继地址填写客户端配置是所有环节里最容易出错的一步。RustDesk的Windows客户端双击打开主界面右上角菜单里找到ID/中继服务器设置项会弹出一个对话框。这里不是简单填三个框就完事很多人的问题就出在中继服务器这一栏到底要不要带端口。正确填法ID服务器填你的域名或公网IP不需要带端口默认就是21116。中继服务器填your.domain.com:21117注意这里的格式是域名冒号端口端口必须带因为hbbr的数据入口走21117。Key填刚才复制的那串公钥。填完点确定客户端会重新连接服务器。此时看主界面的ID是否正常显示。如果ID变成了-----或者一长串0说明和hbbs的通信没建立成功后面会专门排查。Windows客户端还有一个细节如果你在内网机器上装了Windows版RustDesk并且以后想通过无人值守方式远程连接就必须在安全设置里设置一个固定密码而不是使用每次启动都随机变化的临时密码。固定密码用RustDesk的加密选项保存安全强度也够。4.2 Linux、Android、macOS客户端的配置Linux客户端同样在设置里配置ID/中继服务器和Windows大同小异。唯一注意点是Linux的RustDesk客户端可能依赖部分图形库在纯命令行服务器上部署要注意有没有libxcb和libgtk这些基础依赖否则打不开界面。Android客户端的坑主要在两个地方。第一是填写界面路径新版客户端在左上角菜单里选设置然后进入网络进行修改。第二是Android的后台运行限制如果被控端是Android设备你要远程控制它务必在系统设置里允许RustDesk后台运行、忽略电池优化否则屏幕一灭、系统一杀进程连接就断了。这部分和各家手机ROM的后台管理策略有关不是RustDesk本身的问题。4.3 手机端安装受限的实际情况最近不少人的手机上装了RustDesk被系统弹窗拦截特别是小米澎湃HyperOS系统。这里先说清楚RustDesk本身是正规的开源远控软件不需要任何敏感权限它只需要屏幕录制、悬浮窗这类常规权限。澎湃系统拦截的根本原因是默认开启了纯净模式或安全防护对外部来源APK的安装做了限制。解决办法很直接安装时选择允许来自此来源的应用系统弹出风险提示时选择仍然安装。如果安装到一半被拦截了去手机管家的隐私与安全设置里把纯净模式、安全防护的开关暂时关掉装完再开回去。装好之后首次启动会提示需要开启无障碍服务和悬浮窗权限这个按指引授权即可。这里顺便说一句网上有些帖子把无法安装解读得很夸张其实不用慌它和那些需要绕过系统权限的灰色软件性质完全不同RustDesk只要走正规渠道下载按正常流程授权就行。4.4 内网机器离线环境部署的特殊情况热搜词里有一条mineru docker离线打包虽然和RustDesk不直接相关但这类场景在内网运维中很常见外网一台机器上构建好Docker镜像然后导出为tar包再拷贝到内网断网机器上加载整个流程里需要一个可靠的工具来监视和维护这些内网机器。RustDesk中继服务器正好能帮忙前期给内网机器装上RustDesk客户端外网通过中继随时接入镜像传输和灰度发布都能远程完成。具体到离线打包常规套路是在外网机器上docker save -o myapp.tar myapp:latest然后压缩传输到内网机器再执行docker load -i myapp.tar这个过程中RustDesk的价值就是让你不用每次拷镜像都跑一趟机房远程就能完成上传、加载、重启容器。如果内网机器部署了RustDesk服务端你把整个离线镜像包拉进去加载效果等同于内网专用私有仓库。这条路径跑通后真正能做到外网构建、内网部署、全程远程。5. 安全加固、防火墙策略与日常维护5.1 端口最小化开放RustDesk运行需要哪些端口前面已经讲清楚了。安全加固的第一原则就是除了这些必要端口别的不要裸奔在公网。特别是服务器如果有Web管理面板或者其它业务服务建议全部绑内网IP或者通过安全组限制源IP。端口最小化开放不是说要你封死一切而是每个暴露出来的端口都得知道它是干什么用的不知道用处的端口一律不放行。另外提一个我踩过的坑21116的UDP端口在部分云厂商安全组里如果你用的是来源IP白名单模式记得把UDP和TCP分别加规则有些控制台不会自动把两者一并放行。5.2 Key管理与访问控制Key是RustDesk自建服务器的安全命门。公钥下发到所有客户端私钥只保留在服务器上。如果私钥泄露攻击者可以伪造你的服务器身份诱导客户端误连到他的机器上。所以私钥文件id_ed25519权限建议设为640并且定期备份到安全位置。还有一点容易被忽略hbbs监听的21116端口同时提供注册服务如果你不想让任何人都能往你的服务器上注册ID可以在服务配置文件里通过-R 地址参数限制hbbs的地址绑定范围。不过这个参数实际用得不多因为RustDesk的ID本身是随机生成的字符串攻击者就算注册了ID也影响不了你的客户端。更高阶的做法是给RustDesk服务端加一层Fail2ban防护监控hbbs的日志对有异常行为的来源IP做封禁。对于面向生产环境的自建中继服务器这个配置值得花十分钟做一下。5.3 日志查看、版本升级与故障自查日常维护主要看两块日志。hbbs的日志默认输出到stdoutsystemd管理的话用journalctl -u rustdesk-hbbs -f实时查看。常见的关键信息包括客户端ID注册成功、连接请求、NAT类型探测结果。hbbr的日志则重点看数据转发的连接建立和断开记录。版本升级建议跟随RustDesk官方Release节奏不要长期停在老版本。RustDesk服务端本身升级不频繁但一旦有安全修补通常很重要。升级流程就三步先停服务、替换二进制文件、再启动服务。注意升级时-k _这个Key配置要保持不变否则所有客户端都要重新配Key。6. 搭建与使用中的高频问题排查6.1 客户端一直显示无法连接中继服务器这是最多人遇到的情况。先别急着怀疑服务端按下面顺序自查在客户端机器上执行telnet your.domain.com 21117看TCP能不能通。不同说明中继端口没放行。检查服务器上ss -lntup | grep 21117确认hbbr进程在监听。用手机流量做测试排除内网防火墙干扰。查看hbbr日志看有没有客户端的连接记录。还有一种隐蔽情况域名解析到了CDN或者国内某些云厂商的安全加速上这类服务不转发TCP长连接导致21117端口探测看起来通但实际连不上。解决方法是使用纯DNS解析不要叠加CDN或高防IP。6.2 ID和密码获取失败客户端界面上ID区域显示---或者全零核心原因是连不上hbbs的21116端口。重点检查UDP端口是否放行因为ID注册的初始握手依赖UDP通信。排查命令在服务器上执行ss -lunp | grep 21116能看到进程在监听说明服务端正常。客户端本地再试nc -uvz your.domain.com 21116UDP的nc测试结果相对模糊但至少能看出网络层是否可达。确认无误后把客户端完全退出、在任务管理器里结束所有RustDesk进程后再重新打开很多情况下是客户端拿到错误的网络状态缓存导致一直连接不上。6.3 远控画面卡顿、延迟高自建中继定位卡顿先分清楚是P2P直连没打通、还是中继带宽不够。看主界面连接状态里的连接类型标识如果显示中继说明P2P打洞失败所有流量都压在服务器带宽上。此时优先优化网络让被控端和控制端尽量处于同一运营商网络或者调整NAT设备的UPnP设置。如果连接类型显示直连但还是卡那么瓶颈在两端的上传带宽或RustDesk的画质设置上。可以手动把画质从清晰调成平衡或者限制帧率为15帧多数办公场景下完全没有影响带宽占用能下降一半以上。6.4 端口被占用、配置错乱等环境坑最后列一批我实际遇到的小问题。21116端口被系统其他进程占用时hbbs一般会启动失败或提示Address already in use用fuser -v 21116/tcp 21116/udp查到占用进程后处理。客户端配置过老的服务器地址时旧的连接配置会残留导致走了错误的中继解决办法是重置客户端的配置文件在Windows上是删除C:\Users\你的用户名\AppData\Roaming\RustDesk\config下的相关文件后重启客户端。另外如果你的服务器同时运行了宝塔等面板面板自带的防火墙和系统firewalld、云安全组可能三层叠加任何一层没放行都会导致连接失败。排查时三层一起看不要只盯着系统防火墙。我在实际部署中还有一个习惯每次部署完服务端后都会做一次全链路自测就是用一台手机流量、一台家庭宽带、一台公司办公网的三台设备分别测试连接这样能尽早暴露运营商跨网互访的问题而不是等到真正要远程了才发现连不上。RustDesk自建中继折腾的其实不是那几条启动命令而是网络链路上各种隐蔽的不确定性。把上面这些点都过一遍这套系统基本就能稳定跑上很久了。