前言¶
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。
核心功能¶
資料中明確列出的能力如下。
- 端口轉發:把 DSH Web 反代到相鄰端口;默認 Web 端口 +
portOffset(默認 1);可顯式指定port;端口被佔用時自動遞增,最多試maxPortScan個。 - 免 token 遠程訪問:進程內取啓動 token,換會話 cookie,注入每條轉發請求(含 WebSocket);遠程設備無感。
- IP 三檔限制:
lan(默認,覆蓋常見私有網段與 CGNAT/Tailscale 等)、any(任意 IP)、list(精確 IP + CIDR;本機 loopback 始終放行)。 - 設置面板:設置 → 內置插件 → 局域網網關;展示狀態、本機可用地址、三檔切換、端口/偏移,配置熱生效。
- 隨 DSH 自動啓動:作爲 web profile bundle 安裝後,重啓
dsh web自動生效。 - 只讀隔離:不修改 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 秒節流) |
典型用法¶
- 按上文完成安裝並重啓
dsh web,在控制台確認[lan-gateway] listening on ...與目標 DSH Web 地址。 - 在同一可信局域網內的手機或另一臺電腦瀏覽器中,訪問控制台打印的本機 LAN 地址(如
http://192.168.1.10:3081/),無需在 URL 中攜帶 token。 - 需要縮小暴露面時,在設置面板或配置文件中把
mode改爲list,在allow中填寫網段或主機;默認lan已覆蓋 RFC1918 等常見私有範圍。 - 臨時關閉:插件頁關閉或設
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。