前言¶
DSH 的 Web UI 默認只監聽迴環地址,也就是隻有本機能訪問。想在局域網裏的另一臺電腦、平板上打開它,通常得自己搭一層反向代理:單獨起進程、改配置文件、處理 token 鏈接和 WebSocket 轉發,dsh 一重啓還得跟着折騰。
dsh-lan-proxy 把這件事做成了插件:開關、狀態和啓動日誌直接嵌在 dsh 設置頁裏,隨 dsh 啓停,不需要單獨維護一個進程。下面介紹它的功能、安裝和用法。
這是什麼¶
dsh-lan-proxy 是由 liveqte 維護的 DSH 插件,採用 MIT 許可證。它的核心工作是把只監聽 127.0.0.1 的 dsh Web UI 通過 0.0.0.0 反代暴露到局域網,同時把局域網訪問會遇到的一系列適配問題(鑑權、協議、目錄選擇)一併處理掉。
DSH 的理念是「一切皆插件」,這個插件也遵循這個思路:不改變 dsh 本身的監聽行爲,而是以反代的方式在外層解決。
核心功能¶
- 局域網反代:將 dsh Web UI 同時監聽
0.0.0.0:<port>,局域網內任何設備經http://<局域網IP>:<port>/訪問。 - 免配置開關:設置頁「局域網反代」tab 一鍵開關,即時熱啓停,無需重啓 dsh。
- 端口配置:tab 內直接修改監聽端口與上游端口,保存即生效。
- 協議適配:自動改寫 Host/Origin 爲迴環、橋接 WebSocket(RFC6455 幀編解碼)、注入
crypto.randomUUIDpolyfill(局域網 HTTP 屬於非安全上下文,缺少這個 API)。 - 瀏覽器鑑權適配:自動完成 dsh web 的 token↔cookie 交換,局域網首次訪問無感,不需要手動打開帶 token 的鏈接。
- 網頁端目錄選擇:禁用原生 OS 文件夾對話框,固定爲網頁內嵌「選擇工作區目錄」瀏覽,這樣在遠程機器上也能選宿主目錄。
- 狀態與日誌:2 秒輪詢的運行狀態、上游可達性探測、局域網地址列表與啓動日誌,內置「重啓反代」按鈕。
安裝與啓用¶
安裝命令如下:
dsh plugin --profile web add "github:liveqte/dsh-lan-proxy#main"
bundle 層棧在啓動時組合,所以裝完需要重啓 dsh web 才生效。驗證兩點:設置頁導航出現「局域網反代」一級菜單;啓動日誌中沒有 plugin tree failed to load。
運行環境要求 Node >= 20。
典型用法¶
1、開關局域網訪問
進入設置頁的「局域網反代」tab,切換「監聽局域網訪問」。頁面開關的即時狀態會寫入運行時文件 $DSH_HOME/profiles/web/lan-proxy.runtime.json(優先級高於配置默認值),立即生效。
2、從局域網訪問
在局域網內其他設備打開:
http://<局域網IP>:<監聽端口>/
默認監聽端口是 3080。
3、調整端口
tab 內可直接修改兩類端口:
- 監聽端口:綁定所有網卡;
- 上游端口:指向
127.0.0.1,設爲0表示自動取 dsh 實際監聽端口。
4、選擇工作區
裝上插件後,側邊欄 / 會話區的「添加工作區」改爲網頁內嵌目錄瀏覽器(宿主文件系統列舉 + 新建文件夾),不再彈出 OS 對話框。這樣局域網 / 遠程瀏覽器也能選目錄;本機 127.0.0.1 訪問同樣走內嵌對話框。
配置項¶
配置項及默認值如下:
| 鍵 | 默認值 | 說明 |
|---|---|---|
enabled |
false |
監聽局域網訪問(配置默認值;頁面開關優先級更高並持久化到運行時文件) |
port |
3080 |
反代監聽端口(所有網卡) |
upstreamPort |
0 |
上游端口,0 = 自動取 dsh 實際監聽端口 |
maxLogLines |
500 |
頁面日誌緩衝行數 |
bypassRules |
見下 | 前端 JS 改寫規則表 |
配置覆蓋寫在 profile 層的 cordis.patch.yml(id: lan-proxy 行的 config),不需要修改倉庫內文件。
設置頁封鎖的繞過¶
dsh 0.1.x 的瀏覽器端只爲迴環地址加載設置面(connection.isLoopback)。從局域網訪問「設置 → 模型」會得到:加載提供方目錄失敗: settings are unavailable in this browser。
dsh-lan-proxy 的處理方式:反代在轉發 /plugins/<id>/client.js 字節流時,按規則表改寫其 JS,把封鎖判定固定爲迴環;服務端 /api 的柵欄按 Host 頭判定,而反代已把 Host 改回 127.0.0.1,服務端天然放行。這是改動瀏覽器實際執行字節的補丁,與插件加載順序無關。
內置規則(dsh 0.1.x)只有一條:dsh-client-connection:isLoopback-mirror,把 dsh-client-connection client 裏的 isLoopback: pageLocation… 改爲 isLoopback: true,使設置/模型/憑據面正常讀寫。官方換一種封鎖方式時,在配置里加一條 find/replace 規則即可(或覆蓋 bypassRules 表);舊規則 find 不中會自動跳過並在日誌面板提示。規則狀態(命中次數/最後錯誤)出現在「局域網反代」設置頁的運行狀態裏。
適用場景與注意¶
適合這些場景:在局域網內其他設備(另一臺電腦、平板)上使用 dsh Web UI;不想爲反代單獨維護一個進程;需要在遠程瀏覽器上選擇宿主機的工作區目錄。
使用前注意幾點:
- 開關與端口修改接口僅限本機迴環地址調用;局域網訪問只能讀狀態與日誌。即便如此,把服務暴露到局域網意味着同一網絡內的設備可以訪問你的 dsh Web UI,請在可信網絡環境中使用。
- 插件以當前 dsh 進程權限運行,安裝前建議檢查其源碼與許可證。本項目採用 MIT 許可證。
- 插件針對 dsh 0.1.x 的封鎖方式做了內置繞過規則,官方行爲變化後需要通過
bypassRules自行補充規則。
結尾¶
dsh-lan-proxy 解決的是一個很具體的問題:讓 dsh Web UI 在局域網內可訪問,同時把鑑權、協議、目錄選擇這些邊角適配一次做完,並且不引入額外進程。如果你有遠程使用 dsh 的需求,可以直接試。
- 社區目錄頁:https://www.skillhub.cn/plugins/liveqte/dsh-lan-proxy
- GitHub 倉庫:https://github.com/liveqte/dsh-lan-proxy