sing-box 分流 WARP 出口访问 ChatGPT:告别 Cloudflare 验证
八月 26, 2026 更新: 八月 31, 2026 [网络与安全] #cloudflare #sing-box #proxy现象
自己 VPS(机房 IP)上跑 sing-box 代理,访问 ChatGPT 时经常弹出 Cloudflare 的"确认你是真人"验证页(Turnstile)。换不同节点偶有缓解,但始终频繁。
原因
ChatGPT 背后是 Cloudflare 的 WAF + DDoS 防护。Cloudflare 会对每个访问 IP 评估信誉度,而 VPS 的机房 IP(ASN 类型为 Hosting/Data Center)天然处于低信誉档:
- 机房 IP 连坐:大量爬虫、自动化脚本都从机房 IP 发出,同一个 IP 段里的"坏邻居"会拉低整个段的信誉;
- 地理行为突变:账号短时间内跨多个国家 IP 登录,会触发风控。
所以对 Cloudflare 来说,机房 IP 访问 ChatGPT ≈ 疑似机器人 → 弹验证。
思路:让 ChatGPT 流量走 WARP 出口
与其反复换 VPS 的 IP(不一定干净,还可能收费),不如用 Cloudflare 官方的 WARP 作为 ChatGPT 流量的出口。
WARP 是 Cloudflare 官方出品的网络客户端(本质是基于 WireGuard 协议的隧道),它的出口 IP 由 Cloudflare 管理,信誉度远高于普通机房 IP。社区普遍反馈:WARP 出口访问 ChatGPT 基本不弹验证。
关键决策:不要把整个 VPS 全局走 WARP(会连带 SSH、更新、其他服务全部改出口,还容易踩路由循环),而是把 WARP 注册成 sing-box 的一个 wireguard outbound,只让 OpenAI 相关域名走它。
客户端 → sing-box(VPS)
├── direct ─────────→ VPS 原生 IP(其余流量)
└── wireguard:warp ─→ Cloudflare WARP → ChatGPT(openai.com 等)
澄清:不是 cloudflared,也不是 warp-cli 全局
先区分三个容易混淆的东西:
| 程序 | 方向 | 用途 |
|---|---|---|
cloudflared | 入站 | Cloudflare Tunnel,把外部请求带进你的服务器(反向代理) |
warp-cli | 出站全局 | 系统级客户端,默认把整台机器的流量都走 WARP |
| WARP WireGuard 参数 | 出站按需 | 直接把 WARP 当作一个 WireGuard 端点,由 sing-box 按规则选用 |
前两种都不适合"只让 ChatGPT 流量走 WARP"这个目标。我们只需要拿到 WARP 的 WireGuard 连接参数,交给 sing-box 即可。
第一步:用 wgcf 注册,拿到 WireGuard 参数
WARP 底层就是 WireGuard,但参数不能随便编:private_key、local_address(WARP 分配的 172.16.x.x / fd01:5ca1:ab1e 段)、peer_public_key(WARP 服务端公钥)、reserved(WARP 特有字段)都来自 Cloudflare 的注册流程。
社区标准做法是用 wgcf 模拟注册,在 VPS 上执行:
curl -L -o wgcf https://github.com/ViRb3/wgcf/releases/download/v2.2.22/wgcf_2.2.22_linux_amd64
chmod +x wgcf
./wgcf register --accept-tos # 生成 wgcf-account.toml
./wgcf generate # 生成 wgcf-profile.conf
cat wgcf-profile.conf
生成的 wgcf-profile.conf 类似:
[Interface]
PrivateKey = <WARP_PRIVATE_KEY>
Address = 172.16.0.2/32, fd01:5ca1:ab1e:xxxx:xxxx:xxxx:xxxx:xxxx/128
DNS = 1.1.1.1, 2606:4700:4700::1111
MTU = 1280
[Peer]
PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 162.159.192.1:2408
注意:wgcf-profile.conf 里没有 reserved,但 WARP 的握手必须带 reserved 字段。sing-box 支持配置,生成方法见下文。
第二步:sing-box 配置 WARP outbound
把上面的参数填进 sing-box 的 outbounds(config.json 里):
{
"outbounds": [
{
"type": "direct",
"tag": "direct"
},
{
"type": "wireguard",
"tag": "warp",
"server": "162.159.192.1",
"server_port": 2408,
"local_address": [
"172.16.0.2/32",
"fd01:5ca1:ab1e:xxxx:xxxx:xxxx:xxxx:xxxx/128"
],
"private_key": "WARP_PRIVATE_KEY",
"peer_public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
"reserved": [0, 0, 0],
"mtu": 1280
}
]
}
其中:
peer_public_key是 WARP 的固定公钥bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=,人人相同;reserved是 WARP 三字节保留位,wgcf 生成配置后可用./wgcf generate --profile <(cat wgcf-account.toml) --reserved打印实际值,或直接尝试[0, 0, 0](多数情况下可用);- 免费版 WARP 注册即可用,无需 license key(WARP+ 才需要)。
第三步:路由规则,只让 OpenAI 域名走 WARP
{
"route": {
"rules": [
{
"domain_suffix": [
"chatgpt.com",
"openai.com",
"oaistatic.com",
"oaiusercontent.com",
"auth0.com"
],
"outbound": "warp"
}
]
}
}
ChatGPT 实际涉及的域名不止 chatgpt.com:登录走 auth.openai.com(auth0),静态资源走 oaistatic.com,图片走 oaiusercontent.com。上面的列表覆盖了主要部分。
改完 config.json 重启 sing-box:
systemctl restart sing-box
journalctl -u sing-box -f # 看有没有报错
验证
- WARP 出口确认:让 sing-box 的 DNS/测试流量走 warp 后,检查出口:
# 在客户端通过代理访问
curl https://www.cloudflare.com/cdn-cgi/trace
输出里 warp=on 说明确实从 WARP 出口出去:
ip=<WARP出口IP>
warp=on
-
对比验证频率:分别用 direct 出口和 warp 出口访问 ChatGPT,观察验证页出现频率。多刷新几次、退出登录状态再试,才更接近真实风控场景。
-
其余流量不受影响:
curl ifconfig.me看到的应该是 VPS 原生 IP,说明只有 OpenAI 域名走了 WARP。
注意事项
- WARP 不是保证:WARP 出口 IP 同样可能被大量用户共享,只是信誉比机房 IP 好得多,能大幅减少但未必 100% 消除验证;
- WARP 出口 IP ≠ Cloudflare CDN IP:Cloudflare 不公开 WARP 出口地址池,它和 Worker 禁止
connect()的 CDN IP ranges 是两回事。WARP 用户访问套了 Cloudflare CDN 的网站是官方支持的正常路径,不会"循环丢弃"; - 别全局开 warp-cli:系统级全局 WARP 会改变 VPS 上所有出站流量的出口(SSH 回程、apt 更新、Docker 等都可能受影响),排查问题更难。sing-box outbound 方式完全不动系统路由,SSH 和其余服务照旧;
- 免费 WARP 出口不固定:免费版出口 IP 可能变化;WARP+(付费)有固定 IP 支持,一般没必要。
实测更新(2026-08-28):WARP 出口段被 OpenAI 封禁的情况
用官方 cloudflare-warp 客户端(warp-svc + warp-cli mode proxy,SOCKS5 127.0.0.1:40000)在 VPS 上部署后,把 sing-box 的 OpenAI 域名分流指向它。路由规则确认生效(服务端日志 inbound/vless → outbound/socks[warp]),但实测结果是完全打不开:
chatgpt.com → 403 Unable to load site [IP:104.28.215.69 | Ray ID:...]
openai.com → 403
auth.openai.com → 403
platform.openai.com→ 403
api.openai.com → 403
google.com(对照) → 200(隧道本身健康)
排查过程摘要:
- 原生 VPS IP(UCloud 香港机房)、WARP IPv4 出口(
104.28.215.69)、WARP IPv6 出口(2a09:bac1::/ 重连换段后2a09:bac5::)全部 403; - 强制 IPv4/IPv6 目标、带浏览器 UA、重连换出口段,均无效;
- 错误页是 Cloudflare WAF 的自定义错误页(
Unable to load site+ Ray ID),不是本文主场景的 Turnstile 真人验证页。
结论:这属于 OpenAI WAF 对 WARP 出口段(104.28.x.x / 2a09:bacx::)的 IP 级封禁(社区已知现象,WARP 用户访问 ChatGPT 普遍报此错误),与本文"机房低信誉→弹验证"是两个不同的失败模式:
| 失败模式 | 页面表现 | WARP 是否有效 |
|---|---|---|
| IP 信誉低(机房段) | 频繁弹 Turnstile 真人验证 | 有效,大幅减少验证 |
| IP 被拉黑(WARP 出口段) | Unable to load site 自定义错误页 | 无效,换段也没用 |
经验:部署前先确认目标站点在候选出口上的可用性(curl --socks5-hostname <出口> https://chatgpt.com 看是验证页还是错误页),避免白部署;若 WARP 出口被封,只能换 VPS 商家/机场节点碰运气拿干净 IP,或家庭宽带直连。
总结
机房 IP 访问 ChatGPT 频繁弹 Cloudflare 验证,根因是 IP 信誉,不是账号或浏览器问题。用 wgcf 把 WARP 注册成 WireGuard 参数、在 sing-box 里加一个 wireguard outbound、按域名分流 OpenAI 流量——改动小、不动系统路由,是当前成本最低且有效的方案。如果 WARP 后仍频繁验证,再考虑换原生 IP(ISP 类型)的 VPS 商家,但这是最后一步。注意 2026-08-28 实测补充:WARP 出口段本身可能已被 OpenAI 封禁,部署前务必先验证出口可用性。