问题现象

最近一个月来在使用小龙虾(OpenClaw)时,工具 web_fetch(网页内容抓取)频繁失败,错误信息为:

Blocked: resolves to private/internal/special-use IP address

这直接导致无法用 web_fetch 读取任何外部网页内容,包括技术文档、社区帖子、工具官网等。

内网站点同样受影响——即使访问的是局域网内的服务(例如 NAS 管理界面、路由器后台、局域网文件服务等),SSRF 检查也会因为同样的原因拦截请求。

当然小龙虾会在 web_fetch 调用不通的时候,换用 curl 或者干脆调用联网搜索来搜索要访问的 URL,所以之前一直没太强的感知。


排查过程

1. 定位根因

通过 DNS 查询确认,Surge(macOS 上的网络路由配置工具)在增强模式下,会将所有 DNS 查询劫持到虚拟 IP 段 198.18.0.0/15(RFC 2544 基准测试地址段),并返回一个虚假的 Fake IP 地址。OpenClaw 的 SSRF 安全检查识别到这是特殊保留地址段,判定为风险地址并拒绝访问。

简单来说:Surge 返回了「假 IP」→ OpenClaw SSRF 拦截了「假 IP」→ web_fetch 失败

Fake IP 的隐私保护机制

Fake IP 模式的核心目的是隐私保护。当 DNS 查询被劫持并返回虚假 IP 时,真实的访问目标不会被暴露在本地网络层面——所有流量都通过加密隧道转发,外部观察者只能看到代理服务器的 IP,无法追踪到用户实际访问的域名。这种设计在需要保护查询隐私的场景下非常实用。

但与此同时,OpenClaw 的 SSRF 安全检查会将 Fake IP 判定为可疑地址并拦截,因为它无法区分「真正的私有/内网 IP」和「代理工具生成的虚拟 IP」。

2. 搜索官方议题

在 GitHub OpenClaw 仓库中搜索,发现这是一个被广泛反馈的问题,涉及多个相关议题:

议题

状态

说明

#24454

Closed as not planned

提议增加 privateAddressPolicy 配置,官方直接拒绝

#25322

Closed

提议为 web_fetch 增加 ssrfPolicy 配置支持

#61830

Merged

为 web_fetch 新增 allowRfc2544BenchmarkRange 配置项(v2026.4.10+)

#66493

Open

报告配置不生效的 Bug(后续验证表明该问题已修复)

议题 #26847 还提供了一个 DNS-over-HTTPS 补丁方案,思路是劫持 Node.js DNS 解析,对 198.18.x.x 的响应通过 DoH 重新解析为真实 IP,作为配置修复之前的临时绕过方案。

3. 找到官方修复

PR #61830 在 v2026.4.10(2026-04-11 发布)中为 web_fetch 新增了 ssrfPolicy.allowRfc2544BenchmarkRange 配置项,允许用户显式放行 RFC 2544 基准地址段(198.18.0.0/15)。

关键代码变更:

  • src/agents/tools/web-fetch.ts 中,将 policy 参数透传给底层 fetchWithSsrFGuard()

  • Cache key 增加了 policy 维度,避免严格/宽松策略的缓存混淆

  • 配置 schema 和 types 全面更新

4. 验证修复

只需在 openclaw.jsontools.web.fetch 下添加配置:

{
  "tools": {
    "web": {
      "fetch": {
        "ssrfPolicy": {
          "allowRfc2544BenchmarkRange": true
        }
      }
    }
  }
}

重启 Gateway 后,原本失败的 web_fetch 立即恢复正常,返回完整的网页内容。


解决方案

推荐方案

openclaw.json 中添加以下配置(适用于 v2026.4.10 及以上):

{
  "tools": {
    "web": {
      "fetch": {
        "ssrfPolicy": {
          "allowRfc2544BenchmarkRange": true
        }
      }
    }
  }
}

验证步骤:

# 1. 验证配置合法
openclaw config validate

# 2. 重启 Gateway
openclaw gateway restart

# 3. 测试 web_fetch 是否恢复正常

备选临时方案

如果使用旧版本或配置后仍未生效,可参考议题 #26847 中的 DNS-over-HTTPS 补丁:通过 NODE_OPTIONS --import 注入一个 ESM 模块,劫持 dns.lookup,对返回 198.18.x.x 的查询自动通过 DoH 重新解析。


技术背景

为什么是 198.18.x.x?

198.18.0.0/15 是 RFC 2544 定义的基准测试地址段,专门用于网络设备性能测试。Surge、Clash 等路由工具的 Fake IP 模式使用这个地址段来标识「待建立的连接」,而不是真实的公网 IP。

OpenClaw 的 SSRF 安全检查将这个地址段识别为「特殊保留地址」并默认拦截,这是合理的安全设计——但在使用 Fake IP 路由环境时会导致误拦。

内网站点也受影响

除了外部网站,使用 Fake IP 路由时,本地网络中的内网站点(例如 NAS 管理界面、路由器后台、局域网文件服务等)同样会因 DNS 劫持返回 Fake IP 而被 SSRF 拦截。开启 allowRfc2544BenchmarkRange 配置后,这类场景也能正常使用。


总结

项目

内容

问题

OpenClaw web_fetch 在 Surge 等工具的 Fake IP 环境下失败

根因

Fake IP 返回 198.18.x.x → SSRF 拦截

官方方案

tools.web.fetch.ssrfPolicy.allowRfc2544BenchmarkRange: true

配置位置

~/.openclaw/openclaw.jsontools.web.fetch

最低版本

v2026.4.10(#61830 merged,2026-04-11 发布)

方案效果

✅ 一次性解决,无需维护域名白名单,对内网站点同样有效


本文档写于 2026 年 4 月 16 日,基于 OpenClaw v2026.4.14 版本验证。