dsh-lan-proxy:dsh 進程內的反向代理插件

DSH 禁止使用 --host 0.0.0.0,這導致開發者很難在本地或局域網內直接訪問 dsh 的網頁界面。dsh-lan-proxy 插件運行在 dsh 進程內部,對外提供 HTTP/HTTPS 監聽,將請求轉發至 dsh 的迴環服務。它是一個純 ESM 插件,支持雙棧監聽,能處理 TLS 證書和 IP 白名單。

安裝

通過官方插件命令安裝,安裝後需重啓 dsh 進程。

# 從 GitHub 安裝
dsh plugin --profile web add github:mariGoIds/dsh-lan-proxy#v1.1.0

# 或從本地目錄安裝
dsh plugin --profile web add file:/path/to/dsh-lan-proxy

核心功能

插件運行在 dsh 進程內,默認僅監聽本機。開啓配置後,可對外提供 HTTP/HTTPS 轉發,主要特性包括:

  • 雙棧監聽:同時監聽 IPv4 和 IPv6。
  • 訪問控制:支持 IP 白名單(前綴/精確 IP)免密直連。
  • TLS 支持:默認監聽端口 3443,支持證書,證書缺失或端口占用時只跳過對應監聽,不終止 dsh。
  • 一次性登錄碼:生成僅限本機查看的登錄碼,用一次即作廢,適合手機等臨時設備。
  • 設備管理:爲每臺設備分配獨立令牌,支持單獨撤銷和有效期控制。
  • 日誌與適配:自動脫敏日誌中的敏感參數;修復 dsh 設置頁在反向代理下的持久化問題(patchClientBundle)。

配置方式

配置通過 cordis.patch.yml 覆蓋。默認安全策略爲空(無白名單、無登錄碼)。

- id: lan-proxy
  config:
    listenHost: '::'
    httpListenHost: '127.0.0.1'
    listenPort: 3080
    tlsPort: 3443
    backendHost: 127.0.0.1
    backendPort: 3081
    allowedPrefixes: ['192.0.2.']   # 免密可信網段
    allowedIps: [198.51.100.25]
    cookieName: dsh_auth
    accessLog: true
    accessLogFile: ''               # '' = 僅進 dsh 日誌器;非空則落盤
    certDir: ''                     # '' = $DSH_HOME/certs
    forwardUntrusted: false         # true = 非白名單放行給 dsh
    patchClientBundle: true
    autoLogin: 'trusted'            # 'off' | 'trusted' | 'always'
    codeLogin: false
    codeLength: 6
    codeLeaseMinutes: 5
    codeMaxFails: 5
    codeGlobalMaxFails: 20
    codeLockMinutes: 10
    codeSessionDays: 30
    maxDevices: 20
    deviceStateFile: ''             # '' = $DSH_HOME/lan-proxy-devices.json

關鍵配置說明

  • listenHost: 綁定地址,:: 表示雙棧(IPv4 + IPv6)。
  • autoLogin: 自動代取 dsh 網頁 token。'off' 不干預,'trusted'(默認)僅對白名單自動登錄,'always' 對所有來源自動登錄。開啓 'always' 時必須配合 IP 白名單或登錄碼,否則等同於無認證。
  • codeLogin: 開啓一次性登錄碼功能。
  • forwardUntrusted: 決定非白名單來源的處理方式。false 返回 403,true 放行給 dsh。

訪問判定邏輯

插件按以下順序判定訪問權限:

  1. IP 白名單:如果 IP 在 allowedPrefixes 或 allowedIps 中,直接放行。
  2. 登錄碼校驗:如果未在白名單且開啓了 codeLogin,檢查設備會話 Cookie,無效則跳轉登錄頁。
  3. 信任轉發:如果未在白名單且未開啓 codeLogin,根據 forwardUntrusted 決定是否放行給 dsh。

一次性登錄碼

非白名單設備(如手機)可通過一次性登錄碼訪問。在 http://127.0.0.1:3080/__lan_code 或 DSH 設置頁生成。

碼是純數字且租期內有效,必須配合失敗限流。限流分爲兩層:codeMaxFails 按單 IP 計數,codeGlobalMaxFails 按全部來源合計計數。達到全局上限後全局鎖定,並隨時間指數退避(上限 24 小時)。

已授權設備

每臺通過登錄碼授權的設備各持一個獨立令牌,可在設置頁單獨撤銷。設備上限由 maxDevices 控制,超出時擠掉最久未使用的。設備表落盤只存令牌的 sha256,明文令牌只存在於瀏覽器 cookie 中。

已知限制與注意事項

  • 版本鎖定:當前僅兼容 dsh 開發者預覽版,請鎖定版本 #v1.1.0。
  • TLS 證書:若使用 IPv6 監聽,證書的 SAN (Subject Alternative Name) 必須包含該 IPv6 地址或域名,否則瀏覽器會報名稱不匹配。
  • Bundle 補丁:依賴 dsh 內部實現細節,dsh 大版本升級後建議複查設置頁。
  • 日誌清理:訪問日誌文件無自動輪轉,需自行定期清理。
  • 安全警告:IP 白名單是免密通道,請勿配置不可信網段;全侷限流可能被用於 DoS 攻擊,攻擊者可故意輸錯把合法用戶擋在門外。

總結

對於需要在本地或局域網內管理 DeepSeek Harness 的開發者,該插件提供了輕量級的反向代理方案。所有配置均基於文件,卸載即自動清理。

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

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

小夜