dsh-lan-gateway:局域網免 token 訪問 DSH Web 的側載網關

前言

DeepSeek Harness(DSH)的 Web 界面默認在本機監聽,手機、平板或同一局域網裏的另一臺電腦要用瀏覽器操作,常見做法是裝兩個插件:一個改 DSH 啓動讓它對外監聽,一個替換認證以跳過 token。這類方案會直接動 DSH 的啓動配置和 Connection 行,與 DSH 版本綁定緊,升級後容易失效,嚴重時 DSH 本身起不來;想恢復還得逐項撤回改動。

下面介紹維護者 wlfzsd 在 SkillHub 分類 admin-security 下的插件 dsh-lan-gateway:不改 DSH 任何配置,只在 DSH 旁邊多開一個端口做反向代理,隨時在設置裏開關;網關出問題時不影響 DSH 本體運行。

這是什麼

dsh-lan-gateway 是一個 DSH profile bundle 插件。它在 DSH Web 進程旁監聽相鄰端口(默認 Web 端口 +1),按 IP 規則放行請求,改寫 Host/Origin 並注入 DSH 進程內取得的會話 cookie,讓可信局域網設備「打開網址就能用」而地址欄不出現 token。DSH 的認證、簽名與 401/403 行爲保持原樣;瀏覽器側看不到啓動 token。

倉庫:https://github.com/wlfzsd/dsh-lan-gateway
目錄頁:https://www.skillhub.cn/plugins/wlfzsd/dsh-lan-gateway
許可證:MIT(package.json 版本 1.0.0,Node >=22)。

與「改 DSH」方案的差異

常見的改啓動 + 跳過認證 dsh-lan-gateway
插件數量 2 個配合 1 個
是否改 DSH 配置 / 代碼 要改 不改
開關 改配置,可能要重裝 插件頁一鍵開關,熱生效
DSH 升級 極易失效 DSH 照常升級;接口變化時最多網關不工作
故障影響 整個 DSH 可能起不來 網關不可用,DSH 照常運行

原理上,請求路徑爲:遠程設備經 HTTP 連到網關(默認 0.0.0.0:3081)→ IP 三檔校驗 → Host/Origin 改寫成 127.0.0.1:3080 → 注入會話 cookie → 轉發到未改動的 DSH Web。

核心功能

資料中明確列出的能力如下。

  1. 端口轉發:把 DSH Web 反代到相鄰端口;默認 Web 端口 + portOffset(默認 1);可顯式指定 port;端口被佔用時自動遞增,最多試 maxPortScan 個。
  2. 免 token 遠程訪問:進程內取啓動 token,換會話 cookie,注入每條轉發請求(含 WebSocket);遠程設備無感。
  3. IP 三檔限制:lan(默認,覆蓋常見私有網段與 CGNAT/Tailscale 等)、any(任意 IP)、list(精確 IP + CIDR;本機 loopback 始終放行)。
  4. 設置面板:設置 → 內置插件 → 局域網網關;展示狀態、本機可用地址、三檔切換、端口/偏移,配置熱生效。
  5. 隨 DSH 自動啓動:作爲 web profile bundle 安裝後,重啓 dsh web 自動生效。
  6. 只讀隔離:不修改 DSH 安裝目錄文件、不替換 BrowserAuth、不改 connection/webserver 行;零第三方依賴,宿主側僅使用 node: 內置模塊。

支持靜態資源、/api RPC、/api/remote.mux WebSocket、上傳、SSE;listenHost 設爲 "::" 時可 IPv4/IPv6 雙棧。若 DSH 配置了 --tls-cert/--tls-key,網關上游自動走 HTTPS。

管理接口 /api/lan-gateway 在 DSH 自身認證柵欄內,僅 owner 可讀寫。

安裝與啓用

先把倉庫放到固定目錄(DSH 會 link 到該路徑,勿隨意刪除),再裝進 web profile。README 中的步驟如下(實測環境註明爲 pnpm v12 / dsh 0.2.2)。

# 1) 固定目錄存放倉庫
git clone https://github.com/wlfzsd/dsh-lan-gateway.git D:\tools\dsh-lan-gateway

# 2) 裝進 web profile(依賴寫爲 link:,並嘗試追加 dsh.profile.bundles)
dsh plugin --profile web add D:\tools\dsh-lan-gateway

# 3) 重啓 dsh web,控制台示例輸出:
#    [lan-gateway] listening on http://192.168.1.10:3081/ -> http://127.0.0.1:3080 (mode=lan)

若 package.json 裏 dsh.profile.bundles 未自動追加,可在 Web 側欄「插件」頁啓用,或手工補一行;也可在「插件 → 添加插件」中選擇該本地目錄。

卸載:dsh plugin --profile web remove dsh-lan-gateway,並從 dsh.profile.bundles 刪除對應行;或在插件頁停用。

配置

優先級:$DSH_HOME/lan-gateway.json > profile 行配置 > 默認值。

可在 $DSH_HOME/profiles/web/cordis.patch.yml 中爲 bundle 寫默認項,例如 list 模式:

- id: lan-gateway
  config:
    mode: list
    allow: ['192.168.1.0/24', '10.8.0.5']
鍵 默認 含義
enabled true 是否監聽
mode lan lan / any / list
allow [] list 模式的 IP / CIDR
listenHost 0.0.0.0 監聽地址;:: 爲 IPv6 雙棧
port null 顯式端口;null 表示 Web 端口 + portOffset
portOffset 1 默認偏移
maxPortScan 50 佔用時最多向後試幾個端口
verbose / logRejected false / true 請求日誌 / 拒絕日誌(1 秒節流)

典型用法

  1. 按上文完成安裝並重啓 dsh web,在控制台確認 [lan-gateway] listening on ... 與目標 DSH Web 地址。
  2. 在同一可信局域網內的手機或另一臺電腦瀏覽器中,訪問控制台打印的本機 LAN 地址(如 http://192.168.1.10:3081/),無需在 URL 中攜帶 token。
  3. 需要縮小暴露面時,在設置面板或配置文件中把 mode 改爲 list,在 allow 中填寫網段或主機;默認 lan 已覆蓋 RFC1918 等常見私有範圍。
  4. 臨時關閉:插件頁關閉或設 enabled: false,DSH 行爲立即回到官方默認。

不要與「替換 Connection 行」類插件(如 README 提到的 dsh-skip-browser-auth)同時啓用,否則 ctx.connection 不再是官方實現,網關依賴的接口可能異常。

適用場景與安全注意

適合:你在家裏或辦公室可信 LAN 內,希望用平板/手機快速打開 DSH Web,又不想改 DSH 啓動行或承擔升級踩坑風險。

務必知曉:

  • 經網關進入的請求等同於 DSH owner 權限(終端、讀寫文件、跑工具等),沒有「每個遠程用戶獨立身份」這一層。
  • 只在可信網絡開啓;mode: any 等於把控制權交給任何能連到該端口的地址。
  • 與 DSH 本地監聽一致,網關側爲明文 HTTP;公網或不可信鏈路請自行評估,加密需 DSH 側 TLS,網關會跟隨上游協議。
  • 插件以當前 DSH 進程權限運行;安裝前請自行閱讀源碼與 MIT 許可證,確認符合你的安全策略。

兼容性與失效邊界:README 實測 @deepseek-ai/dsh 0.2.2-alpha.2 + Node 26(Windows)。若未來 DSH 變更 authenticatedUrl 或 webServer 契約,插件可能表現爲 502 或無監聽,但不拖垮 DSH;apply 拋錯時插件失活而 DSH 正常。社區目錄 SkillHub 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-lan-gateway 用「側載反向代理 + 進程內 cookie 注入」替代「改 DSH + 跳過認證」的雙插件組合,一行 DSH 配置不改,開關與升級風險可控。需要細節、驗證記錄與開發命令時,見倉庫 README 與 docs/VERIFICATION.md。

羽毛球分组比赛记分
小程序二维码

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

小夜