dsh-fakeip-compat:让 DSH web_fetch 接受 FakeIP 段 DNS 答案

前言

DeepSeek Harness(DSH)里的 web_fetch 会先解析主机名,再要求解析结果必须是公网可达的单播地址。本地若使用 Clash、sing-box 等带 FakeIP 的 DNS,解析器常返回 198.18.0.0/15 或 fc00::/18 一类的占位地址,Harness 内置的 @deepseek-ai/dsh-web-fetch-http 会直接拒绝请求,错误类似:

Error: URL hostname "raw.githubusercontent.com" resolves to a non-public IP address

代理侧仍会正确转发,但智能体在发字节之前就被拦下。社区插件 dsh-fakeip-compat(维护者 bemarkt,分类:联网工具)在原有公网校验之前插入一条 FakeIP 兼容规则,并可选通过 DNS-over-HTTPS 复核真实目标;其余连接固定、同源重定向、字节与字符上限、字符集解码与官方实现一致。下文介绍其定位、能力与安装配置方式。事实以 GitHub 仓库 README 为准;版本 1.0.0,在 Desktop 与 CLI profile 上均对照 DeepSeek Harness 0.2.1-rc.5 验证过。

这是什么

dsh-fakeip-compat 是面向 DSH web_fetch 的 FakeIP 兼容层:重新注册 id 仍为 http 的 fetch provider,在 profile 已选择 fetchProvider: http 时可直接替换行为,而不改动其它 composition。插件自带 General 设置页一行(需 profile 挂载 webServer 与 configEditor);纯 TUI profile 仍可使用 fetch provider,但需手写配置。

核心功能

与内置校验的差异

内置逻辑用 ipaddr.js 判断:每个 DNS 答案都必须是 range() === 'unicast' 的公网单播。FakeIP 答案落在 reserved 或 uniqueLocal 等范围,一律被拒。

本插件在官方判断之前增加一条规则(概念上):

destination inside fakeipRanges  -> allow
allowNonPublic === true          -> allow(整段公网校验跳过)
anything else                    -> 沿用原有 public-unicast 检查

默认仍阻止私网、回环以及 169.254.169.254 等元数据地址。

实现要点(README 明确说明)

  • 零 npm 依赖:IPv4/IPv6、CIDR 与非公网块表在 lib/ip.js,便于 bundle 安装。
  • 尽量复用官方传输:能解析到 Harness 自带的 HttpFetchProvider 时,把解析器作为第二构造参数传入,pinning、重定向、上限与解码仍是官方代码。
  • Node 原生回退:官方模块不可用时改用 node:http/node:https;pinning 与上限仍生效,Harness 代理路由不经过该路径。runtime.implementation 可查看当前实现。
  • 禁用而非替换官方 row:bundle patch 仅关闭自带的 web-fetch-http,避免两个 provider 共用 id http。

可选:真实地址 DoH 复核

FakeIP 答案不反映真实目的地;若域名真实解析到私网,外观与其它占位符相同。开启 verifyRealAddress 后,会在连接前向独立 JSON DoH 端点查询真实答案:

verifyRealAddress 行为
off(默认) 不查询,无额外延迟
warn 查询;真实答案非公网则记录日志,仍允许 fetch
enforce 查询;真实答案非公网则拒绝 fetch

dohFailurePolicy 在开启复核时决定「无法验证」的含义:allow(默认)或 deny。仅当查询未得到可用答案时算不可验证;若 DoH 返回公网地址则通过。

默认关闭的原因 README 写得很清楚:公网 DoH 与本地/分流 DNS 可能不一致(enforce 在策略复杂环境易误杀);DNS 故障不应默认等同禁止访问;每次复核会向 DoH 运营方暴露主机名;IP 字面量不走 DNS 复核。需要封堵「域名真实指向私网」这一缺口时再打开。

环境要求

项 要求
DeepSeek Harness 0.2.1-rc.5(已验证),Desktop / CLI profile
Node.js 20 及以上
Composition 须挂载 web;设置页 additionally 需要 webServer、configEditor

许可证:MIT(见仓库 package.json)。

安装与启用

安装方式以 README 为准,通过 DSH 的 plugin_manager 安装本地 bundle(需本机已有仓库目录的绝对路径):

plugin_manager { action: "install_bundle", target: "<absolute path to this repository>" }

已安装同名 bundle 时会拒绝覆盖(already-installed),需先移除再装:

plugin_manager { action: "remove_bundle", target: "dsh-fakeip-compat" }
plugin_manager { action: "install_bundle", target: "<absolute path to this repository>" }

package.json 的 dsh.install 也记录了 tarball / zip / git 源(优先 tarball),例如:

https://codeload.github.com/bemarkt/dsh-fakeip-compat/tar.gz/refs/heads/main

bundle patch 会禁用 web-fetch-http 并插入 id 为 fakeip-compat 的 provider,默认配置片段包括:

fakeipRanges: ['198.18.0.0/15']
allowNonPublic: false
verifyRealAddress: 'off'

是否需要重启:

  • Host 侧(fetch provider 与配置路由):安装报告 application: applied 后即生效;保存配置后 Loader 会协调 row,一般无需重启进程。
  • Client 侧(设置页):浏览器模块在启动时 compose;首次安装或修改 client.js 后需重启 DSH,设置行才会出现。

配置

路径:Settings → General → 滚动到底部 → FakeIP fetch compatibility。

  • FakeIP ranges:CIDR 芯片列表,输入网段回车添加,空列表表示非公网目的地仍全部拦截。
  • Allow every non-public destination:对应 allowNonPublic。
  • Real-address verification:off / warn / enforce,以及 DoH 端点与 dohFailurePolicy。
  • Save:写入 profile 的 cordis.patch.yml,Loader 协调后 provider 按新配置重载。

无 webServer / configEditor 时,按 README 手写 patch 中 fakeip-compat 的 config 字段即可。

配置 HTTP 路径(供排查):

browser → GET|POST /ext/fakeip-compat/config
        → configEditor.edit(entry, …)
        → ~/.dsh/profiles/<profile>/cordis.patch.yml

典型用法与验证思路

  1. 在已启用 FakeIP 的代理/DNS 环境下,profile 使用 fetchProvider: http 并安装本插件。
  2. 保持默认 fakeipRanges: ['198.18.0.0/15'](若你的 FakeIP 网段不同,在设置页补全 CIDR)。
  3. 让智能体执行原先会报「non-public IP address」的 web_fetch(例如 README 中的 raw.githubusercontent.com 场景),确认请求不再在解析阶段被拦。
  4. 若担心域名真实指向内网,将 verifyRealAddress 设为 warn 或 enforce,并配置可信 DoH;家庭网络仅代理分流时可考虑 enforce,多策略 DNS 环境宜先用 warn 观察。

仓库提供自测脚本:npm test 或 node scripts/selftest.mjs(在插件源码目录执行,用于开发侧自检,非 DSH 内置步骤)。

适用场景与注意

适合: 在 DSH Desktop 或 CLI 中开发/运行智能体,本机 DNS 走 FakeIP(Clash Meta、sing-box 等),需要 web_fetch 正常拉取公网站点,且希望尽量保持 Harness 原有 HTTP 安全语义(非公网块、元数据 IP 仍默认禁止)。

注意:

  • 插件以当前 DSH 进程的权限运行;安装前请阅读 源码与 LICENSE,确认符合你的安全策略。
  • allowNonPublic: true 会跳过公网单播检查,范围远大于 FakeIP 兼容,仅在明确接受风险时使用。
  • DoH 复核涉及延迟、可用性与隐私权衡,默认关闭是刻意设计。
  • DeepSeek Harness 插件社区目录(如 SkillHub 条目)为独立生态站点,与 DeepSeek / 幻方无官方从属关系;本文不引用未在 README 中出现的用户案例或数据。

结尾

dsh-fakeip-compat 用最小改动(provider id 与 composition 与官方 http 对齐)解决 FakeIP 环境下 web_fetch 被误拒的问题,并可选 DoH 复核真实地址。需要详情、故障排查与 Desktop 说明时,请查阅仓库 README(含中文版 README.zh.md)。

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

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

小夜