前言¶
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 静默暴露出去。
使用前务必确认:
- 插件以当前
dsh进程权限运行,安装前应检查源码与 MIT 许可证。 - 每个允许名单主体拥有完整 DSH 管理员权限,不是多租户或细粒度 RBAC。
- 本机已能连接
127.0.0.1:3080或127.0.0.1:3088的进程不在威胁模型范围内。 - SkillHub(目录页)是 DSH 社区插件目录,与 DeepSeek / 幻方无官方从属关系。
DSH 生态的理念是「一切皆插件」;dsh-one-gateway 把「能连上」和「被允许」拆开,用回环网关加精确允许名单,给需要远程访问 DSH Web 的自托管场景一条可核对的安装路径。