前言¶
DeepSeek Harness(DSH)的 Web 服務默認只監聽本機迴環地址,並且對 Host、Origin 頭有嚴格校驗:只有來自 127.0.0.1 的請求才能調用 settings.*、credentials.*、host.listDirectory 等特權接口。頁面可以打開,但這些接口會返回 403。
常見做法是用 SSH 端口轉發、Caddy、frp、ngrok 或 Cloudflare Tunnel 把 Web UI 暴露到公網或局域網。經過通用隧道後,請求頭裏的主機名會變成公網域名,Harness 的信任檢查就會失敗。有些方案只加密碼認證,不改寫請求頭,特權 API 仍然不可用;有些局域網插件沒有認證,不適合公網暴露。
下面介紹 dsh-full-remote:在隧道與 Harness Web 服務之間插入一層帶 token 認證的反向代理,改寫 Host/Origin 爲迴環地址,同時用獨立的訪問控制層替代 Harness 原有的信任檢查。
這是什麼¶
dsh-full-remote 是 DeepSeek Harness 的插件,由 JUANWANG-BUAA 維護,已收錄於 awesome-dsh-plugin。npm 包名同爲 dsh-full-remote,當前版本 0.3.8,許可證 MIT,要求 Node.js ^22.19 或 >=24。
插件在 Harness Web 服務(默認 127.0.0.1:3080)前面啓動一個反向代理(默認 127.0.0.1:3081)。遠程瀏覽器經隧道連到代理後,代理校驗訪問 token 或設備會話,改寫請求頭並轉發 HTTP、SSE、WebSocket 流量,使設置、憑據、目錄瀏覽等特權 API 在遠程場景下仍可正常工作。
它解決什麼問題¶
| 做法 | 結果 |
|---|---|
通用隧道(SSH 轉發、Caddy、綁定 0.0.0.0) |
頁面能加載;settings.* / credentials.* / host.listDirectory 返回 403 |
| 無認證的局域網插件 | 局域網可用;不適合公網暴露 |
| 僅密碼認證、不改寫請求頭 | 請求已認證,特權 API 仍被攔截 |
dsh-full-remote 的做法是:代理把 Host 和 Origin 改寫爲 127.0.0.1 後再轉發,讓 Harness 的信任檢查通過;同時因爲改寫會繞過 Harness 原有的遠程客戶端檢查,插件用 token、設備會話、可選審批和審計日誌建立自己的訪問控制層。
核心功能¶
特權 API 保持可用¶
代理轉發後,以下接口在遠程訪問時不再被 403 攔截:
settings.describe/update/replace/mutatecredentials.describe/set/unsethost.listDirectory/pickDirectory/openPathagentPreset.*、llm.discoverModels
訪問控制¶
- 訪問 token:192 位 token,保存在 mode
0600的狀態文件中;可在本地面板查看和輪換。 - 按設備會話:每次登錄創建獨立設備憑據,持久化只存哈希;面板可重命名、吊銷設備,並顯示登錄 IP 與最近訪問 IP。
- 首次訪問審批(可選):新設備在頁面上等待,需從本地面板批准後才能繼續。
- 手機邀請:通過二維碼或一次性鏈接(單次使用、15 分鐘過期)接入;鏈接不含長期 token。同 IP 瀏覽器在 60 秒內重試可複用原設備會話,避免隧道抖動導致重複登錄。
- 登錄防護:失敗登錄有固定延遲和按 IP 鎖定;可選 CIDR 白名單限制遠程 IP。
- 轉發 IP 識別:可選
trustForwardedFor,從受信任本地隧道的X-Forwarded-For最右值取真實客戶端 IP;CF-Connecting-IP爲 Cloudflare 專用可選項。
運維與審計¶
- 圍欄自檢:用與代理相同的 Host/Origin 改寫探測
settings.describe,確認代理鏈路正常。 - JSONL 審計日誌:記錄登錄、審批、吊銷、token 輪換、啓停、WebSocket 開/拒等事件;面板可查看近期事件並導出 JSON;日誌超過 8 MB 自動輪轉,保留一代歷史。
- 協議支持:轉發 HTTP、SSE、WebSocket;可壓縮的 HTTP 響應(HTML/JS/CSS/JSON/SVG,≥1 KB)可 gzip;SSE 和 WebSocket 不壓縮。
- 其他:運行時可改監聽地址,綁定失敗自動回滾;可選本地 TLS(
tlsCertFile/tlsKeyFile);健康檢查端點/_dsh_reverse_proxy/healthz;WebSocket 升級失敗按 IP 限流。
可選 Cloudflare 快速隧道¶
插件可臨時啓動 Cloudflare quick tunnel,生成二維碼供手機掃碼。也可把現有 SSH、frp、ngrok、Tailscale 或 cloudflared 隧道指向面板顯示的代理目標地址。快速隧道是可選且臨時的,不是託管的生產部署方案。
安裝與啓用¶
在 DSH 的 web profile 下安裝並啓動:
dsh plugin --profile web add dsh-full-remote
dsh --profile web
安裝完成後,打開 Settings → Reverse proxy 面板管理代理。
典型用法¶
快速遠程訪問¶
- 在 Settings → Reverse proxy 點擊 Start proxy 啓動反向代理。
- 點擊 Start Cloudflare quick tunnel,掃描生成的二維碼。邀請鏈接爲一次性,不包含長期訪問 token。
- 手機或遠程瀏覽器完成 token 輸入或設備審批後,即可使用完整 Web UI,包括設置、憑據和目錄操作。
使用已有隧道¶
在受控網絡中,不必用 Cloudflare 快速隧道。把 SSH、frp、ngrok、Tailscale 或 cloudflared 隧道指向面板顯示的本地代理地址(默認 127.0.0.1:3081)即可。
請求流轉¶
flowchart LR
A[手機或遠程瀏覽器] --> B[公網隧道<br>cloudflared / ngrok / frp / SSH]
B --> C[dsh-full-remote<br>127.0.0.1:3081<br>認證 + 頭改寫]
C --> D[DeepSeek Harness Web<br>127.0.0.1:3080]
- 遠程瀏覽器經公網隧道連到插件監聽器。
- 請求須攜帶訪問 token、有效一次性邀請或已有設備會話;未通過認證的請求不會到達後端。
- 代理改寫
Host/Origin爲迴環地址,移除不可信頭,轉發到 Harness Web 服務。
適用場景與注意¶
適合誰
- 需要用手機或另一臺設備遠程操作 DSH Web UI,且要用到設置、憑據、目錄瀏覽等特權功能。
- 已有 SSH、frp、ngrok、Tailscale 等隧道,希望在不改 Harness 源碼的前提下打通遠程訪問。
- 需要按設備管理會話、審計登錄事件,或對首次接入做人工審批。
使用前注意
- 插件以當前
dsh進程的權限運行,安裝前建議閱讀 源碼 與 SECURITY.md,理解安全模型。 - 把監聽器暴露到公網前,務必配置 token、設備審批或 CIDR 白名單;快速隧道僅適合臨時調試,不宜當作生產部署。
- 請求頭改寫會替代 Harness 原有的遠程信任檢查,訪問控制完全依賴插件自身的認證層。
- 與其他 DSH 插件的兼容性見倉庫內 compatibility.md。
鏈接¶
- SkillHub 目錄頁:dsh-full-remote
- GitHub 倉庫:JUANWANG-BUAA/dsh-full-remote
- npm 包:dsh-full-remote
經過上面的步驟,dsh-full-remote 把「頁面能打開但特權 API 403」的遠程訪問問題,收斂爲一套帶 token 門禁、按設備會話和審計日誌管理的反向代理方案。