DeepSeek Harness 出口代理桥插件

前言

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 声明再行登记。

从源码安装

  1. 把仓库放到本机任意目录。
  2. 在 profile 的 package.json 里:
    - dependencies 里加 "@yiyunet/dsh-proxy-egress": "link:<本仓库绝对路径>"
    - dsh.profile.bundles 里加 "@yiyunet/dsh-proxy-egress"
  3. 执行 dsh plugin --profile <profile> install,装出符号链接。
  4. 在 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
羽毛球分组比赛记分
小程序二维码

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

小夜