前言¶
DeepSeek Harness(DSH)采用「一切皆插件」的理念,插件可以扩展宿主能力,也可以独立部署使用。当智能体需要通过受控的代理出口上网时,有两种常见做法:要么让消费方直接配置上游代理(需要账号密码),要么让消费方只填一个本地地址、自行做认证。前者会增加消费方配置复杂度,后者则需要在消费方里实现认证逻辑。
yiyunet/dsh-proxy-egress 插件解决的是第二种场景:它是一个本地出口代理(egress)桥,把只接受无凭据代理地址的消费方,接到需要账号密码的上游代理上。账号密码只在插件这一跳注入,消费方只需填 http://127.0.0.1:8899 即可。
插件属于 admin-security 分类,核心特点是「失败即断联」——上游不通、认证失败、被拒、超时都会关闭连接,代码里不存在直连降级逻辑。
它是什么¶
这是一个 DSH 插件,把消费方的请求转发到需要认证的上游代理。请求路径如下:
消费方 ──► http://127.0.0.1:8899 ──► 本插件(注入 Proxy-Authorization)──► 上游代理 ──► 目标
(无认证,只填这个地址) (账号密码只在这里出现一次)
插件由 yiyunet 维护,分类为 admin-security。它是一个 DSH bundle(package.json 里声明了 dsh.bundle.patch),不需要编译,零运行时依赖。
核心功能¶
1. 本地监听 + 上游转发¶
插件在本地监听一个端口(默认 127.0.0.1:8899),消费方把代理地址填成这个本地地址即可。插件收到请求后,会从配置中读取上游地址、端口、认证凭据,添加 Proxy-Authorization 头后转发给上游,再把上游响应原样返回给消费方。
2. 失败即断联¶
上游不通、认证失败(401/407)、被拒绝、超时、端口不在白名单、出口 IP 不匹配等情况都会导致连接关闭。插件不会尝试直连目标,也不会进行重试或兜底。配置里写 allowDirectFallback 会直接报错。
3. 凭据不进模型通道¶
凭据文件(JSON,含 username 和 password)只存在宿主机上,插件只读取不回传。面板上只显示凭据的 sha256 指纹(前 8 位),模型工具收不到密码。凭据写入的唯一合法入口是面板,面板改动写入插件自己的状态文件 $DSH_HOME/proxy-egress/settings.json,不会直接改写宿主启动配置。
4. 零构建、零运行时依赖¶
plugin-src/ 即真源,不需要编译。依赖项只有 Node.js 环境(engines 要求 >=22.19)和 DSH 自身提供的框架。
安装与启用¶
从 npm 安装(推荐)¶
dsh plugin --profile web add @yiyunet/dsh-proxy-egress
这条命令会安装包,并自动把包登记进 dsh.profile.bundles。DSH 装完会回读每个新增依赖的 dsh.bundle 声明再行登记。
从源码安装¶
- 把仓库放到本机任意目录。
- 在 profile 的
package.json里:
-dependencies里加"@yiyunet/dsh-proxy-egress": "link:<本仓库绝对路径>"
-dsh.profile.bundles里加"@yiyunet/dsh-proxy-egress" - 执行
dsh plugin --profile <profile> install,装出符号链接。 - 在 profile 的
cordis.patch.yml里加同 id 覆盖行(见下文「配置」)。
配置与启用¶
在 cordis.patch.yml 里添加以下内容:
# ⚠️ 用「同 id 顶层覆盖」,不要写 - insert:。
# 本包自带 patch 已插入过这一行,再 insert 会变成两个同 id 的行,导致端口冲突。
- id: proxy-egress
config:
listen: { host: '127.0.0.1', port: 8899 }
upstream:
type: 'http' # http | https
host: '203.0.113.9' # 只写主机名/IP,端口另写
port: 8080
credentialSource: 'file'
credentialFile: '<凭据文件绝对路径>'
allowConnectPorts: [443]
expectedEgressIps: ['203.0.113.9']
egressMismatchAction: 'warn' # warn | block
selfCheck:
enabled: true
url: 'https://api.ipify.org?format=json'
凭据文件(UTF-8):
{ "username": "<账号>", "password": "<密码>" }
然后重启宿主,并使用 proxy_egress_status 工具确认插件已加载。
典型用法¶
场景:消费方只接受无凭据代理¶
假设上游代理需要账号密码,但消费方(如某些 HTTP 客户端库)只接受无凭据的代理地址。配置好插件后,消费方只需填 http://127.0.0.1:8899,插件会自动添加认证头。
场景:强制出口 IP 检查¶
如果需要保证所有请求都走指定出口 IP,可以在配置里设置 expectedEgressIps 和 egressMismatchAction。当实际出口 IP 不匹配时,根据配置选择 warn 或 block。
场景:只允许特定端口¶
通过 allowConnectPorts 白名单,可以限制只允许连接某些端口(如只允许 443)。
适用场景与注意¶
适合需要通过受控代理出口、且消费方只接受无凭据代理地址的场景。典型用途包括:
- 智能体需要通过企业内部代理访问外部服务
- 某些库只支持无凭据代理,但上游需要认证
- 需要统一管理出口 IP、端口白名单等策略
注意:
- 插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证(MIT)。
- 插件保证「进来的一定走代理」,但不保证「该进来的都进来了」——消费方是否真的把请求交给本监听、失败后是否自己 fallback,本插件管不了。
- 整机强制出口需要防火墙白名单或独立网络环境,插件未实现系统层强制出口。
- SOCKS5 尚未实现,写了会明确报错。
限制¶
- 一次检查不能替代持续约束。自检只证明「那一刻、那条路径」。
- 回显服务只观测它自己的出口。上游若按目标分流,不能推论模型 API 走同一出口。
- 阻断态不中断已建立的隧道。要更强的效果只能用系统隔离。
- HTTP 上游的 Basic 认证只是 Base64。走公网请优先
type: 'https'。
总结¶
yiyunet/dsh-proxy-egress 插件提供了一个本地出口代理桥,让消费方只需填写无凭据的代理地址,认证逻辑在插件这一跳完成。插件失败即断联、零构建、零运行时依赖,适合需要严格代理控制的场景。配置通过 cordis.patch.yml 同 id 覆盖实现,凭据只写不读,面板是唯一合法的写入口。
- 目录页:https://www.skillhub.cn/plugins/yiyunet/dsh-proxy-egress
- GitHub:https://github.com/yiyunet/dsh-proxy-egress