dsh-lan-pair:把 DSH 網頁界面安全開放到局域網

前言

DeepSeek Harness(DSH)的 dsh web 出於安全考慮,只監聽 127.0.0.1,並且明確拒絕 --host 0.0.0.0。它的會話 cookie 帶 SameSite=Strict,手機瀏覽器用外部鏈接打開只會得到 HTTP 401 dsh web authentication required。想在房間裏用平板或手機操作 DSH,原生方式走不通。

dsh-lan-pair 由 FORGE-131 維護,是一個 DSH 插件加一個 45 KB 的 Android shell(App 端名爲 DSH LAN)。插件在 DSH 進程內另開一個局域網端口,自己持有 DSH 會話 cookie,手機只跟插件說話,永遠拿不到 DSH 啓動 token。下面介紹它的安裝、配對和遠程訪問。

它的結構

分兩部分,缺一不可:

  • 插件端(dsh-lan-pair):在 DSH 進程內起局域網監聽,反向代理到本機迴環,自動完成 DSH token 交換並自己持有會話 cookie。
  • App 端(DSH LAN):自動發現局域網裏的 DSH 電腦,輸入一次 4 位配對碼,之後打開即連,用系統 WebView 全屏顯示界面。

配套的還有瀏覽器端一個深鏈接方案,手機不需要 root、不需要 USB 調試、不需要自己拼 URL。

安裝插件

前提:已裝好 DSH(本插件在 0.1.7-rc.2 上驗證過),並且有一個 web profile。<profile> 是你的 profile 名;用官方桌面版啓動器時通常就是 DSH 版本號(例如 0.1.7-rc.2),自己用 dsh web 起的一般是 web。

1、進入 profile 目錄加依賴。Windows 示例 cd %USERPROFILE%\.dsh\profiles\0.1.7-rc.2,然後:

pnpm add github:FORGE-131/dsh-lan-pair#v0.2.3

需要改代碼調試時用 pnpm add link:/path/to/dsh-lan-pair 從本地目錄安裝。

2、在 $DSH_HOME/profiles/<profile>/package.json 的 dsh.profile.bundles 裏登記包名:

{
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-lan-pair"
      ]
    }
  }
}

本包自帶 cordis.patch.yml,登記後自動生效,不需要手動改 patch 文件。

3、重啓 DSH。啓動日誌應出現:

[dsh-lan-pair] listening on 0.0.0.0:8099 -> 127.0.0.1:10723
[dsh-lan-pair] pairing is off until you open a window (DSH settings -> 移動設備)

默認不廣播:點「開啓配對」之前,手機掃描不到這臺電腦。Windows 防火牆若彈出提示請允許,或手動放行這一個 TCP 端口(只對本子網):

netsh advfirewall firewall add rule name="DSH LAN Pair" dir=in action=allow protocol=TCP localport=8099 profile=private,domain remoteip=LocalSubnet

配對:四步,4 位碼

1、電腦上打開 DSH 的「設置 → 移動設備」,點「開啓配對」。
2、電腦彈出窗口顯示 4 位數字,同時纔開始在局域網廣播。
3、在手機上輸入這 4 位數字。
4、配對成功後窗口自動關閉、廣播停止,App 拿到長期憑據,以後打開即連。

配對碼兩分鐘有效、只能使用一次、輸錯 5 次作廢。因爲碼只有 4 位,不限制的話一萬種組合幾秒就能試完。如果 App 出問題需要手填,長期密鑰存在 $DSH_HOME/lan-pair.json(例如 C:\Users\<you>\.dsh\lan-pair.json),內容形如:

{ "secret": "bfrVhwqHdzue50xo", "createdAt": "2026-11-01T21:40:07.737Z" }

刪掉文件再重啓 DSH 會換一個新的。環境變量優先級更高,常用幾個:

變量 作用
DSH_LAN_PAIR_SECRET 覆蓋長期密鑰
DSH_LAN_PAIR_PORT 覆蓋端口(默認 8099)
DSH_LAN_PAIR_PUBLIC_URL 固定公網地址(命名隧道 / 反向代理時填)
DSH_LAN_PAIR_TUNNEL 自動拉起隧道的命令,插件從輸出裏抓公網地址
DSH_LAN_PAIR_TTL_MS 配對碼有效期(默認 120000)
DSH_LAN_PAIR_DEBUG 輸出 mDNS 報文診斷日誌

不開配對窗口時,也可以手動訪問 http://127.0.0.1:<端口>/lanpair/open 來開啓。

不在同一局域網時

配對是永久的,長期密鑰不過期,換網絡不需要重新配對;但 App 記住的是「地址」,出門時需要一個外網可達地址。兩種方式:

方式一,讓插件託管隧道:

$env:DSH_LAN_PAIR_TUNNEL = "cloudflared tunnel --url http://127.0.0.1:8099 --no-autoupdate"

方式二,填固定地址(命名隧道 / 反向代理):

$env:DSH_LAN_PAIR_PUBLIC_URL = "https://dsh.example.com"

插件在 DSH 源上提供 GET /lanpair/info 查當前可用地址,返回形如:

{
  "ok": true,
  "port": 8099,
  "lan": ["http://192.168.1.14:8099"],
  "publicUrl": "https://xxx.trycloudflare.com",
  "pairLink": "https://xxx.trycloudflare.com/__pair?k=...",
  "lanPairLink": "http://192.168.1.14:8099/__pair?k=...",
  "tunnel": { "running": true, "url": "https://xxx.trycloudflare.com" }
}

插件會把 publicUrl 寫進 mDNS 的 TXT 記錄(remote=)。App 發現電腦時同時拿到局域網地址和遠程地址,存成端點列表,連接時按 3 秒超時依次探測:先試局域網地址(在家秒連、不繞公網),不通再試遠程地址(出門自動啓用),第一個通的就用,無需手動切換。

安裝 App

從 Releases 下載 dsh-lan-pair-<version>.apk,側載安裝(需要允許「未知來源」)。最低 Android 8.0(API 26),未限制 CPU 架構(不含原生庫),用系統 WebView 渲染,支持 https:// 遠程地址與深鏈接,不打包瀏覽器內核。應用簽名是自簽名證書(CN=DSH LAN Pair),不是商店簽名。

深鏈接與典型用法

可以把連接地址做成二維碼或快捷方式,掃一下即可連接:

dshlanpair://connect?base=<地址>&remote=<備用地址>&fallback=<再備用>&k=<密鑰>

例如同時帶局域網和隧道的鏈接:

dshlanpair://connect?base=http%3A%2F%2F192.168.1.14%3A8099&remote=https%3A%2F%2Fxxx.trycloudflare.com&k=<密鑰>

日常使用流程:

1、電腦上「設置 → 移動設備 → 開啓配對」。
2、手機打開 DSH LAN,列表裏出現這臺電腦(例如 DESKTOP-I9IRUS8 (win32) 192.168.1.14:8099)。
3、輸入電腦上彈出的 4 位數字,點「連接」。
4、之後每次打開 App 都會自動連;想換電腦就按返回鍵調出連接面板。

掃描不到時,確認電腦上已點「開啓配對」(不點就不廣播),也可以在地址欄手動填 IP:端口。

適用範圍與注意

適合同一 Wi-Fi 下想用手機操作 DSH 的人,以及需要出差後仍能連回家裏那臺機器的場景。

幾點必須知道:

  • 插件以當前 DSH 進程權限運行,安裝前應檢查源碼與許可證(MIT)。
  • 插件依賴 DSH 內部的 connection 與 webServer 兩個服務名,以及 connection.authenticatedUrl(),這些不是公開穩定 API,DSH 升級後可能變化。請在 package.json 的 peerDependencies 裏鎖定你驗證過的 DSH 版本。
  • 配對密鑰只是防誤連,不是強加密:局域網內是明文 HTTP,能抓包的人也能拿到會話。它防的是「同一個 Wi-Fi 下的鄰居隨手打開就能指揮你的電腦」這類意外暴露;需要安全請自行套 TLS 反向代理。
  • Cloudflare 快速隧道(trycloudflare.com)域名每次重啓都會變,同一出口 IP 併發建多個隧道會被限流,長期使用請配命名隧道或用 DSH_LAN_PAIR_PUBLIC_URL 指向固定域名。
  • App 側載需要允許「安裝未知來源」,首次連接 Windows 防火牆提示要放行那一個 TCP 端口。

結尾

它的價值在於不碰 DSH 的安全邊界:不改 dsh web 的監聽,不把 token 交給手機,用插件自身的端口和 4 位配對碼做中間層,同時用 mDNS 把局域網和隧道地址合併成可自動切換的端點列表。

  • 目錄頁:https://www.skillhub.cn/plugins/FORGE-131/dsh-lan-pair
  • GitHub:https://github.com/FORGE-131/dsh-lan-pair
羽毛球分组比赛记分
小程序二维码

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

小夜