dsh-one-gateway:为 DSH Web 加一层回环零信任网关

前言

DeepSeek Harness(DSH)的 Web profile 默认跑在本机回环地址上,适合本地开发和自用。若要把 DSH Web 分享给少数可信的人,常见做法是配反向代理、内网穿透,或在 DSH 前面挂一层门控。这些方案往往把「能连上私有网络」和「被允许访问」混在一起,或者需要给 DSH 核心打补丁才能在升级后保持门控覆盖。

下面介绍社区插件 dsh-one-gateway(维护者 TiantianFlow,GitHub 仓库 TiantianFlow/dsh-one-gateway)。它在 DSH Web 前面放一层仅监听回环的网关,用精确的主体允许名单做身份校验,DSH 本身始终不离开 127.0.0.1

这是什么

dsh-one-gateway 是 DSH 的 web profile 插件,定位为「私有、零信任的 DSH Web 入口」。一句话概括:在 DSH Web 前面加一层回环代理和身份校验,只放行允许名单中的主体,不把 DSH 直接暴露到局域网或入口网络。

插件当前版本为 v0.1.0,许可证 MIT,要求 Node.js 20+(通常由 DSH 自带)。在 SkillHub 社区目录中归类为安全管理(admin-security)。它不是内网穿透工具,也不替代 Tailscale 或 Cloudflare,而是在你已有的私有入口之上补上身份层。

核心功能

经过上面的定位,可以把插件能力拆成下面几部分。

回环代理与失效关闭

网关监听 127.0.0.1:3088,上游 DSH Web 保持在 127.0.0.1:3080。入口提供商(Tailscale Serve、带 Cloudflare Access 的 Cloudflare Tunnel、Headscale 上的 Tailscale TCP Serve)只负责把 HTTPS 流量送到本机网关,加入私有网络本身不构成授权

请求在转发到 DSH 之前,必须解析出一个明确的、在允许名单中的主体;不匹配则返回 403。DSH 升级不会悄悄增加可从网外到达的路由,因为 DSH 从一开始就不在回环之外监听。

三种已支持的入口与认证模式

入口 认证方式 身份来源
Tailscale Serve trusted-header Serve 注入的 Tailscale-User-Login
Cloudflare Tunnel + Access signed-jwt 本地校验的 Cloudflare Access JWT
Headscale TCP Serve gateway-credential 系统生成的每主体网关凭证

Tailscale Serve 和 Cloudflare Access 模式下,身份来自入口提供商,不需要用户自选密码。Headscale TCP Serve 没有原生 HTTP 身份头,插件用 gateway-credential 模式:CLI 签发高熵凭证,网关只存校验哈希,支持单独吊销和限速。

一条引导命令、一份允许名单

三种入口共用同一个回环网关实例和一份 trustedPrincipals 允许名单。setup 会预览计划、拒绝公开或匿名的默认值,确认后才写入 profile。完整命令为 dsh-one-gateway,别名 dsh-gateway

明确不做的事

插件文档列出的边界值得留意:每个被允许的主体都是完整的 DSH 管理员;不支持公开匿名隧道、Funnel 或 Cloudflare quick tunnel;不管理入口级 ACL 或 DNS;卸载时不会自动删除 Tailscale Serve 路由、Cloudflare tunnel 或凭证文件;也不防御本机已能直连 DSH 回环端口的进程。

安装与启用

安装前请自行审阅 GitHub 源码 与 MIT 许可证。插件随 dsh 进程权限运行,安装即表示信任维护者代码。

需要已可用的本地 DSH Web profile。只安装插件、不运行 setup 时,什么都不会暴露。

1、安装插件

dsh plugin --profile web add github:TiantianFlow/dsh-one-gateway

从本地目录安装时:

dsh plugin --profile web add -w /path/to/dsh-one-gateway

2、运行 setup

dsh plugin --profile web exec dsh-gateway -- setup

setup 打开菜单、预览计划,等待确认后写入。它会拒绝公开或匿名的默认值;在 Tailscale.com 上的操作员会被引导到有身份的 Tailscale Serve。

3、重启 DSH Web

重启你已在使用的 DSH Web 进程,以允许名单中的主体打开配置的 HTTPS origin。3088 端口本身从局域网和入口网络都不可达。

典型用法

交互式 setup(默认)

省略 --provider 时,setup 从菜单选择入口。检测到本地恰好有一个入口可执行文件时,会作为默认提示,但不是配置校验。

Tailscale Serve

dsh plugin --profile web exec dsh-gateway -- setup --provider tailscale-serve

Cloudflare Access

你需要事先配置好只转发到 127.0.0.1:3088 的 Access 应用;setup 不会创建隧道、DNS 记录或 Access 应用本身。

dsh plugin --profile web exec dsh-gateway -- setup --provider cloudflare-access \
  --external-origin 'https://dsh.example.invalid' \
  --team-origin 'https://team.example.invalid' \
  --application-audience 'replace-with-access-application-audience' \
  --trusted-principal 'email:operator@example.invalid'

Headscale TCP Serve

证书和私钥由操作员提供;setup 在 Tailscale.com 上不会把它当作与 Tailscale Serve 同等权重的菜单项。

dsh plugin --profile web exec dsh-gateway -- setup --provider headscale-tcp-serve \
  --tls-cert /path/to/dsh-one-gateway/cert.pem \
  --tls-key /path/to/dsh-one-gateway/key.pem \
  --credential-store /path/to/dsh-one-gateway/credentials.json \
  --trusted-principal operator-1

安装后的运维命令

dsh-gateway doctor
dsh-gateway credential issue --store /path/to/dsh-one-gateway/credentials.json --name operator-1
dsh-gateway credential list --store /path/to/dsh-one-gateway/credentials.json
dsh-gateway credential revoke --store /path/to/dsh-one-gateway/credentials.json --name operator-1

--print 可只预览计划、不写入 profile。非交互场景加 --yes 时,所有安全敏感参数须显式提供。

适用场景与注意

适合谁: 已在用 DSH Web profile,想把实例分享给少数指定的人(同事、家人),且愿意自建 Tailscale Serve、Cloudflare Access 或 Headscale TCP Serve 作为私有入口的开发者或家庭实验室操作员。

和同类网关的差别: 其他 DSH 网关可能在回环之外监听、或给 DSH 核心打补丁以保持升级后门控覆盖。本插件选择另一条路——DSH 从不离开回环,网关是独立外部进程,不改 DSH 源码。漏掉一条代理路径只会让该路径不可用,不会把 DSH 静默暴露出去。

使用前务必确认:

  1. 插件以当前 dsh 进程权限运行,安装前应检查源码与 MIT 许可证。
  2. 每个允许名单主体拥有完整 DSH 管理员权限,不是多租户或细粒度 RBAC。
  3. 本机已能连接 127.0.0.1:3080127.0.0.1:3088 的进程不在威胁模型范围内。
  4. SkillHub(目录页)是 DSH 社区插件目录,与 DeepSeek / 幻方无官方从属关系。

DSH 生态的理念是「一切皆插件」;dsh-one-gateway 把「能连上」和「被允许」拆开,用回环网关加精确允许名单,给需要远程访问 DSH Web 的自托管场景一条可核对的安装路径。

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

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

小夜