rice-awa/dsh-lan-gateway:把 DSH Web GUI 安全開放到局域網/公網的插件

前言

DSH 的 Web GUI 面向本機迴環地址使用時,開發者很難直接從其他設備打開。直接讓 DSH 監聽 0.0.0.0 又容易把 Web API 暴露到不可信網絡。

rice-awa/dsh-lan-gateway 用反向代理網關處理這個矛盾:讓 DSH 本身繼續只綁 127.0.0.1,由插件另起 0.0.0.0 網關轉發到 loopback 端口,並對 LAN 與非 LAN 來源採取不同策略。

下面介紹它的安裝、啓用和配置方式。

這是什麼

rice-awa/dsh-lan-gateway 是一個 DSH 插件,owner 爲 rice-awa,許可爲 MIT。

它把 DeepSeek Harness 的 Web GUI 安全地開放到局域網 / 公網。插件提供反向代理、登錄頁、會話校驗、可選 TLS、設置頁卡片,以及對話中的 lan_gateway 管理入口。

DSH 生態強調「一切皆插件」;社區目錄是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。

核心功能

反向代理與來源分級

插件先讓 dsh 繼續只綁 127.0.0.1,再由插件另起 0.0.0.0 反向代理網關,轉發到 dsh 的 loopback 端口。

它會改寫 Host/Origin,以通過 /api 信任圍欄。

來源分級只依據 socket.remoteAddress,絕不信任 X-Forwarded-For。

  • LAN 與 loopback 來源免密代理。
  • 非 LAN 來源必須先完成登錄頁,並出示 HMAC cookie。

登錄與會話

網關提供 /__login 登錄頁,密碼以 scrypt 校驗。

登錄嘗試按來源限流 5 次 / 分鐘。

會話 cookie 使用 HMAC-SHA256,並帶:

HttpOnly; SameSite=Lax

會話可以用 lan_gateway rotate-secret 作廢。

如果 authRequired: true 且未設置密碼,enable 會拒絕監聽,避免把遠程代碼執行的門戶開放給非 LAN 來源。

TLS

插件提供兩種 TLS 模式:

  • self-signed:自動生成並持久化自簽名證書。
  • custom:掛載自己的 PEM 證書與私鑰。

自簽名證書首次訪問會看到瀏覽器警告,屬預期行爲。

啓用 TLS 後:

  • 登錄 cookie 自動帶 Secure。
  • 網關自身響應帶 HSTS。
  • 轉發到 dsh 的 loopback 連接仍爲明文 HTTP。

設置與對話管理

官方設置頁卡片可配置端口、網段、認證、TLS,保存即熱生效。

插件還提供 lan_gateway 工具,可在 dsh 對話中管理網關。

同時提供 lan-gateway 配套 skill。

密碼哈希、cookie secret 存:

~/.dsh/lan-gateway/state.json

密鑰不進配置。

請求兼容與 CSRF 圍欄

插件會爲網關純 HTTP 頁面補 crypto.randomUUID。

對 /api* 請求,網關會自檢 sec-fetch-site 與 Origin 是否匹配;跨站請求直接 403。

WebSocket /api 升級請求同樣先過登錄校驗,再轉發給 dsh。

安裝

npm 包爲預構建產物,安裝時不需要批准構建腳本。若仍提示,可按 INSTALL.md 寫入 allowBuilds。

dsh plugin --profile web add @riceawa/dsh-lan-gateway

安裝後,插件默認不監聽網絡端口;enabled 默認爲 false。

啓用

先開啓網關:

lan_gateway enable

查看狀態:

lan_gateway status

設置非 LAN 訪問密碼:

lan_gateway set-password

重新生成自簽名 TLS 證書:

lan_gateway tls-regenerate

關閉網關:

lan_gateway disable

也可以在 dsh 對話中直接說:

  • 設置網關密碼爲……
  • 查看網關狀態
  • 開啓 / 關閉網關

經過上面的步驟,網關會按當前配置監聽網絡端口,並對非 LAN 來源要求登錄。

配置示例

在 DSH Settings → Plugins → 可配置插件 中展開「LAN 網關」卡片修改配置,保存即生效。

下面示例開啓自簽名 TLS:

- id: dsh-lan-gateway
  config:
    enabled: true
    gatewayPort: 8443
    tlsEnabled: true
    tlsMode: self-signed
    tlsSelfSignedHosts: localhost, 192.168.1.5

使用自己的 PEM 證書與私鑰時,可以改成 custom 模式:

- id: dsh-lan-gateway
  config:
    tlsEnabled: true
    tlsMode: custom
    tlsCertPath: /path/to/cert.pem
    tlsKeyPath: /path/to/key.pem

其中 tlsCertPath 填 PEM 證書路徑,tlsKeyPath 填 PEM 私鑰路徑。

適用場景與注意

適合:

  • 需要在本機以外的設備訪問 DSH Web GUI 的開發者。
  • 希望 LAN 免密、非 LAN 登錄的局域網或公網使用。
  • 需要可選 TLS,並希望通過設置頁管理網關配置的使用者。

注意:

  • 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。
  • 默認關閉,只有運行 lan_gateway enable 後才監聽網絡端口。
  • 非 LAN 來源依賴登錄頁與會話 cookie;未設置密碼時開啓會被拒絕。
  • 來源分級只依據 socket.remoteAddress,絕不信任 X-Forwarded-For。
  • 自簽名證書首次訪問會觸發瀏覽器警告,屬預期行爲。
  • 轉發到 dsh 的 loopback 連接仍爲明文 HTTP,依賴本機迴環隔離。
  • 移動端訪問推薦同時安裝 dsh-web-mobile 配合使用。

資源

  • GitHub:https://github.com/rice-awa/dsh-lan-gateway
  • 社區目錄:https://www.skillhub.cn/plugins/rice-awa/dsh-lan-gateway
羽毛球分组比赛记分
小程序二维码

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

小夜