dsh-web-fetch-fakeip:在 fake-ip 代理环境下恢复 DSH 的 web_fetch

前言

DeepSeek Harness(DSH)里,智能体通过 web_fetch 拉取网页内容。内核自带的 @deepseek-ai/dsh-web-fetch-http 会在发起请求前检查解析结果:只要主机名对应到非公网单播地址,就直接拒绝,错误码为 WEB_BLOCKED_URL。

本机若使用 Clash、sing-box、Surge 等工具的 fake-ip DNS,域名往往被映射到保留段(常见默认 198.18.0.0/15)。此时连 github.com 也会被判为非公网 IP,例如:

URL hostname "github.com" resolves to a non-public IP address   (WEB_BLOCKED_URL)

代理本身能上网,但 DSH 侧的 web_fetch 会全部失败。下面介绍社区插件 dsh-web-fetch-fakeip(维护者 vaspike,分类:联网工具),它注册替代的 fetch provider,在可配置的 CIDR 白名单内接受 fake-ip 地址,其余规则仍与内置 provider 一致。

这是什么

dsh-web-fetch-fakeip 是一个 DSH bundle 插件:在 profile 中插入 web-fetch-fakeip 配置,并把 @deepseek-ai/dsh-web 的 fetchProvider 固定为 http-fakeip。检索契约与内置 HTTP fetch 相同,仅改变「哪些解析地址算合法」——allowCidrs 内的地址可接受,其它地址仍须为公网单播;环回、RFC 1918、链路本地、CGNAT 等保留段继续拦截。

  • 目录页:https://www.skillhub.cn/plugins/vaspike/dsh-web-fetch-fakeip
  • 源码与说明:https://github.com/vaspike/dsh-web-fetch-fakeip
  • 许可证:MIT(见仓库 package.json)

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;安装前请自行审阅源码与许可证。插件随当前 DSH 进程权限运行。

核心功能

  1. http-fakeip provider
    与 @deepseek-ai/dsh-web-fetch-http 相同的抓取约束下,允许解析结果落在 allowCidrs(如 198.18.0.0/15)内的请求通过地址校验。

  2. bundle 自动打补丁
    package.json 声明 dsh.bundle.patch,选中 bundle 后对 profile 应用 cordis.patch.yml:插入 web-fetch-fakeip 行,并设置 fetchProvider: http-fakeip。因补偿性 override 会替换完整的 web 配置,补丁会重复写入内置的 searchProvider;若你在别处自定义了 searchProvider 或 fetchProvider,需在应生效的层(例如用户层 cordis.patch.yml,其晚于 bundle 应用)保留两个键。

  3. 可配置限额
    支持 maxResponseBytes、maxBodyChars、timeoutMs、maxRedirects 等,与 README 示例一致。

  4. 无依赖的分类器
    仓库提供 test/classify.test.js,覆盖 CIDR 解析、匹配及公网/保留地址判定(含 ::ffff: 映射地址)。

安装与启用

在目标 profile 下从 GitHub URL 安装(命令来自官方 README):

dsh plugin --profile <your-profile> add https://github.com/vaspike/dsh-web-fetch-fakeip

若已有本地目录,也可让 plugin_manager 指向该路径:

plugin_manager action=install_bundle target=/path/to/dsh-web-fetch-fakeip

安装后 bundle 会应用补丁并 pin @deepseek-ai/dsh-web 使用 http-fakeip。

配置

在插件条目 web-fetch-fakeip 下配置 provider(示例来自 README):

- id: web-fetch-fakeip
  name: 'dsh-web-fetch-fakeip'
  config:
    allowCidrs:
      - 198.18.0.0/15   # Clash / sing-box / Surge fake-ip default
    maxResponseBytes: 5000000
    maxBodyChars: 100000
    timeoutMs: 30000
    maxRedirects: 5

allowCidrs 默认为 [],此时行为与内置 provider 相同。CIDR 在激活时解析,拼写错误会直接报错。

验证

在插件源码目录运行单元测试:

node --test test/classify.test.js

适用场景与限制

适合: 本机 DNS 走 fake-ip(198.18.0.0/15 或你自定义的映射段),且需要在 DSH 里正常使用 web_fetch 的开发者。

需注意:

  • 先校验再抓取,无 DNS 固定。 校验通过后实际请求仍走全局 fetch 并可能再次解析;不存在 DNS pinning,理论上存在 rebinding 通过校验后连到别处的风险。内置 provider 会 pin 连接;本插件为在 profile 安装的 bundle 内保持无额外 import,放弃了 pinning。
  • 与内置相同的响应契约: 仅同源重定向;仅 text/* 与 JSON/XML;字符集取自 Content-Type。
  • 错误类型: 运行时 WebError 类无法从 profile bundle 导入,错误仍带 name = 'WebError' 与 WEB_* 码,但 instanceof WebError 不成立;Harness 对外以错误码为准。
  • 长期维护: 若未来内核在 dsh-web-fetch-http 中提供 ssrfAllowCidrs,可移除本 bundle 改用内核能力。

结尾

dsh-web-fetch-fakeip 针对 fake-ip 代理与 DSH 默认 SSRF 校验之间的冲突,用可配置的 allowCidrs 恢复 web_fetch,同时保留对非公网保留段的拦截。需要时可从社区目录或 GitHub 安装并核对配置。

  • 目录:https://www.skillhub.cn/plugins/vaspike/dsh-web-fetch-fakeip
  • GitHub:https://github.com/vaspike/dsh-web-fetch-fakeip
羽毛球分组比赛记分
小程序二维码

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

Xiaoye