dsh-tailnet-ingress:把迴環 Web UI 接到本機私有與隧道 IPv4

前言

DeepSeek Harness(DSH)的 Web 界面默認會綁定在明確的主機地址上,並拒絕通配監聽。這在安全上是合理的,但在實際部署裏會帶來一個常見矛盾:服務只開在 127.0.0.1 或某一網卡地址上時,同一臺機器上的 Tailscale 100.x、局域網網卡,或 macOS 上 Shadowrocket Tailscale 模塊使用的隧道地址(例如 198.18.0.1)上的入站流量,往往無法直接打到 DSH 監聽器。手動爲每個地址再起一套進程或改綁定方式,既容易和 DSH 的設計衝突,也不利於 DHCP 或隧道上下線後自動跟上。

dsh-tailnet-ingress 是維護者 dingcang 發佈的一個小型 DSH bundle(客戶端類插件)。它在不改變 DSH 迴環監聽的前提下,在本機選定的非公網 IPv4 地址上額外監聽,並把 TCP 原樣管道到 DSH 已有的迴環 Web 監聽器;HTTP、WebSocket 升級等流量不解析、不改寫、不注入。下面介紹它的行爲、安裝方式,以及和 DSH 信任柵欄配合使用時需要注意的點。

這是什麼

插件 npm 包名爲 @dingcang/dsh-tailnet-ingress(README 中 package.json 標註版本 1.2.2,許可證 MIT)。一句話定位:把綁定在迴環上的 DSH Web UI,同步服務到本機私有網段、CGNAT(含 Tailscale 100.x)以及文檔列出的隧道相關 IPv4 地址上,端口跟隨 DSH Web 監聽器實際綁定的端口。

社區目錄頁:https://www.skillhub.cn/plugins/dingcang/dsh-tailnet-ingress
源碼與說明:https://github.com/dingcang/dsh-tailnet-ingress

DSH 生態強調「一切皆插件」;SkillHub 等目錄爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

核心功能

零配置自動探測(默認)

autoDetect 默認爲 true。每次插件激活時讀取 Node.js 的 os.networkInterfaces(),不調用外部命令、不發探測包、也不向隧道應用查詢。流程可以概括爲:

  1. 收集所有 internal: false 的 IPv4 條目(IPv6 不服務)。
  2. 去重後,只保留落在下列網段內的地址;公網地址一律丟棄。
  3. 顯式配置的 hosts 排在最前;剔除 DSH 自身綁定地址(從 webServer.getOrigin() 讀取),避免與 --host 部署衝突。
  4. 對其餘每個地址,用解析出的端口建立監聽,並把原始 TCP 接到迴環上的 upstream。
網段 用途
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 常見局域網
100.64.0.0/10 CGNAT,Tailscale 的 100.x 在此範圍
198.18.0.0/15 RFC 2544 基準網段;Shadowrocket TUN 常用 198.18.0.1

探測在每次 dsh web 啓動時執行,DHCP 續租或隧道在下次啓動時會反映在新地址列表裏。若某地址在探測與 listen 之間消失,僅記錄警告,其餘地址繼續服務。

透明 TCP 管道

在每個可服務地址上監聽後,把連接接到 DSH 持有的迴環監聽器(默認 upstream 爲 127.0.0.1,端口與 Web 監聽器一致)。管道不改寫 Host 頭。

生命週期與端口

監聽器由 ctx.effect 持有:隨 dsh web 啓動建立,關閉或重載時關閉。配置項 port: 0 表示跟隨 Web 監聽器實際端口,--port 變化時兩側保持一致。

安裝與啓用

安裝命令以 README 爲準;安裝後需重啓 dsh web,讓 profile 重新加載 bundle。

# 從 npm 安裝(推薦)
dsh plugin --profile web add @dingcang/dsh-tailnet-ingress

# 從 GitHub 安裝
dsh plugin --profile web add github:dingcang/dsh-tailnet-ingress

# 或從本地目錄安裝
dsh plugin --profile web add file:/path/to/dsh-tailnet-ingress

插件以當前 dsh 進程權限運行;安裝前建議在 GitHub 上查看源碼與 MIT 許可證,自行評估是否適合你的環境。

配置

默認值由 bundle 自帶的 patch 提供。覆蓋時只改你的 profile 裏的 cordis.patch.yml,按 row id 寫入,不要改插件包內文件:

- id: dsh-tailnet-ingress
  config:
    hosts: [192.168.1.5]   # 顯式地址,替代或疊加在探測結果上
    autoDetect: true
    port: 0                # 0 = 跟隨 Web 監聽器
    upstreamHost: 127.0.0.1
    upstreamPort: 0        # 0 = 跟隨 `port`
鍵 默認值 含義
hosts [] 額外服務的地址,與探測結果合併
autoDetect true 是否服務本機私有 / CGNAT / 隧道 IPv4
port 0 0 跟隨 Web 監聽器端口
upstreamHost 127.0.0.1 DSH 迴環監聽器地址
upstreamPort 0 0 跟隨 port

若只想固定少數地址,將 autoDetect 設爲 false,並在 hosts 中顯式列出。

典型用法與信任柵欄

僅在地址上監聽,並不等於 DSH 會在該 authority 上開放 /api。DSH 的信任柵欄仍要求每個瀏覽器會使用的 host 出現在 --trusted-host 中;未聲明則 /api 返回 403。啓動 token 爲進程級,每個 authority 需各自完成 cookie 兌換。

README 給出的示例:在迴環上跑 Web,同時爲局域網 IP 與 Tailscale 地址聲明信任:

dsh web --host 127.0.0.1 --trusted-host 192.168.1.5 100.x.y.z

將 100.x.y.z 換成你節點真實的 tailnet IPv4。在 macOS 上使用 Shadowrocket 的 Tailscale 模塊時,入站可能被改寫到 198.18.0.1;自動探測包含 198.18.0.0/15,正是爲了在這種隧道場景下仍能接到管道,但 /api 仍要對實際訪問用的 host 配置 --trusted-host(若瀏覽器 authority 爲 198.18.0.1:端口,則需在 trusted-host 中體現,具體以你本地訪問 URL 爲準)。

適用場景與注意

適合需要在同一臺運行 DSH 的機器上,通過局域網、Tailscale CGNAT 地址,或 Shadowrocket 類 TUN 隧道地址訪問 Web UI,又希望保持 DSH 主進程仍只綁定迴環或單一 --host 的部署。

注意區分兩件事:ingress 插件負責在多地址上監聽並轉發 TCP;DSH 的 --trusted-host 負責 API 與 UI 的信任邊界。在酒店 Wi‑Fi 等環境監聽局域網地址,若未配置對應 trusted-host,界面/API 仍不會因監聽 alone 而對外放開。

經過上面的步驟,你可以在不大改 DSH 綁定策略的前提下,讓 Web UI 在本機多個非公網 IPv4 上可達。更多細節見 GitHub README 與 SkillHub 目錄頁。

羽毛球分组比赛记分
小程序二维码

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

小夜