前言¶
DeepSeek Harness(DSH)里的 web_fetch 会在连接前解析域名,解析结果里一旦出现非公网地址就直接拒绝,报错 WEB_BLOCKED_URL。这在多数环境下是合理的 SSRF 防护。若本机开着 Clash 或 mihomo 的 TUN,并启用 enhanced-mode: fake-ip,系统 DNS 会把域名解析到保留段(常见为 198.18.0.0/15 与 2001:2::/64)。这些地址在 DSH 内置判定里不算公网,于是抓取会被一律拦下,而浏览器和其他应用往往仍能正常上网。关掉 TUN 才能用 web_fetch,或在 Windows 上因多网卡 DNS 行为表现为时好时坏。下面介绍社区插件 dsh-web-fetch-lan(维护者 wqzhellohhwy,分类:联网工具),专门在这一类代理环境下让 web_fetch 可用,同时保留对内网、回环、云元数据等地址的拦截。
这是什么¶
dsh-web-fetch-lan 是零依赖的 DSH 插件(当前仓库版本 1.1.0,MIT 许可)。它注册替换用的 fetch provider(id = http-lan),在 fake-ip 解析结果上放宽判定:把可配置的 fake-ip 段当作可连接目标,其余非公网类别仍与内置逻辑一致拒绝。连接仍由 mihomo 按域名映射转发,并不会真的连到 198.18.x.x 上的虚构主机。
核心功能¶
与内置 provider 的差异¶
判定规则只有一处不同:
| 解析结果 | 内置 provider | 本插件 |
|---|---|---|
| 公网地址 | 放行 | 放行 |
| fake-ip 段(可配置) | 拒绝 | 放行 |
| 回环 / 私网 / 链路本地 / CGNAT / 组播 / 保留段 | 拒绝 | 拒绝 |
因此 127.0.0.1、192.168.x.x、169.254.169.254、[::1] 等依旧会被挡住,不会因安装插件而暴露本机服务、内网设备或云元数据端点。
DNS 连接顺序¶
在 TUN + fake-ip 下,若 Node 按 DNS 原顺序(verbatim,IPv6 优先)连接,HTTPS 可能出现间歇性 ECONNRESET。插件在 apply() 里将本进程 DNS 结果顺序设为 ipv4first;无 A 记录时仍会走 AAAA。README 称实测连续 8/8 成功。
与内置一致的行为边界¶
- 仅同源重定向,最多 5 跳;跨源跳转(含
http://→https://)会拒绝并提示重试目标 URL。 - 响应上限 2 MiB,正文截断 200,000 字符;只接受文本类
content-type。 - 单次抓取 30 秒超时。
- URL 不允许携带凭据,只支持
http:/https:。
被 SSRF 拦截时,报错会明确写 not a public address / resolves to a non-public IP address;fetch failed 多为网络层或代理节点问题,与拦截不是同一类失败。
安装与启用¶
插件通过 DSH 桌面版的插件管理器安装(不是 dsh plugin CLI;profile 由 Electron 管理):
- 将仓库放在任意目录,例如
D:\repository\dsh-web-fetch-lan; - 打开 DSH 侧栏 插件 → 添加插件,填入该目录的绝对路径后安装;
- 若提示需要重启,重启 DSH(provider 在宿主进程启动时装载)。
相对路径会被安装器拒绝,必须使用绝对路径。安装后 profile 的 package.json 会多出 link: 依赖与 bundle 条目;在插件页删除即可卸载,内置 provider 立即恢复。
cordis.patch.yml 会把 web 条的 fetchProvider 固定为 http-lan;内置 web-fetch-http 仍注册,不显式指定会得到 WEB_PROVIDER_AMBIGUOUS。
配置 fake-ip 段¶
默认值写在仓库的 cordis.patch.yml:
- insert:
- id: web-fetch-lan
name: '@local/dsh-web-fetch-lan'
config:
fakeIpRanges:
- 198.18.0.0/15
fakeIpRanges6:
- 2001:2::/64
- fdfe:dcba:9876::/64
在 Clash Verge 等客户端修改了 fake-ip-range / fake-ip-range6 后,把对应 CIDR 补进上述配置并重启 DSH,无需改插件源码。
也可在 profile 层覆盖(~/.dsh/profiles/<profile>/cordis.patch.yml):
- id: web-fetch-lan
config:
fakeIpRanges: ['198.18.0.0/15']
fakeIpRanges6: ['2001:2::/64']
容错:条目逐个 CIDR 校验,非法条目剔除后保留其余;非数组或全部非法时回退内置默认段并在日志告警。启动日志会打印生效段,例如:
[web-fetch-lan] fake-ip 段 v4=198.18.0.0/15 v6=2001:2::/64,fdfe:dcba:9876::/64
典型用法与自检¶
安装并重启 DSH 后,智能体侧继续使用 DSH 提供的 web_fetch 即可;无需在对话里单独调用插件 API。生效表现为:在 fake-ip 环境下不再因「解析到 non-public IP」而整站不可用。
仓库提供零依赖自检,可在插件目录执行:
node selftest.mjs
或:
pnpm test
自检覆盖配置归一与回退、地址判定、provider 装配,并确认 127.0.0.1、169.254.169.254、[::1]、192.168.3.1、file:、带凭据 URL 仍被拒绝;末尾附带一次真实抓取(代理未开时只提示,不计入退出码)。
适用场景与注意¶
适合谁: 日常开着 Clash / mihomo TUN + fake-ip,又需要在 DSH 里稳定使用 web_fetch 拉取公网文档或页面的开发者。
权限与安全: 插件以当前 DSH 宿主进程权限运行,会参与出站 HTTP(S) 抓取。安装前应阅读仓库源码与 MIT 许可证,确认 fake-ip 段配置与本地代理设置一致;社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,插件来源以 GitHub 仓库为准。
生态背景: DSH 采用「一切皆插件」的扩展方式;本插件属于联网工具类,星标与维护状态以仓库页面为准(截至资料抓取时为 0 star)。
结尾¶
dsh-web-fetch-lan 只放宽 fake-ip 段的 SSRF 判定,并可选优化 DNS 连接顺序,目的是在 TUN 代理环境下恢复 web_fetch,而不放开内网与元数据地址。目录页:https://www.skillhub.cn/plugins/wqzhellohhwy/dsh-web-fetch-lan;源码与 README:https://github.com/wqzhellohhwy/dsh-web-fetch-lan。