dsh-remote-access:通過 Tailscale 等私有組網遠程訪問 DSH 桌面端

前言

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。

核心功能

  1. 一個開關啓用遠程訪問。面板顯示 listener 狀態、可用鏈接、綁定地址。
  2. 默認使用檢測到的 100.64.0.0/10 mesh 地址(Tailscale、ZeroTier、NetBird 共用這個段),優先於 LAN 地址,避免在咖啡館 Wi-Fi 上把 agent 暴露給局域網。
  3. 默認不設 key,網絡就是訪問邊界:能到達該端口的 mesh 設備即可獲得訪問權限。
  4. 可選的 Browser access key:開啓後每個新瀏覽器輸入一次 key,瀏覽器只持有 HMAC cookie;替換 key 會讓所有現有 cookie 失效。
  5. Tailscale 的 MagicDNS 名稱會被優先用於鏈接(形如 http://host.tailnet.ts.net:3080/),地址變化後仍可用。CLI 不可用時也能用裸 IP 鏈接。
  6. 開啓 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,以實際構建輸出爲準。

構建完成後:

  1. 在 Settings → Plugins 裏安裝打包好的 tarball,然後重啓應用。運行中的 profile 無法導入新捆綁,必須重啓。
  2. 打開 Settings → Remote Access。
  3. 點 Enable mesh access,面板會綁定檢測到的 mesh 地址並顯示鏈接。
  4. 在同一 mesh 的某臺設備上打開該鏈接。默認不會要求 key:私有網絡本身就是訪問邊界,你在 Tailscale / ZeroTier / NetBird 裏管理的節點成員關係就是授權。
  5. 可選:網絡是共享的就打開 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 隧道的場景,這個插件相當於給了你一地址一開關的入口。

幾個必須知道的限制:

  1. harness 必須處於運行狀態。網關活在 harness 進程裏,機器睡眠就切斷遠程訪問。
  2. 一個進程只代理一個 harness 實例(即本 profile)。
  3. 沒有 TLS 終結,也沒有證書管理。安全性依賴 WireGuard 層和你的 tailnet ACL。
  4. mesh 地址不受局域網變化影響,但 Tailscale 重新登錄可能換地址,面板會在一分鐘內重新綁定。
  5. 這個插件以當前 dsh 進程的權限運行,並且運行前應當讀一遍源碼、覈對許可證(MIT)後再決定是否安裝。
  6. 撤銷訪問要麼從網絡 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
羽毛球分组比赛记分
小程序二维码

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

小夜