dsh-access-gateway:給 DSH Web GUI 加一個局域網入口

前言

DSH 自身只監聽 loopback,也不接受通配的 --host,所以 Web GUI 默認只有本機能訪問。想在局域網裏用手機或平板打開面板,要麼手動加 --trusted-host,要麼起一個會改寫 Host 的 HTTP 代理。前者容易漏配,後者多一層維護。

下面介紹的 miiy/dsh-access-gateway 就是爲這個場景做的:它在本機起一個帶密碼的監聽端口,登錄通過後把瀏覽器轉發到 loopback 上的 GUI,並自動帶上當前進程的 launch token。

這是什麼

dsh-access-gateway 由 miiy 維護,走社區目錄 skillhub.cn 分發,倉庫地址 https://github.com/miiy/dsh-access-gateway,許可證 MIT,當前版本 0.1.0。它解決的問題只有一個:讓局域網內其他設備能訪問 DSH Web GUI,同時不需要手工傳遞 token。

DSH 的生態理念是「一切皆插件」,這個插件屬於客戶端 bundle,同時向宿主進程註冊運行時行爲。目錄站是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。

核心功能

  1. 密碼門監聽:默認監聽端口 3081,未帶 gateway cookie 的請求先收到一個密碼頁,通過後返回 302 到 /?token=<launch token>,並向瀏覽器寫入 cookie。
  2. 令牌不由終端設備處理:轉發時用的是當前 DSH 進程的 launch token,手機、平板不需要知道這個 token。
  3. 字節管道轉發:每個連接只讀第一次請求的請求頭,驗證通過後後續流量直接按字節搬運,因此 HTTP keep-alive 和 WebSocket 升級都能正常工作,網關不需要理解這兩種協議。
  4. 運行時註冊可信來源:插件啓動時把自己監聽的地址登記進 Host 的 accepted-authority 列表,/api 和 WebSocket 因此接受瀏覽器發來的 Host 頭,宿主不需要額外啓動參數。改成 0.0.0.0 時所有接口地址都會被登記。
  5. 登錄頁跟隨 GUI 主題:登錄頁內聯了 Web GUI 主題的 token,跟隨系統深淺色,文案按 Accept-Language 輸出中文或英文。
  6. 密碼以哈希存儲:Host 只存 scrypt 哈希,不存明文;密碼錯誤時回答前固定等待 600 ms。

安裝與啓用

安裝有兩條路,差別在於是否同時啓用。

第一種,讓 agent 調用宿主的 installBundle,一步完成安裝、寫入 dsh.profile.bundles 並熱生效:

install the plugin `github:miiy/dsh-access-gateway`

也可以在 Settings → Plugins 的安裝框裏粘貼同一段 spec。

第二種,用 CLI 安裝,這一步只裝包,不會組合進 profile:

dsh plugin --profile <profile> add github:miiy/dsh-access-gateway

之後需要到 Settings → Plugins 打開開關,纔會加入 dsh.profile.bundles;如果開關沒有實時生效,重啓一次 dsh web。本地 checkout 也可以安裝:

dsh plugin --profile <profile> add /path/to/dsh-access-gateway

這個 bundle 是純 JavaScript、沒有構建腳本,所以從 git 安裝時不需要 allowBuilds 審批。

裝好後照常啓動宿主即可,不需要額外啓動參數。

典型用法

裝完在 Settings → Plugins 裏啓用,然後去 Web GUI 的 Settings 頁,找到 Access 一節。這裏顯示監聽是否在線以及入口 URL,並在地址欄下面把本機各網卡地址做成按鈕,點一下就填入,不用靠記憶敲 IP。要改的四項是地址、端口、會話時長和密碼,一個表單一個保存按鈕,保存後監聽立即重開,不需要重啓 Host。

設置完從局域網另一臺設備打開入口地址(例如 http://192.168.0.10:3081),輸入密碼登錄一次,後續默認保留 30 天。端口默認是 3081,需要和 Web GUI 自己的端口區分開。

如果不設密碼,入口就不出現登錄頁:任何能連上該地址的請求都直接進入 GUI。在完全信任的網絡上這樣最方便,在不可信網絡上這樣不正確。

想徹底跳過網關驗證的,可以用 --trusted-host 手工指定來源,插件發現宿主沒有可擴展的 accepted-authority 列表時會把結果記進日誌:

dsh --profile web --trusted-host 192.168.0.10

配置項

Settings 頁保存的配置寫在 ~/.dsh/dsh-access-gateway/settings.json,優先級高於下面這些默認值:

鍵 默認值 含義
bind '' 監聽地址。空值用機器報出的第一個非 loopback IPv4;0.0.0.0 監聽所有接口;填具體地址則只綁那一個,比如某個 VPN 地址。
port 3081 監聽端口。不要和 GUI 的端口重複。
password '' 網關密碼,至少 4 個字符。留空則入口無驗證,能連上地址的人都能進。
sessionDays 30 一次登錄有效的天數。

上游地址從 webServer 服務讀取,所以這套配置裏不會出現 GUI 的端口。

安全與限制

需要清楚的地方:

  1. 監聽是明文 HTTP,應只用於可信網絡或 VPN;要對外暴露就自己在前置加 TLS。
  2. 密碼是可信網絡與 GUI 之間唯一的屏障,未設密碼時 Host 會打警告日誌,Settings 裏也會把入口標爲 open。
  3. 網關跑在 Host 進程內,因此可以讀到 launch token;它不持有其他憑據,密碼只存哈希。
  4. gateway cookie 的簽名密鑰放在 ~/.dsh/dsh-access-gateway/secret.json(權限 0600),所以宿主重啓後已登錄狀態仍然有效。
  5. 每個 profile 只支持一個地址,需要兩個接口同時響應就得建兩行,分別給不同的 bind 和 port。
  6. 沒有 TLS、沒有隧道、沒有二維碼,它是給已信任的網絡用的入口,不是把 GUI 發佈到公網的工具。

適用場景與注意

適合:DSH 跑在家裏或辦公室局域網裏,想在手機、平板或第二臺電腦上打開 Web GUI 做查看、配置的人;不想手工維護 --trusted-host,也不想爲遠程訪問單獨起代理的人。

安裝前建議:這個插件以當前 DSH 進程的權限運行,能讀到進程內的 launch token。裝之前先在倉庫裏看一遍源碼,許可證是 MIT,確認沒有超出預期的行爲再啓用;從第三方來源拿到的安裝 spec 同理。倉庫當前星標爲 0,使用者不多,遇到問題建議直接在 GitHub Issues 反饋。

結尾

這個插件做得很收斂:不碰協議語義,只做一次密碼校驗加一次字節轉發,順帶解決了 Host 頭的可用性問題。如果你只需要局域網入口,它比手工配置 --trusted-host 少一步,比完整 HTTP 代理少一層維護。

  • 目錄頁:https://www.skillhub.cn/plugins/miiy/dsh-access-gateway
  • 倉庫:https://github.com/miiy/dsh-access-gateway
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜