出站网络代理

受管理的 Runtime HTTP 保留 URL、凭据、重定向与 TLS 策略,同时让公共目标走用户配置的普通代理。请求经代理发出时,目标 hostname 由代理解析;客户端先验证目标,再固定并检查代理 socket 地址。

问题

直连并固定对端地址的连接无法访问只能经用户代理到达的服务。Clash 等 fake-IP 代理还会用基准测试网段 198.18.0.0/15 回答本地 DNS 查询,只信任本地解析的策略会把每个公共 hostname 都判为非全局地址并拒绝(NON_GLOBAL_ADDRESS),尽管真正的解析发生在代理内部。

适用边界

每个请求和每一跳重定向都先选定路由,再运行目标策略,因此策略与传输对是否经代理始终一致。被 NO_PROXY 命中的 host,或没有任何路由的进程,直连并执行完整的本地地址检查。

由代理解析的目标

公共请求经代理发出时,策略按“由代理解析”评估:

固定的已审计 HTTPS 服务在直连时也接受 fake-IP 结果,因为调用方无法选择其 hostname,且 TLS 会验证它。不可信的公共 URL 在直连时从不接受 fake-IP 结果。

解析和传输

  1. 显式 security.outbound_url.policy_proxy 优先,保留执行目标策略的要求;此时不使用普通代理。
  2. OPENPROGRAM_PROXY_URL 覆盖普通代理配置,并保留 NO_PROXY。
  3. HTTPX 解析标准环境变量,在适用时使用 Python 的 macOS 与 Windows 系统代理回退。loopback host 始终绕过代理。

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 凭据和可用额度。

2. OpenClaw 的处理方式

来源: references/openclaw/src/infra/net/proxy-env.ts, proxy-fetch.ts, src/infra/net/proxy/, and https://docs.openclaw.ai/cli/proxy/.

OpenProgram 采用标准环境变量具有统一且文档化解释这一诊断特性,同时在受管 provider 路径增加独立的策略代理边界。OpenClaw 还提供代理生命周期验证与 SSRF 检查,本设计不需要这些机制。