受管理的 Runtime HTTP 保留 URL、凭据、重定向与 TLS 策略,同时让公共目标走用户配置的普通代理。请求经代理发出时,目标 hostname 由代理解析;客户端先验证目标,再固定并检查代理 socket 地址。
直连并固定对端地址的连接无法访问只能经用户代理到达的服务。Clash 等 fake-IP 代理还会用基准测试网段 198.18.0.0/15 回答本地 DNS 查询,只信任本地解析的策略会把每个公共 hostname 都判为非全局地址并拒绝(NON_GLOBAL_ADDRESS),尽管真正的解析发生在代理内部。
tool.web_fetch、tool.image_result.download、渠道附件与资源下载)以及固定的已审计 HTTPS 服务(包括 DuckDuckGo 在内的搜索 API、图像 API、更新器、技能目录、office 资源、渠道 API、TTS)。provider.*、webui.model_listing.*)只在目标 origin 位于 provider API 或 OAuth 审计列表中时使用普通代理。每个请求和每一跳重定向都先选定路由,再运行目标策略,因此策略与传输对是否经代理始终一致。被 NO_PROXY 命中的 host,或没有任何路由的进程,直连并执行完整的本地地址检查。
公共请求经代理发出时,策略按“由代理解析”评估:
localhost,以及 .localhost、.local、.lan、.home.arpa、.internal、.intranet、.corp、.home 后缀。metadata hostname 报告 METADATA_ADDRESS。198.18.0.0/15 的 fake-IP 结果和解析失败交给代理处理;格式错误的结果按失败关闭处理。requires_proxy。为这类决策建立直连连接池或打开直连 socket 会抛出 PROXY_ROUTE_REQUIRED。固定的已审计 HTTPS 服务在直连时也接受 fake-IP 结果,因为调用方无法选择其 hostname,且 TLS 会验证它。不可信的公共 URL 在直连时从不接受 fake-IP 结果。
HTTP、HTTPS 与 SOCKS5 使用 httpcore 代理连接池和地址策略 backend。HTTPS 目标按 hostname 通过 CONNECT 隧道发送,明文 HTTP 目标以绝对形式转发。代理 authority 是用户选择的连接目标;metadata 和 link-local 地址仍被禁止。代理认证只传递给代理握手。TLS 验证原始服务 hostname,Host 来自验证过的 origin,重定向不能跨 origin 转发凭据。失败不回退直连。
客户端保留不可变的代理配置,配置参与共享客户端缓存身份。代理变更后新调用替换旧客户端。显式提供的传输安全对象不隐式继承环境代理。
复用 HTTPX 环境解析与 URLPattern 优先级,不实现第二套 NO_PROXY 匹配。普通代理和 PolicyProxyConfig 分离:Clash 不被视为执行任意 URL 策略的代理,因此本地检查仍在它之前运行。不增加 profile、不关闭 URL 保护、不改 OAuth 凭据、不把普通代理扩展到配置的自定义服务。CA 文件由出站安全配置显式控制。
接受的剩余风险:经代理时最终解析由代理完成,真实结果为私有地址的公共 hostname 只有在本地解析返回该真实结果时才会被拦截。在 fake-IP 解析器之后,或本地检查与代理查询之间发生 DNS rebinding 时,由代理自身的规则决定。只读方法、不可信 URL 的 80/443 端口限制与凭据剥离仍然生效。需要严格保证的所有者可配置执行策略的代理,或把 host 列入 NO_PROXY。
公共同步与异步入口支持 HTTP、HTTPS、SOCKS5 路由;fake-IP 解析器之后 web_fetch 经代理按 hostname 到达目标;经代理时 IP 字面量、本地名称和真实私有结果仍被拒绝;NO_PROXY host 保留直连检查;由代理解析的决策从不打开直连 socket;保留 NO_PROXY 和覆盖优先级;路由变化后替换共享客户端;网络连接前拒绝非法目标与代理地址;隔离服务和代理凭据;保留显式策略代理行为与资源清理。
已实现于 openprogram/security/url_policy.py(proxy_resolves、requires_proxy)、openprogram/security/safe_http.py(uses_ambient_proxy、先选路由再评估策略)与 load_outbound_security_config。沙箱命令代理(openprogram/sandbox/network_policy.py)保留自己的直连公共地址规则,尚不识别 fake-IP 结果。实际模型回复还需要有效的 provider 凭据和可用额度。
来源: references/openclaw/src/infra/net/proxy-env.ts, proxy-fetch.ts,
src/infra/net/proxy/, and https://docs.openclaw.ai/cli/proxy/.
proxy-env.ts)刻意复现 undici EnvHttpProxyAgent 语义:小写变量优先于大写;HTTPS 请求优先使用 https_proxy,随后回退到 http_proxy;ALL_PROXY 作为显式传入的回退。完整的 NO_PROXY 匹配器检查每次代理决策,支持逗号/空白分隔、不区分大小写、*、前导点、*.、子域后缀、可选 :port、方括号 IPv6,以及自定义 IPv4-CIDR 扩展。由于 undici 不导出匹配器,此实现需与 undici 保持同步。--proxy-url 参数 / proxy.proxyUrl 配置 / OPENCLAW_PROXY_URL 环境变量,可选 --proxy-ca-file。以包装 undici ProxyAgent 的 makeProxyFetch(proxyUrl) 实现,并管理代理生命周期,包括验证、TLS 选项和活动状态跟踪。fetch-guard.ts)也组合使用同一个 matchesNoProxy。OpenProgram 采用标准环境变量具有统一且文档化解释这一诊断特性,同时在受管 provider 路径增加独立的策略代理边界。OpenClaw 还提供代理生命周期验证与 SSRF 检查,本设计不需要这些机制。