经本机 HTTP 代理访问 HTTPS 时,代理先收到 CONNECT。没有 2xx,隧道还没建立,后面的英文不是网站写的。2026-11-11 的 curl 8.5.0 里,桩代理回 403 时 curl 报隧道失败;回 200 之后才出现网站自己的状态码。
OpenAI、Anthropic 和 Google 都没有把中国大陆写成这些 API 的无条件服务地。2026-11-11 打开的 ChatGPT 支持国家 页眉是 “Updated: 20 days ago”。名单里看到 Taiwan,没有看到 China、Hong Kong、Macau。页面写明名单外访问或提供访问,账号可能被封锁或暂停。同一天的 Anthropic 支持地区政策 页眉是 Effective Nov 12, 2026。名单里同样看到 Taiwan,没有看到这三地。让 CONNECT 变成 200,只说明代理同意转发这段字节,不改变地区资格。绕过地区检查可能违反条款,账号或密钥可能被停用。本文不写伪造证件、购买或借用账号、密钥和支付卡。起草环境不是大陆宽带。
先把两次状态码分开
一个可单独引用的区分:CONNECT 的状态码是代理对「要不要建隧道」的回答;隧道建立之后的 HTTP 状态码,才是目标网站对这次请求的回答。
| 你留下的记录 | 更像什么 | 下一步 |
|---|---|---|
连不上 127.0.0.1 上的代理端口 | 本机代理没在听 | 不要记成网站拒绝 |
curl 打印 CONNECT tunnel failed, response 加一个非 2xx | 隧道没建成 | 先看是谁回的这一行 |
200 Connection established 之后 TLS 失败 | 字节已经交给代理,握手停在后面 | 见 AI 站点的 TLS 停在哪一步 |
| 隧道 200 之后是 401,正文写缺少认证 | 请求到了接口,身份不对 | 不要先改出口 |
| 隧道 200 之后出现国家、地区或 territory | 网站按它看见的访问拒绝 | 对照名单,停止把同一次请求反复重发 |
路径完全没有 HTTP 状态码时的分法,见 大陆代理连上后仍失败。401 和账单的其余差别,见 国外 AI 的 API、订阅与支付排查。那一篇的核对日是 2026-10-26,本文没有重开它的错误码页。
规范里,2xx 才切到隧道
RFC 9110 第 9.3.6 节写明:CONNECT 请求接收方建立一条到目标源站的隧道;成功之后,双方只做双向盲转发,直到隧道关闭。请求目标是主机和端口,中间一个冒号,没有默认端口。第 6.4.1 节写:对 CONNECT 的 2xx 把连接切到隧道模式,而不是带有内容。第 15.3.1 节写:对 CONNECT 而言没有内容,因为成功的结果就是隧道,它紧接在 200 响应头之后开始。
因此非 2xx 时,不能把正文当成目标网站的页面。代理可以拒绝它不愿意连接的目标。规范还写,支持 CONNECT 的代理应当把用途限制在已知端口或可配置的目标列表。本文不写如何放宽这张列表。
curl 8.5.0 当天实际打印了什么
2026-11-11 的 curl 是 8.5.0(libcurl/8.5.0,OpenSSL/3.0.13),发行说明为 Release-Date: 2023-12-06,软件包标注 security patched: 8.5.0-2ubuntu10.16。你机器上的行为以 curl --version 为准。
curl 手册 当天写:-x, --proxy 没有协议前缀或使用 http:// 时,当作 HTTP 代理。没写端口时假定为 1080。--proxytunnel 的句子是:在使用 HTTP 代理时,用 CONNECT 把流量隧道化,并要求代理允许连到 curl 想去的那个端口。手册页眉没有给出一个 curl 版本号。
下面两次都加了 --http1.1,代理端口写在命令里。没有加 --proxytunnel。
第一次,本机一个只回答 CONNECT、不会向外拨号的桩,对 CONNECT api.openai.com:443 HTTP/1.1 返回 HTTP/1.1 403 Forbidden,正文是 proxy denied。curl 的标准错误里有:
* Establish HTTP proxy tunnel to api.openai.com:443
> CONNECT api.openai.com:443 HTTP/1.1
< HTTP/1.1 403 Forbidden
* CONNECT tunnel failed, response 403
curl: (56) CONNECT tunnel failed, response 403
退出码是 56。请求没有送到 OpenAI。这行 403 不能拿去和「国家、地区或领土不支持」对照。
第二次,另一个本机桩先返回 HTTP/1.1 200 Connection established,再把字节转到 example.com:443。curl 接着打印 CONNECT tunnel established, response 200,完成 TLS,然后网站返回 HTTP/1.1 200 OK。-D - 会把 CONNECT 的响应头和网站的响应头先后打出来。先出现的 200 是隧道,后出现的 200 才是 example.com。这次没有使用 api.openai.com,不能把 example.com 的 200 当成 OpenAI 的结果。
同一天,不经代理、不带密钥,直接请求 https://api.openai.com/v1/models,约 0.15 秒得到 HTTP/2 401。JSON 的 type 为 invalid_request_error,消息为 “Missing bearer authentication in header”。响应头有 x-request-id: a7c1000c-6376-491e-97cc-4edce1b04e6b。这只证明起草环境里主机回了认证错误,也说明 401 可以出现在根本没有 CONNECT 的那一次。不要把桩代理的 403 和这次 401 合成同一次访问。
没有在真实的本地代理上重放 api.openai.com。代理软件若在连不上目标时回 502 或其他状态码,英文以你的 curl 为准,本文只记录了 403 和 200。环境变量若把主机排除在代理之外,这次可能根本不发 CONNECT,见 官方 SDK 怎么走代理。
200 之后才轮到地区句
隧道已经 200,后面的 HTTP 状态码才进入网站自己的错误表。2026-11-11 没有重开 OpenAI 的错误码页,也没有做出「国家不支持」的 403。已有的分法见 网页能开,不代表 API 同一出口 和 API、订阅与支付排查。流式响应在 200 之后仍可能断开,见 流式返回 200 之后,连接仍会断。那是隧道建成之后的另一件事。
iPhone 上请求根本没进隧道时,不会出现这次 CONNECT,见同日草稿 全部网络没打开时,AI 请求会直连。Linux 上名字仍问本地解析器,见同日草稿 路由域没盖住时,AI 域名问本地。这两篇仍是草稿,链接要等发布后才有效。
公开文件里的法律范围
工信部信管函〔2017〕32 号 于 2017-01-22 发布。其中写明:未经电信主管部门批准,不得自行建立或租用专线(含虚拟专用网络 VPN)等其他信道开展跨境经营活动。
2017-01-24 的答记者问 说明,规范的是没有国际通信业务经营资质、私自开展跨境电信业务经营的企业或个人。企业因办公自用,向依法设置国际通信出入口局的经营者租用,不在答记者问所说的影响范围内。本文不判断某种个人使用是否违法,也不写规避执法的做法。2026-11-11 没有重新打开部委网页。
一次失败留下的记录
记下四样东西:curl 版本、代理地址是不是本机端口、CONNECT 那一行的状态码、隧道 200 之后的 HTTP 状态码和 x-request-id(如果有)。只有第一行、没有第二行时,停止改账号和出口。两行都有、第二行仍是国家或地区不支持时,停止改 CONNECT,按对方的名单处理。