前言¶
DSH 的桌面端默認把 Web 監聽器綁在 loopback:dsh web 的 --host 只接受具體地址,0.0.0.0 會在啓動時被明確拒絕;桌面應用更是直接以 --host 127.0.0.1 --port 0 拉起 harness。所以在辦公室之外的設備上打開這個界面,原生沒有留口子。
icrefin 維護的 dsh-remote-access 插件給出的答案是放一個網關:不嘗試改變現有監聽器的綁定方式,而是自己在組網地址上加一層反向代理,把請求轉發給本機 loopback 上的 harness。安裝後面板位於 Settings → Remote Access,默認關閉。
這個插件解決什麼問題¶
一句話定位:在 Tailscale、ZeroTier、NetBird 這類私有 mesh 網絡上,從手機、平板或另一臺電腦訪問本機 DeepSeek Harness 的完整客戶端界面,而不是一個閹割過的遠程控制頁。
工作方式是這樣的:
phone / laptop this machine
┌──────────────┐ WireGuard ┌─────────────────────────────┐
│ browser │──────────────▶│ 100.x.y.z:3080 │
│ (real DSH UI)│ │ └─ key gate → replay ──┐ │
└──────────────┘ │ ▼ │
│ 127.0.0.1:<random> harness│
│ (unchanged, loopback only) │
└─────────────────────────────┘
瀏覽器加載的和本機窗口加載的是同一個頁面,會話、prompt、流式輸出、終端、設置天然完整。網關每個請求只做幾件事:檢查自己的 cookie、附加它簽發的 harness cookie、把 Host 改寫爲 loopback、去掉 Origin/Referer/Sec-Fetch-*,然後把響應流回去。WebSocket 升級按裸 socket 隧道透傳。
由於 mesh 傳輸本身是 WireGuard 加密的,網關在 3080 端口上跑普通 HTTP,不做 TLS 終結,也明確不假裝能終結 TLS。
核心功能¶
- 一個開關啓用遠程訪問。面板顯示 listener 狀態、可用鏈接、綁定地址。
- 默認使用檢測到的
100.64.0.0/10mesh 地址(Tailscale、ZeroTier、NetBird 共用這個段),優先於 LAN 地址,避免在咖啡館 Wi-Fi 上把 agent 暴露給局域網。 - 默認不設 key,網絡就是訪問邊界:能到達該端口的 mesh 設備即可獲得訪問權限。
- 可選的 Browser access key:開啓後每個新瀏覽器輸入一次 key,瀏覽器只持有 HMAC cookie;替換 key 會讓所有現有 cookie 失效。
- Tailscale 的 MagicDNS 名稱會被優先用於鏈接(形如
http://host.tailnet.ts.net:3080/),地址變化後仍可用。CLI 不可用時也能用裸 IP 鏈接。 - 開啓 key 時有登錄限速:每個客戶端每 15 分鐘最多 8 次錯誤嘗試。
插件提供的接口面(全部來自 README):
| 接口 | 作用 |
|---|---|
GET /api/dsh-remote-access/status |
listener 狀態、檢測到的接口、綁定錯誤 |
POST /api/dsh-remote-access/config |
在線修改設置,通過 settings service 持久化 |
GET /api/dsh-remote-access/key |
返回鏈接(key 開啓時鏈接裏附帶 key) |
POST /api/dsh-remote-access/regenerate |
替換 key 並使所有 cookie 失效 |
http://<mesh-address>:3080/ |
可選 key 門禁,隨後在 loopback 上重放 harness |
配置字段:
| 字段 | 默認值 | 含義 |
|---|---|---|
enabled |
false |
listener 是否運行 |
port |
3080 |
mesh 地址上的 TCP 端口 |
bindHost |
auto |
auto(檢測 mesh 接口)、all(0.0.0.0)或 IPv4 地址 |
requireKey |
false |
是否要求瀏覽器先通過 key |
面板通過 harness 的 settings service 寫入,配置落在 profile 的 cordis.patch.yml,重啓後仍在。如果某次寫入無法持久化,界面會顯示 Applied, but not saved。
插件以捆綁(bundle)方式安裝,附帶 cordis.patch.yml,需要 dsh 0.2.1-rc.5,Node >=22.17.0,許可證 MIT。
安裝與啓用¶
README 給出的安裝方式是本地構建後從設置界面安裝 tarball,不是命令行直連倉庫:
pnpm install
pnpm check # typecheck both halves, build, run 86 tests
pnpm run pack # -> dist/dsh-remote-access-0.1.2.tgz
scripts/install.sh
注意 pnpm run pack 產物名裏的版本號是倉庫示例,當前 package.json 版本爲 0.1.3,以實際構建輸出爲準。
構建完成後:
- 在 Settings → Plugins 裏安裝打包好的 tarball,然後重啓應用。運行中的 profile 無法導入新捆綁,必須重啓。
- 打開 Settings → Remote Access。
- 點 Enable mesh access,面板會綁定檢測到的 mesh 地址並顯示鏈接。
- 在同一 mesh 的某臺設備上打開該鏈接。默認不會要求 key:私有網絡本身就是訪問邊界,你在 Tailscale / ZeroTier / NetBird 裏管理的節點成員關係就是授權。
- 可選:網絡是共享的就打開 Browser access key,之後每個新瀏覽器輸入一次 key;Replace key 可吊銷全部。
配合 Tailscale 時,建議在 tailnet ACL 裏限制端口。README 給出的例子:
{ "action": "accept", "src": ["autogroup:member"], "dst": ["tag:my-mac:3080"] }
並特別強調:不要用 Tailscale Funnel。Funnel 會把端口暴露到公網,這個插件的前提是私有網絡。
適用場景與注意¶
適合誰:已經在用 Tailscale / ZeroTier / NetBird,想在 mesh 裏用另一臺設備臨時使用本機 DSH 界面的人。不想把端口暴露到公網,也不打算自己搭 SSH 隧道的場景,這個插件相當於給了你一地址一開關的入口。
幾個必須知道的限制:
- harness 必須處於運行狀態。網關活在 harness 進程裏,機器睡眠就切斷遠程訪問。
- 一個進程只代理一個 harness 實例(即本 profile)。
- 沒有 TLS 終結,也沒有證書管理。安全性依賴 WireGuard 層和你的 tailnet ACL。
- mesh 地址不受局域網變化影響,但 Tailscale 重新登錄可能換地址,面板會在一分鐘內重新綁定。
- 這個插件以當前 dsh 進程的權限運行,並且運行前應當讀一遍源碼、覈對許可證(MIT)後再決定是否安裝。
- 撤銷訪問要麼從網絡 ACL 移除設備,要麼在開啓 key 的情況下替換 key。沒有逐設備的 key 列表。
結尾¶
dsh-remote-access 的價值在於它沒有試圖改寫 harness 的監聽策略,而是補上了「私有網絡內可達的完整客戶端」這一層:一個網關、一個開關、一條鏈接,默認關閉、默認只綁 mesh 地址。如果你的訪問需求限定在自己管理的 mesh 內,這是目前比較乾淨的方案。
- 目錄頁:https://www.skillhub.cn/plugins/icrefin/dsh-remote-access
- GitHub:https://github.com/icrefin/dsh-remote-access