ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RustDesk编译内嵌自建服务器与key:打造免配置远程桌面客户端

RustDesk编译内嵌自建服务器与key:打造免配置远程桌面客户端 自己编译RustDesk把自建ID服务器和key写进客户端是我折腾过最值回票价的一件事。远程桌面这玩意儿日常用TeamViewer、向日葵倒是方便可一旦动了“这台机器归我管数据不想经过第三方”的念头自建就成了唯一解法。RustDesk本身就是开源项目服务器端和客户端全在自己手里但默认编译出来的客户端连接的是官方公共服务器你得手动填ID服务器、填key才能连上自己的服务。对于自己用这倒无所谓可如果你是给公司内部十几号人分发或者想让家里人装完就能用这一步手动配置就是灾难——总有人会填错地址总有人干脆不填然后跑过来问你为什么连不上。所以这篇文章要解决的就是一件事从源码编译一个RustDesk客户端把自建ID服务器地址和key提前“焊”进去。编译出来的安装包用户装上就能直连你的服务器不需要任何额外配置。适合三类人看给企业内部批量部署的运维、想在NAS或VPS上搭一套私有远程方案的玩家、以及想改个客户端名头甚至Logo做点定制分发的人。1. 方案设计为什么一定要编译写入而不是让用户手动填先聊清楚一个核心问题RustDesk自建服务器之后客户端连接需要什么答案就两个东西——服务器地址和一个叫key的值。服务器地址好理解就是跑着ID服务器hbbs和中继服务器hbbr那台机器的IP或域名。key则是服务器的公钥标识。RustDesk的架构和远程软件不太一样它的客户端在建立连接前会先校验服务器的身份防止有人假冒服务器截取流量。这个校验靠的就是key相当于你们之间的一套“接头暗号”。1.1 自建ID服务器和key到底解决了什么问题RustDesk的完整链路分三段客户端A、客户端B、中间的服务器。服务器里又分两个角色一个叫hbbs管ID注册和信令就是“你帮我找一下对方在哪”另一个叫hbbr管数据中继当两个客户端之间没法直接打洞传输时流量就走它转发。所以搭建一套自建服务最少要跑这两个进程。key是在服务器第一次启动时自动生成的存在服务器的硬盘上是一个叫id_ed25519.pub的文件。客户端连接时填的这个key就是要和服务端的公钥对上相当于指纹校验防止中间人劫持。1.2 两种下发方式手动填写与编译内嵌方式一客户端装好之后在设置里填ID服务器和中继服务器再把key也填进去。优点是灵活换个服务器改个配置就行缺点是每位用户都得操作一遍而且大部分人分不清“ID服务器”和“中继服务器”的端口区别填错一个就连不上。方式二编译时就把这些信息写进代码里客户端启动就是“已配置”状态。用户装完打开主界面直接出来一个ID让别人用这个ID连你或者你在另一台机器输他的ID就能连过去全程不用碰设置。缺点也明显——一旦服务器地址要变得重新编译分发。但对于固定服务器、长期使用的场景这个缺点完全不是问题。我的选择一直是第二种。原因很朴素远程桌面这东西出问题的概率本来就高你要是再把“填服务器地址”这种配置负担甩给用户出了问题你根本不知道是网络不行还是他key填错了。直接编译内嵌变量全在自己手里排查起来省太多事。1.3 编译写入前要搞懂的三件事第一你要有一个能编译的环境RustDesk客户端是Rust核心加Flutter界面编译链比较重尤其是Windows客户端环境配置最麻烦。第二服务器端要先跑起来并取出key不然你编译时不知道该写什么值。第三要明白改代码不是搜个关键字替换那么简单新版RustDesk的公共服务器地址和key在源码里出现的位置不止一处必须都改到位否则编译出来的客户端部分模块仍然会走官方服务器。这三件事没搞懂就动手大概率会在编译中途卡住或者编译出来连不上自己的服务器。下面按顺序走。2. 动手前的准备编译环境与依赖编译RustDesk客户端最典型的目标平台是Windows和Linux。我以最常见的Windows客户端编译为例这套流程跑通后Linux只是换一套依赖而已。2.1 一条主线和两条分支编译这件事主线永远是准备好Rust工具链、准备好Flutter SDK、拉源码、改配置、编译、打包。两条分支是如果你只想要命令行编译好的exe可以走纯Rust路线但RustDesk的界面是Flutter画的要出完整的带GUI的Windows客户端Flutter那一步绕不开。我的建议是别省直接按完整流程走。因为平常用的客户端不只是连接界面还有文件传输、白板、聊天这些功能纯命令行模式做不出来完整体验。2.2 Rust与Flutter环境搭建环境搭建是第一个坑我见过太多人倒在这里。Rust工具链安装去官网跑rustup安装脚本就行。这里有个关键点Windows下编译RustDesk推荐用GNU工具链而不是MSVC。原因不是MSVC不行而是RustDesk依赖的某些原生库在GNU链下更省心。装完记得把cargo的bin目录加到PATH里。Flutter SDK去Flutter官网下Stable版本注意版本要和RustDesk源码要求的对齐。RustDesk的README.md里一般写了推荐的Flutter版本别直接上最新版否则Dart版本不一致编译时满屏报错。装完Flutter还要跑一下flutter doctor把Windows的Desktop支持勾上Visual Studio 2022那一堆C桌面开发组件也得装——这个部分是给Flutter底层用的缺了会编不过。依赖镜像这一步强烈建议配一下。国内直接拉crates.io和pub.dev会很慢经常超时。cargo的镜像配置写在$HOME/.cargo/config.toml里Flutter的镜像通过环境变量PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL指定。这个不敏感纯粹是加速。2.3 源码拉取与依赖镜像配置RustDesk源码直接用Git拉git clone https://github.com/rustdesk/rustdesk.git cd rustdesk拉完之后先别急着编译把子模块也同步了。RustDesk有几个依赖是以submodule形式引入的不更新的话编到一半会提示缺文件git submodule update --init --recursive这里要注意子模块体积不小网络不好时容易中断建议开代理或多次重试。我自己遇到过一次只拉了一半就断了后续编译各种奇怪报错最后删了重新拉才解决。环境都就绪后可以先跑一次不带修改的编译验证环境没问题。这个第一次编译会非常久十几分钟到半小时都很正常因为几百个crate都要从源码构建。确认能出包后再去做服务器配置改动这样后面排查问题时你能区分是环境问题还是代码问题。3. 服务器端部署与key生成客户端的修改是后面的事服务器必须先跑起来因为你编译时需要用到服务器生成的key。部署方式有Docker和直接跑二进制两种我两个都试过这里分别讲。3.1 hbbs和hbbr的角色划分服务器端是RustDesk官方提供的另一个仓库rustdesk-server编译好后会得到两个二进制文件hbbs和hbbr。hbbs监听21115到21116端口负责ID注册和信令转发说白了就是“登记每台设备帮它们找到彼此”hbbr监听21117端口负责两台设备之间没法直连时的流量转发。两个都得跑缺一个客户端就玩不转。如果把整套服务比作一个公司前台hbbs是前台服务员负责登记来访者、转达消息hbbr是内部快递员A部门要给B部门送文件自己走不过去就由快递员跑一趟。3.2 CentOS 7上从零部署一套服务很多NAS和VPS还是CentOS 7的环境这里给一套我实际验证过的部署流程。先装基础依赖yum install -y wget tar然后去GitHub的RustDesk Server Releases页面下载对应Linux版本的压缩包。下载后解压把hbbs和hbbr放到/usr/local/rustdesk-server/目录下。给执行权限后先手动跑一次生成密钥cd /usr/local/rustdesk-server ./hbbs -r /data/rustdesk ./hbbr-r参数指定数据存放目录。第一次启动后这个目录下会生成id_ed25519和id_ed25519.pub两个文件。前者是私钥绝对不要泄露后者就是客户端要用的key。手动启动没问题后用systemd把它俩托管起来开机自启才省心。hbbs的systemd配置大致如下[Unit] DescriptionRustDesk ID Server Afternetwork.target [Service] Typesimple ExecStart/usr/local/rustdesk-server/hbbs -r /data/rustdesk Restartalways [Install] WantedBymulti-user.targethbbr同理。配置好后systemctl enable --now hbbs hbbr再firewall-cmd把21115到21117这几个TCP/UDP端口放行。如果服务器在云上安全组规则也得同步放通。3.3 取出key并理解它的作用key就在id_ed25519.pub文件里用cat查看cat /data/rustdesk/id_ed25519.pub输出是一长串字母数字这就是后面要写进客户端的key。有些人会问这个key和账号密码有什么区别区别很大key是服务器身份的指纹客户端用它在连接前校验“对面确实是你的服务器”防止有人伪造一个同名服务器来截获连接。它不决定谁能连只决定客户端敢不敢连。这就像你见网友前先核验对方身份证照片而不是进门后再随便聊。所以这个key在客户端里是绝对必要的不填或者填错客户端会直接报错“key值未知”拒绝建立连接。理解了这一点你就明白为什么客户端必须内置key——它和安全直接相关。4. 编译客户端并写入ID服务器和key服务器端就绪key也拿到了接下来是重头戏改客户端源码把服务器地址和key写进去然后编译出开箱即用的安装包。4.1 定位源码里的服务器配置RustDesk源码分两部分flutter目录是界面层core或libs目录是Rust核心层。公共服务器信息在两个地方都可能出现我的做法是直接在源码根目录全局搜索关键字比如rustdesk.com或ny.rustdesk.com把出现的位置全找出来。不同版本的源码结构有差异但思路一致找到默认的RustDesk官方公共服务器地址、默认的key常量然后把它们替换成你自己的服务器地址和服务器key。特别注意别只搜Rust目录Flutter的Dart代码里也可能有硬编码的旧配置。搜索时用大小写不敏感模式因为源码里可能出现RustDesk.com这种写法。4.2 写入服务器地址和key找到配置文件后改动逻辑并不复杂。核心是把类似下面这样的默认值server_host: rustdesk.com key: xxxxxxxxxxxxxxxxxxxx替换成自己的server_host: your-server-ip-or-domain key: 你的id_ed25519.pub文件内容服务器地址可以填IP也可以填域名。如果填域名建议解析到服务器公网IP上并且做好端口转发。这里的重点坑在于某些版本里还有“中继服务器地址”的独立配置项。很多人只改了ID服务器地址忘了改中继地址结果客户端能注册上线但远程时显示“无法连接中继服务器”。所以改完后要在源码里搜一遍relay server或者hbbr相关配置确保中继地址也指向你的服务器。另外一个容易被忽略的点如果你的服务器有多个网卡或用了Docker映射端口hbbs对外公布的地址可能和内部地址不一致。RustDesk的hbbs启动时可以加-r参数指定对外域名或IP建议服务器端启动时就把对外域名写死这样客户端编译时填同一个域名两边不会打架。4.3 编译命令与产物改完代码进入flutter目录或者按源码说明进入对应目录开始编译Windows客户端flutter build windows --release这一步会先编译Rust核心库再编译Flutter界面最后打包成Windows可执行文件。产物在flutter\build\windows\x64\runner\Release目录下。想做成安装包可以再用Inno Setup之类的工具把整个Release目录打包成一个exe安装程序。如果仅仅是测试直接运行这个目录下的exe即可。打开后主界面会直接显示本机的ID说明服务器配置已经生效——因为客户端在无配置状态下第一屏会提示“未配置服务器”而我们现在编译出来的版本直接进入了正常界面。编译过程中最常见的报错是缺依赖比如cannot find -lpublic这类Qt相关的链接错误、或者某个crate下载不下来。前者通常是环境缺少Qt开发库后者多半是网络问题重试或换成镜像源能解决。遇到报错别慌看最下面几行错误信息网上基本都有现成答案。4.4 验证连接是否成功编译出包后验证流程分两步。第一步在编译机上启动客户端确认主界面ID正常显示第二步用另一台机器装官方原版客户端手动填你的服务器地址和key尝试连接编译机。如果能连通说明服务器端和key都对。再用编译版客户端去连另一台机器验证编译时写入的配置确实生效。这里有个容易踩的坑验证时如果用的是局域网IP两台设备在同一内网下RustDesk会走内网直连发现不了服务器的问题。所以第一轮验证建议让一台设备走公网或用公网服务器做中继强制流量走hbbr这样才能确认整套链路完整。我见过不少人内网测得好好的一搬到外网就拉胯就是因为没验证中继链路。5. 常见问题与排查技巧实录自建RustDesk这套流程我前前后后帮人排查过不少问题踩过的坑总结起来其实就几大类。5.1 key值未知、地址为空、连接超时三类常见故障“key值未知”是出现频率最高的一个。原因基本都是客户端填的key和服务端的id_ed25519.pub内容对不上。有些人复制key时多复制了空格或换行符有些人服务器重新部署时换了密钥对但客户端没更新。排查思路很简单去服务器上重新cat一次key文件和客户端配置逐字符比对。如果是新建服务器第一次启动hbbs时生成的密钥需要妥善备份丢了或换了所有已经下发的客户端都得重新编译配置。“地址为空”意味着客户端配置里没写入有效服务器地址。这种情况在编译版里如果出现八成是源码中对应的配置项没改对位置或者在编译时被其他配置覆盖了。再检查一遍全局搜索的结果确认所有硬编码的官方服务器地址都被替换了。“连接超时”最复杂。先别怀疑客户端用telnet或nc测一下服务器的21115到21117端口是否通。很多情况下是云服务商安全组没放行UDP端口或者本地防火墙没配置。还有一个隐蔽问题某些宽带运营商环境下UDP流量会被限速或丢弃导致信令不畅。这时候可以看看是不是能走TCP——RustDesk新版本部分支持TCP模式但默认还是UDP为主UDP端口不通会非常难排查因为TCP端口检查全通实际就是连不上。5.2 编译依赖失败的几种情况编译失败这块我列个速查表报错特征常见原因处理办法cannot find -lpublicQt开发库缺失或路径不对确认安装Qt对应版本并设置好环境变量crate下载超时网络原因配置rustup镜像源重试版本校验错误RustDesk要求特定版本的工具链按README指定的Rust版本重新设置toolchainFlutter编译失败定位到Dart异常Flutter版本不匹配重装源码指定的Flutter版本或者用fvm切换磁盘空间不足RustDesk编译产物很大release目录加中间产物可能占用几十GB留足50GB以上空间再开始关于编译时间第一次编译大概率跑15到30分钟别中途掐断尤其是最后链接阶段看似卡住其实是在处理Windows符号。我试过用低配云主机编译CPU一直在跑但内存不够导致OOM后来加了swap才过。5.3 升级与后续维护的几个建议自建这套东西不是搭完就一劳永逸后续升级、备份、监控都得跟上。我自己的经验是三个点一是把服务器密钥对视为最重要的资产。id_ed25519这个私钥文件建议额外备份到安全的地方。服务器磁盘坏了不怕重装系统拉个新hbbs起来只要把原来的私钥放回去所有旧客户端依然能连如果私钥丢了所有已分发的客户端全部失效只能重新下发。二是以后升级RustDesk客户端时不要只拉代码就编译。先看新版本的源码结构有没有变化尤其是配置文件的位置和格式。RustDesk版本迭代速度很快有时新版会引入新的配置方式旧版修改源码的做法可能不再适用。我的做法是升级前先看GitHub上的release notes确认没有破坏性变更再动手。三是考虑用构建脚本把这套流程固化下来。编译一次容易反复编译就烦了。我把替换服务器地址和key的步骤写成脚本每次拉完新源码先跑脚本改配置再编译输出固定名称的安装包。这样以后每次升级就是“拉代码、跑脚本、编译、打包”四步省心很多。最后分享一个小技巧编译产物在发给别人之前自己先装一遍走一遍完整的连接流程再交付。远程桌面软件这东西自己环境里再正常换台机器可能就是另一番光景。我印象最深的一次是编译完觉得万事大吉结果别人装上后一直提示连接失败排查了半天才发现是新版客户端默认用了UDP中继而那家公司的网络策略把UDP全封了。从那以后我再也不偷懒凡是发出去的包一定用一条不受控的公网链路完整验证一遍。
返回列表