程方案:編譯客戶端并固化服務(wù)器地址與Key)
最近又把 RustDesk 的自建鏈路完整走了一遍服務(wù)器端自己編譯 hbbs/hbbr客戶端也自己編譯并且把自建 ID 服務(wù)器地址和 key 直接寫進(jìn)了客戶端里。折騰完之后最大的感受是一旦服務(wù)器和 key 不用手動(dòng)填整個(gè)分發(fā)體驗(yàn)完全不一樣——給別人發(fā)一個(gè)安裝包對(duì)方裝上打開(kāi)就能連你自己的服務(wù)器不用解釋什么叫 ID 服務(wù)器、什么叫 key更不用在多個(gè)輸入框之間來(lái)回切。這篇文章我就把整個(gè)過(guò)程中我認(rèn)為最關(guān)鍵的幾個(gè)環(huán)節(jié)包括服務(wù)端部署、客戶端編譯、以及三種把服務(wù)器信息固化進(jìn)客戶端的方法原原本本記錄下來(lái)給打算自己搞一套 RustDesk 遠(yuǎn)程方案的朋友做個(gè)參考。1. 為什么非要把服務(wù)器和 key 編進(jìn)客戶端不可1.1 公共服務(wù)器與自建服務(wù)器的差距RustDesk 官方公共服務(wù)器對(duì)個(gè)人偶爾用一下來(lái)說(shuō)是夠的但一旦你把它當(dāng)日常工具問(wèn)題馬上會(huì)浮現(xiàn)高峰期連接不穩(wěn)、跨地域延遲忽高忽低、中繼帶寬有限。更重要的是數(shù)據(jù)鏈路完全不受你控制這對(duì)企業(yè)用戶或者對(duì)隱私比較敏感的人來(lái)講始終是個(gè)心結(jié)。自建之后整套鏈路都在自己手里客戶端向你的 ID 服務(wù)器注冊(cè)身份、兩個(gè)設(shè)備互相發(fā)現(xiàn)、中繼服務(wù)器轉(zhuǎn)發(fā)流量全走你自己的機(jī)器和帶寬。這在企業(yè)內(nèi)網(wǎng)、跨地域小團(tuán)隊(duì)、或者單純喜歡數(shù)據(jù)可控的個(gè)人場(chǎng)景里價(jià)值非常明顯。1.2 真正的痛點(diǎn)不是部署而是客戶端配置服務(wù)端部署好之后你自己用很簡(jiǎn)單填一下地址和 key 就行。但如果你要把客戶端分發(fā)給同事、客戶或者家里好幾臺(tái)設(shè)備重裝系統(tǒng)問(wèn)題就來(lái)了——非技術(shù)用戶面對(duì)ID 服務(wù)器中繼服務(wù)器Key這幾個(gè)輸入框很容易卡住。key 尤其容易錯(cuò)。它是服務(wù)器生成的 ed25519 公鑰一長(zhǎng)串 base64 字符串復(fù)制粘貼時(shí)前面多一個(gè)空格、或者換行被帶進(jìn)去都會(huì)導(dǎo)致連接失敗界面上彈出一個(gè)很費(fèi)解的提示。我見(jiàn)到的key 值未知錯(cuò)誤多半就是這么來(lái)的。1.3 三種寫入方式的利弊對(duì)比把服務(wù)器地址和 key 固化進(jìn)客戶端常見(jiàn)有三條路編譯期改默認(rèn)值、預(yù)置配置文件、安裝后腳本注入。我分別試過(guò)先給個(gè)對(duì)比。方案侵入性分發(fā)體驗(yàn)適用場(chǎng)景編譯期改默認(rèn)值每次升級(jí)要重新改最好開(kāi)箱即用固定服務(wù)器的團(tuán)隊(duì)長(zhǎng)期使用預(yù)置配置文件/數(shù)據(jù)庫(kù)無(wú)拷貝文件即可好但要在首次啟動(dòng)前放好批量機(jī)器、臨時(shí)分發(fā)界面手動(dòng)填寫無(wú)差依賴使用者操作個(gè)人自用、個(gè)位數(shù)設(shè)備實(shí)際項(xiàng)目中我傾向于組合使用編譯期改默認(rèn)值解決開(kāi)箱即用的問(wèn)題配置文件預(yù)置應(yīng)對(duì)那些老版本客戶端或者不想重新編譯的機(jī)器。2. 服務(wù)端先行hbbs/hbbr 部署與 key 生成2.1 服務(wù)端源碼編譯RustDesk 的服務(wù)端是獨(dú)立倉(cāng)庫(kù)rustdesk-server包含兩個(gè)核心二進(jìn)制hbbs是 ID 服務(wù)器和信令服務(wù)器負(fù)責(zé)設(shè)備注冊(cè)與連接協(xié)商hbbr是中繼服務(wù)器負(fù)責(zé)在無(wú)法直連時(shí)為兩端轉(zhuǎn)發(fā)流量。編譯過(guò)程很簡(jiǎn)單git clone https://github.com/rustdesk/rustdesk-server.git cd rustdesk-server cargo build --release編譯產(chǎn)物在target/release/目錄下我們需要的是hbbs和hbbr這兩個(gè)文件。如果你的服務(wù)器內(nèi)存偏小編譯時(shí)間會(huì)比較長(zhǎng)建議放到 2G 內(nèi)存以上的機(jī)器上操作或者干脆用官方 release 里的預(yù)編譯二進(jìn)制。標(biāo)題既然講自己編譯這里就走源碼編譯路線。2.2 首次運(yùn)行生成 key把hbbs、hbbr放到服務(wù)器的固定目錄比如/opt/rustdesk-server/然后第一次啟動(dòng)cd /opt/rustdesk-server ./hbbs -r your-server.com:21117 ./hbbr第一次運(yùn)行后目錄下會(huì)生成id_ed25519和id_ed25519.pub兩個(gè)文件。id_ed25519.pub里的內(nèi)容就是客戶端設(shè)置界面需要填的那個(gè) key。這串公鑰相當(dāng)于服務(wù)器身份憑證客戶端拿著它才能確認(rèn)自己連的服務(wù)器確實(shí)是你搭的那臺(tái)防止中間人冒充。這里有一個(gè)非常容易踩的坑id_ed25519私鑰必須備份好并且不要隨意刪除。一旦服務(wù)端目錄被清空導(dǎo)致重新生成密鑰所有已經(jīng)配置好的客戶端都會(huì)彈出 key 不匹配的提示全部要重新改配置相當(dāng)痛苦。2.3 端口清單與防火墻放行服務(wù)端需要放行的端口有規(guī)律整理成一張表方便對(duì)照端口協(xié)議用途21115TCPNAT 類型檢測(cè)21116TCP UDP客戶端注冊(cè)與信令交換UDP 為主21117TCPhbbr 中繼數(shù)據(jù)傳輸21118TCPWeb 客戶端支持可選21119TCPWeb 中繼支持可選如果你在云服務(wù)器上部署除了服務(wù)器本身的防火墻iptables/firewalld/ufw還要檢查云控制臺(tái)的安全組規(guī)則兩個(gè)地方都得放行。國(guó)內(nèi)用戶如果喜歡用寶塔面板也要在面板防火墻里同步放行這些端口不然客戶端能 ping 通機(jī)器但連接總是超時(shí)。2.4 用 systemd 守護(hù)進(jìn)程nohup ... 在調(diào)試階段沒(méi)問(wèn)題但生產(chǎn)環(huán)境我更推薦用 systemd 托管防止進(jìn)程掛掉后沒(méi)人管。寫兩個(gè) service 文件分別守護(hù)hbbs和hbbr啟動(dòng)命令里帶上-r參數(shù)指定中繼地址并設(shè)置開(kāi)機(jī)自啟。# /etc/systemd/system/rustdesk-hbbs.service [Unit] DescriptionRustDesk ID Server Afternetwork.target [Service] Typesimple WorkingDirectory/opt/rustdesk-server ExecStart/opt/rustdesk-server/hbbs -r your-server.com:21117 Restartalways RestartSec3 [Install] WantedBymulti-user.targethbbr的 service 文件照葫蘆畫瓢ExecStart 換成/opt/rustdesk-server/hbbr即可。3. 客戶端編譯環(huán)境版本選型與依賴準(zhǔn)備3.1 RustDesk 客戶端的兩個(gè)時(shí)代RustDesk 客戶端源碼變化很大網(wǎng)上教程用的是老版本v1.1.xSciter UI而現(xiàn)在已經(jīng)普遍切換到 Flutter UI 的新版本v1.2、v1.3。兩代產(chǎn)品的編譯方式和源碼路徑都不一樣如果你跟著老教程走很可能會(huì)卡在某一步找不到對(duì)應(yīng)文件。我的建議是直接用當(dāng)前官方 release tag比如 v1.3.x不要盲目追 master。master 分支處于持續(xù)開(kāi)發(fā)狀態(tài)今天能編譯明天可能因?yàn)橐粋€(gè)依賴變更就報(bào)錯(cuò)。鎖定穩(wěn)定版本遇到問(wèn)題也好查。git clone https://github.com/rustdesk/rustdesk.git cd rustdesk git checkout v1.3.x3.2 Linux 編譯環(huán)境在 Linux 下編譯 Linux 客戶端需要準(zhǔn)備 Rust 工具鏈和一堆系統(tǒng)依賴。Rust 安裝用 rustup 官方腳本即可curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh系統(tǒng)庫(kù)方面Ubuntu/Debian 系大致需要這些sudo apt install build-essential pkg-config cmake git \ libgtk-3-dev libssl-dev libasound2-dev libavcodec-dev \ libavformat-dev libavutil-dev libswscale-dev \ libx11-dev libxext-dev libxinerama-dev libxcursor-dev \ libxdamage-dev libxfixes-dev libxi-dev libxkbcommon-dev \ libvpx-dev libopus-dev不同版本的依賴列表會(huì)變最權(quán)威的還是倉(cāng)庫(kù)里的 README 和build.py腳本。我的經(jīng)驗(yàn)是把build-essential、pkg-config、libssl-dev、libgtk-3-dev這幾個(gè)裝好大部分編譯錯(cuò)誤就能消掉一半。3.3 Windows 編譯環(huán)境Windows 下編譯 Windows 客戶端條件會(huì)多一點(diǎn)安裝 Visual Studio Build Tools 2019 或 2022勾選使用 C 的桌面開(kāi)發(fā)工作負(fù)載。安裝 Rust 的 MSVC 工具鏈。安裝 vcpkg并配置VCPKG_ROOT環(huán)境變量。通過(guò) vcpkg 安裝 RustDesk 依賴的 C 庫(kù)比如libvpx。git clone https://github.com/microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg install libvpx:x64-windows-static $env:VCPKG_ROOT C:\path\to\vcpkg在 Windows 上最穩(wěn)妥的編譯方式是用x64 Native Tools Command Prompt for VS打開(kāi)終端再執(zhí)行 cargo 命令。否則容易遇到link.exe找不到的問(wèn)題。3.4 新版 Flutter UI 的額外步驟如果你拉取的是 Flutter UI 版本編譯時(shí)還需要 Flutter SDK。桌面客戶端通常是先編譯 Rust 核心再構(gòu)建 Flutter 界面層。手動(dòng)步驟繁瑣官方提供了build.py腳本建議直接用python build.py --flutter --release這個(gè)腳本會(huì)處理 Rust 和 Flutter 兩部分的構(gòu)建并且自動(dòng)把它們打包成安裝包。如果你想驗(yàn)證自己的代碼修改也可以先只跑cargo build --release構(gòu)建單獨(dú)的 Rust 可執(zhí)行文件。4. 把 ID 服務(wù)器和 key 寫進(jìn)客戶端的三種做法4.1 做法一編譯期改默認(rèn)常量這是最徹底的方案也是標(biāo)題里說(shuō)的寫入客戶端的標(biāo)準(zhǔn)做法。思路很簡(jiǎn)單RustDesk 客戶端源碼里必然存在一組默認(rèn)服務(wù)器地址和默認(rèn) key程序首次啟動(dòng)時(shí)會(huì)讀這些默認(rèn)值。我們只要把它們改成自己的服務(wù)器和公鑰就行。問(wèn)題是不同版本的源碼位置差別很大不能直接告訴你改哪個(gè)文件。我提供的通用定位方法是用 grep 搜索# 在 RustDesk 客戶端源碼根目錄執(zhí)行 grep -rn rustdesk.com --include*.rs src libs 2/dev/null grep -rn rendezvous --include*.rs -i src libs 2/dev/null在 v1.1.x 時(shí)代常見(jiàn)位置是src/common/constants.rs里面會(huì)有一個(gè)類似RENDEZVOUS_SERVER的常量。在較新的版本中這些默認(rèn)值可能挪到了libs/hbb_common/src/config.rs之類的地方。找到之后把默認(rèn)服務(wù)器地址改成你自己的域名或 IP把默認(rèn) key 改成id_ed25519.pub的內(nèi)容。下面是一個(gè)示意性的修改片段不同版本字段名和路徑可能不同核心思路是一樣的// 示意代碼實(shí)際位置以你搜索到的源碼為準(zhǔn) pub const RENDEZVOUS_SERVER: str your-server.com; pub const KEY: str 你的 ed25519 公鑰字符串一長(zhǎng)串 base64;改完重新編譯客戶端一啟動(dòng)就會(huì)拿這些值去連接你的服務(wù)器。這里有個(gè)非常關(guān)鍵的前提目標(biāo)機(jī)器上不能有舊的 RustDesk 配置。如果客戶端已經(jīng)運(yùn)行過(guò)一次本地存儲(chǔ)的配置優(yōu)先級(jí)高于編譯期默認(rèn)值你改半天編譯配置也不會(huì)生效。測(cè)試時(shí)要把~/.config/rustdeskLinux或%APPDATA%\RustDeskWindows刪掉再啟動(dòng)。4.2 做法二預(yù)置配置文件編譯期改默認(rèn)值有個(gè)問(wèn)題每次升級(jí)版本都要重新改、重新編譯。如果你只是想快速批量設(shè)置一批機(jī)器配置文件預(yù)置法更省事。具體流程是這樣的準(zhǔn)備一臺(tái)干凈的測(cè)試機(jī)安裝官方或自編譯的客戶端。打開(kāi)設(shè)置界面手動(dòng)填入 ID 服務(wù)器地址、中繼服務(wù)器地址和 key確認(rèn)能正常連接。關(guān)閉客戶端找到配置文件。Windows 在%APPDATA%\RustDesk\Linux 在~/.config/rustdesk/。把里面保存服務(wù)器信息的文件通常是RustDesk.toml或類似配置復(fù)制出來(lái)作為模板。這里必須提醒一個(gè)非常容易翻車的細(xì)節(jié)不要整個(gè)配置目錄都拷走。config下還有id_ed25519和id_ed25519.pub那是客戶端自己的身份密鑰如果每臺(tái)機(jī)器都用同一份后果就是所有設(shè)備共享同一個(gè)設(shè)備 ID互相搶注冊(cè)連接會(huì)變得一團(tuán)亂。另外數(shù)據(jù)庫(kù)文件包含地址簿等隱私數(shù)據(jù)也不適合批量分發(fā)。正確的做法是只提取跟服務(wù)器、key 相關(guān)的配置內(nèi)容或者干脆把配置好的內(nèi)容做成一個(gè)批處理/Shell 腳本在客戶端首次運(yùn)行前寫入目標(biāo)機(jī)器的配置目錄。Windows 下大致是這樣一個(gè)思路echo off mkdir %APPDATA%\RustDesk\config 2nul echo [options] %APPDATA%\RustDesk\config\RustDesk.toml echo custom-rendezvous-serveryour-server.com %APPDATA%\RustDesk\config\RustDesk.toml echo keyyour-public-key %APPDATA%\RustDesk\config\RustDesk.toml字段名還是那句話以你實(shí)際配置生成的真實(shí)文件為準(zhǔn)不要照抄網(wǎng)上任何一個(gè)模板。每個(gè)版本的存儲(chǔ)結(jié)構(gòu)都可能調(diào)整最穩(wěn)的方法永遠(yuǎn)是先手動(dòng)配置再?gòu)?fù)制真實(shí)內(nèi)容。4.3 做法三安裝后腳本注入做法三適合已經(jīng)裝好客戶端、跑過(guò)幾次但配置不對(duì)的場(chǎng)景。它的本質(zhì)跟做法二差不多只是把寫入配置的時(shí)機(jī)從首次啟動(dòng)前挪到安裝之后??梢杂门幚砟_本、PowerShell 腳本或者組策略來(lái)推送配置文件。如果你管理了一批已然運(yùn)行過(guò)客戶端的電腦刪配置目錄會(huì)影響它們的設(shè)備身份所以我不建議直接刪了重來(lái)而是只更新配置文件里服務(wù)器和 key 相關(guān)的條目然后重啟客戶端。這種方式的好處是不用重新編譯壞處是命令行里寫明文 key腳本本身的保管要注意權(quán)限別讓無(wú)關(guān)人員看到你的服務(wù)器公鑰和地址。其實(shí)公鑰本身不算敏感但配合服務(wù)器地址暴露在公網(wǎng)上容易被別人掃描利用后面講安全時(shí)再說(shuō)。4.4 我的選擇編譯期為主配置兜底三種方式按實(shí)際使用場(chǎng)景分開(kāi)自己主力機(jī)、給家人朋友分發(fā)編譯期改默認(rèn)值一勞永逸。給公司同事批量部署預(yù)置配置腳本推送節(jié)省重編譯成本。臨時(shí)幫別人調(diào)一下遠(yuǎn)程指導(dǎo)手動(dòng)填或者腳本修一下配置。我最推薦的組合是編譯期默認(rèn)值 配置文件雙保險(xiǎn)。編譯期保證全新安裝的機(jī)器開(kāi)箱即連配置文件應(yīng)對(duì)那些需要差異化覆蓋的單臺(tái)機(jī)器。5. 完整編譯流程與實(shí)測(cè)記錄5.1 Linux 下編譯 Linux 客戶端我在一臺(tái) Ubuntu 22.04 機(jī)器上完整跑過(guò)一次記錄一下流程# 1. 安裝系統(tǒng)依賴 sudo apt update sudo apt install build-essential pkg-config cmake git \ libgtk-3-dev libssl-dev libasound2-dev libavcodec-dev \ libavformat-dev libavutil-dev libswscale-dev \ libx11-dev libxext-dev libxinerama-dev libxcursor-dev \ libxdamage-dev libxfixes-dev libxi-dev libxkbcommon-dev \ libvpx-dev libopus-dev # 2. 安裝 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env # 3. 拉源碼并切換到穩(wěn)定版本 git clone https://github.com/rustdesk/rustdesk.git cd rustdesk git checkout v1.3.x # 4. 修改默認(rèn)服務(wù)器地址和 key按第四章做法一 # 5. 編譯 cargo build --release編譯產(chǎn)物在target/release/rustdesk。首次編譯時(shí)間比較長(zhǎng)取決于機(jī)器性能二十分鐘到一小時(shí)都正常建議耐心等不要中途 CtrlC。我看到很多新手在編譯時(shí)看到一長(zhǎng)串 warning 就以為報(bào)錯(cuò)了其實(shí)只要最后沒(méi)有error字樣就是成功。在啟動(dòng)自己編譯的客戶端之前務(wù)必先清理舊配置rm -rf ~/.config/rustdesk然后運(yùn)行./target/release/rustdesk打開(kāi)設(shè)置界面就能看到服務(wù)器地址已經(jīng)變成了自己填的那個(gè)。5.2 Windows 下編譯 Windows 客戶端Windows 編譯流程我在一臺(tái) Windows 11 機(jī)器上跑過(guò)。重點(diǎn)是要用 VS 的開(kāi)發(fā)者命令行否則后面鏈接階段會(huì)找不到環(huán)境變量。git clone https://github.com/rustdesk/rustdesk.git cd rustdesk git checkout v1.3.x # 設(shè)置 vcpkg 環(huán)境變量如果還沒(méi)設(shè)置 $env:VCPKG_ROOT C:\vcpkg # 編譯 cargo build --release編譯產(chǎn)物在target\release\rustdesk.exe。如果是 Flutter UI 版本可以先執(zhí)行python build.py --flutter --release最終產(chǎn)物在target\release\下。5.3 我踩過(guò)的編譯錯(cuò)誤把幾個(gè)典型報(bào)錯(cuò)和處理方式整理出來(lái)應(yīng)該能幫大家省不少時(shí)間。錯(cuò)誤現(xiàn)象原因解決辦法link.exe not found或找不到 MSVC 鏈接器沒(méi)有使用 VS 開(kāi)發(fā)者命令行打開(kāi) x64 Native Tools Command Prompt 再執(zhí)行 cargovcpkg 安裝依賴超時(shí)失敗網(wǎng)絡(luò)原因或依賴較多重試必要時(shí)配置鏡像源OpenSSL 頭文件找不到缺少libssl-dev/pkg-configLinux 安裝libssl-devWindows 通過(guò) vcpkg 安裝 opensslFlutter 構(gòu)建報(bào)錯(cuò)或卡住Flutter 版本不一致或依賴未拉取執(zhí)行flutter upgrade flutter pub get磁盤空間不足Rust 編譯緩存很大清理target目錄或用外置盤做編譯還有一個(gè)通用建議編譯這類大型 Rust 項(xiàng)目把CARGO_HOME和target目錄放到空間充足的磁盤上SSD 優(yōu)先。機(jī)械硬盤編譯 RustDesk 會(huì)讓人懷疑人生。5.4 驗(yàn)證編譯產(chǎn)物確實(shí)寫入了默認(rèn)配置編譯完成后怎么確認(rèn)默認(rèn)值真的生效可以先用一個(gè)干凈環(huán)境運(yùn)行客戶端然后直接看設(shè)置界面顯示的是不是你自己的服務(wù)器。更快的辦法是在源碼里搜索替換后的字符是否還在grep -rn your-server.com target/release/ 2/dev/null不過(guò)二進(jìn)制里字符串不一定明文可見(jiàn)最靠譜的還是實(shí)機(jī)驗(yàn)證。我自己的測(cè)試流程是清空配置目錄、啟動(dòng)客戶端、觀察日志、開(kāi)兩臺(tái)設(shè)備實(shí)際連一次。兩臺(tái)設(shè)備建立連接的那一刻整套方案才算真正跑通。6. 上線后的排查手段與安全邊界6.1 key 值未知的完整排查鏈路這個(gè)報(bào)錯(cuò)可能是 RustDesk 自建玩家最常見(jiàn)的求助熱點(diǎn)。所謂key 值未知本質(zhì)是客戶端本地保存的 key 和服務(wù)器實(shí)際公鑰對(duì)不上。排查鏈路按順序走一遍登錄到服務(wù)器進(jìn)入 hbbs 部署目錄用cat id_ed25519.pub查看當(dāng)前公鑰。在客戶端設(shè)置界面把 key 更新為剛才看到的完整字符串。復(fù)制時(shí)注意開(kāi)頭結(jié)尾有沒(méi)有多出空格、是不是被換行截?cái)嗔恕H绻潞笕匀粓?bào)錯(cuò)關(guān)閉客戶端刪除本地配置目錄再重新啟動(dòng)輸入。如果服務(wù)器有多臺(tái)實(shí)例、或者曾經(jīng)把舊目錄拷貝過(guò)確保客戶端連的確實(shí)是生成這份公鑰的那臺(tái)機(jī)器。我遇到最多的情況是服務(wù)端透過(guò)寶塔或者其他面板重啟過(guò)目錄被重建密鑰重新生成了客戶端還拿著舊 key 在連接。備份的重要性在這里體現(xiàn)得很充分。6.2 連不上 ID 服務(wù)器時(shí)的排查鏈路客戶端如果一直顯示無(wú)法連接服務(wù)器不要急著懷疑源碼。按這個(gè)順序查檢查端口是否可達(dá)nc -z -v your-server.com 21115 nc -z -v your-server.com 21116 nc -z -v your-server.com 21117檢查服務(wù)器防火墻ufw status或firewall-cmd --list-all確認(rèn) 21115-21119 已放行。檢查云安全組很多云廠商的安全組默認(rèn)全關(guān)單獨(dú)放行端口才有效。查看 hbbs 日志啟動(dòng) hbbs 時(shí)不要加--quiet日志里會(huì)打印客戶端注冊(cè)、注冊(cè)失敗的詳細(xì)信息。有個(gè)容易被忽略的坑21116 端口同時(shí)需要 TCP 和 UDP 放行。很多網(wǎng)絡(luò)環(huán)境只放行 TCP客戶端能完成一部分握手但后續(xù)的 UDP 通信直接被丟現(xiàn)象就是反復(fù)超時(shí)。6.3 中繼服務(wù)器不轉(zhuǎn)發(fā)的幾個(gè)原因兩臺(tái)設(shè)備無(wú)法直連時(shí)流量會(huì)走 hbbr。中繼不工作現(xiàn)象是對(duì)方設(shè)備一直顯示連接中然后失敗。常見(jiàn)原因21117 端口沒(méi)放行客戶端與 hbbr 建立不了連接。客戶端填的中繼服務(wù)器地址不對(duì)。新版客戶端可以單獨(dú)設(shè)置中繼服務(wù)器務(wù)必和 hbbs 的-r參數(shù)保持一致。hbbr 進(jìn)程沒(méi)起來(lái)或死循環(huán)了。ps aux | grep hbbr看一眼配合 systemd 的Restartalways解決。如果確認(rèn)端口和進(jìn)程都正常用兩臺(tái)不同網(wǎng)絡(luò)環(huán)境比如一個(gè)在移動(dòng)網(wǎng)絡(luò)、一個(gè)在寬帶的設(shè)備再測(cè)一次很多時(shí)候是測(cè)試環(huán)境里兩臺(tái)機(jī)器其實(shí)可以直連流量根本沒(méi)走中繼導(dǎo)致你以為中繼壞了。6.4 安全邊界與隱私保護(hù)RustDesk 的 key 機(jī)制需要澄清一個(gè)概念key 是服務(wù)器身份公鑰不是訪問(wèn)密碼。拿到服務(wù)器地址和公鑰的人可以嘗試向你的 ID 服務(wù)器注冊(cè)自己的設(shè)備所以服務(wù)器暴露在公網(wǎng)上時(shí)必須有額外的保護(hù)意識(shí)。幾個(gè)我自己長(zhǎng)期在用的安全習(xí)慣id_ed25519私鑰視為最高機(jī)密絕不公開(kāi)、不隨客戶端分發(fā)。如果條件允許在服務(wù)器防火墻層面限制來(lái)源 IP。只給自己固定出口 IP 放行 21115-21119能擋掉大量掃描。每臺(tái)被控設(shè)備設(shè)置強(qiáng)訪問(wèn)密碼。這是連接設(shè)備時(shí)真正起攔截作用的憑證。定期備份 hbbs 部署目錄。密鑰丟了或變了所有客戶端都要重新配置代價(jià)太大。域名和服務(wù)器 IP 盡量不要頻繁變更??蛻舳死飳懰赖牡刂芬坏┳兏瑯有枰匦屡渲谩?.5 順手還能改的客戶端名稱與圖標(biāo)既然已經(jīng)走到編譯客戶端這一步很多人會(huì)順手把軟件名稱、圖標(biāo)一起改掉讓整個(gè)工具看起來(lái)更像自家產(chǎn)品。這個(gè)需求一般涉及資源文件和界面文案Windows 圖標(biāo)和版本信息在.rc資源文件里Flutter UI 的文字在flutter/lib/下的源碼里。改起來(lái)不難但每次升級(jí)版本都要維護(hù)一份 patch個(gè)人自用的話自己權(quán)衡一下值不值。最后的幾點(diǎn)體會(huì)把服務(wù)器地址和 key 編進(jìn)客戶端這個(gè)事真正做起來(lái)比想象中簡(jiǎn)單難點(diǎn)反而在版本差異的適配和舊配置的清理上。我個(gè)人現(xiàn)在已經(jīng)養(yǎng)成了習(xí)慣拿到新版本源碼先 grep 默認(rèn)服務(wù)器常量的位置改完再編譯同時(shí)保留一份配置文件模板用于那些沒(méi)法重編譯的環(huán)境。整套方案跑順之后RustDesk 的使用體驗(yàn)基本可以做到發(fā)給別人就用不用任何解釋。最后再提醒一句最關(guān)鍵的話服務(wù)器端id_ed25519私鑰千萬(wàn)保管好丟一次所有客戶端的 key 都要跟著重配那種批量改配置的酸爽體驗(yàn)過(guò)一次就再也不想體驗(yàn)第二次了。