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 目录页。

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

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

小夜