ChatGPT、Claude 或 Gemini 打不开时,先分开三件事:TCP 没有连上、TLS 没有完成、HTTP 已经返回。2026-11-01 在起草环境(不是大陆宽带)里,这三家的握手都能完成;其中两家接着返回带 Cloudflare 质询的 403。那种 403 不是「TLS 被重置」,也不是帮助中心写的 unsupported country。路径不通的查法见 大陆代理连上后仍失败。已经出现地区英文时,改查 Claude 与 Gemini 的地区报错和注册。

OpenAI、Anthropic 和 Google 都没有把中国大陆写成这些消费级产品的无条件服务地。从名单外访问或向名单外提供访问,可能违反条款,账号可能被限制或停用。本文只记录握手停在哪一层,不写伪造证件、购买或借用账号、手机号和支付卡。

先记下四个数,再看英文报错

一个可单独引用的区分:还没有 HTTP 状态码时,失败停在传输;已经有状态码时,再读正文和响应头,决定是质询、地区名单还是别的拒绝。

curl 手册 在 2026-11-01 对这几个 -w 变量的说明是:

变量手册中的含义
time_connect从开始到 TCP 连上远程主机或代理的秒数
time_appconnect从开始到 SSL/SSH 等握手完成的秒数
http_code最后一次 HTTP(S) 或 FTP(S) 传输里读到的数字状态码
errormsg错误文本。手册写明在 7.75.0 加入
exitcode这次传输的退出码。手册写明在 7.75.0 加入

本机是 curl 8.5.0(Release-Date: 2023-12-06,软件包安全修订 8.5.0-2ubuntu10.16),TLS 库是 OpenSSL 3.0.13(30 Jan 2024)。手册把 time_connect 写成「远程主机或代理」。下面的命令没有加 --proxy,数字是到网站主机的。加上本机代理之后,先按这句重新读,不要把「连上代理端口」记成「连上 ChatGPT」。

curl -4 -sS -o /dev/null --max-time 20 \
  -w 'http=%{http_code} connect=%{time_connect} appconnect=%{time_appconnect} exit=%{exitcode} err=%{errormsg}\n' \
  https://chatgpt.com/

把主机名换成 https://claude.ai/ 和 https://gemini.google.com/ 再各跑一次。三次都加 -4,避免和 IPv6 的另一条路径混在同一行。IPv6 旁路见 IPv6 泄漏检查。

2026-11-01 起草环境的三次结果是:

主机httpconnectappconnectexit
chatgpt.com4030.0078320.0241060
claude.ai4030.0174620.0461270
gemini.google.com2000.0153720.0306050

三次都是 connect 与 appconnect 大于 0,退出码为 0。退出码 0 只说明这次传输按 curl 的默认规则结束了。当天 HTTP 403 时退出码仍是 0。手册里的 --fail 本文没有另做对照,所以不写「加上 -f 会变成哪个退出码」。

同一天用这条命令连本机已经关闭的 127.0.0.1:9,得到 http=000、connect=0、appconnect=0、退出码 7,错误文本是 “Failed to connect … Couldn’t connect to server”。这只说明这一版 curl 怎样打印一次 TCP 拒绝,不是 ChatGPT 的样本,也不是大陆宽带的样本。

读自己的输出时对照:

你看到的组合先记成什么
http=000,connect 为 0,错误是超时或拒绝TCP 没有完成。还没有网站的 HTTP 正文
connect 大于 0,appconnect 为 0,错误是重置或握手失败TCP 有过,TLS 没有完成
appconnect 大于 0,并且有 200、403 或其他 HTTP 数字握手完成,对方或边缘节点回了 HTTP
浏览器里出现国家、地区或 territory 的拒绝英文名单或账号策略。停止把同一条连接重试当作修复

第三行在当天的起草环境里出现了。第四行当天没有在这台机器的 curl 正文里出现。大陆宽带上的停点以你自己的输出为准,本文没有在那里复测。

握手行只说明这一次的库打印了什么

同日另一次 curl -4 -v --max-time 25 https://chatgpt.com/ 在 * 行里依次出现:Connected to chatgpt.com (...) port 443、TLSv1.3 (OUT), TLS handshake, Client hello (1)、TLSv1.3 (IN), TLS handshake, Server hello (2),随后是 Certificate、CERT verify、Finished,然后 SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384,最后 HTTP/2 403。那一次的耗时和上一节的 -w 不是同一次运行,两边的秒数不必相同。

这些行是 curl 8.5.0 配 OpenSSL 时的打印。Windows 上的 Schannel 或 macOS 上的 Secure Transport 用词可以不同。只把「有没有 Server hello、有没有 HTTP 状态」抄下来,不要把某一行英文当成所有系统的固定原文。

OpenSSL 3.0 的 s_client 手册 把 -brief 写成只给连接参数的简短摘要。本机 openssl s_client -help 把 -servername 写成在 ClientHello 里设置 SNI。当天对 chatgpt.com:443 执行:

openssl s_client -brief -connect chatgpt.com:443 -servername chatgpt.com </dev/null

输出含有 CONNECTION ESTABLISHED、Protocol version: TLSv1.3、Ciphersuite: TLS_AES_256_GCM_SHA384、Peer certificate: CN = chatgpt.com、Verification: OK。手册示例里也能看到前三行这种版式。证书经 openssl x509 -noout -issuer -dates 读到的签发者是 CN = YE1、O = Let's Encrypt,notBefore 为 Oct 30 17:08:46 2026 GMT,notAfter 为 Jan 28 17:08:45 2027 GMT。日期会过期,不要把这一张证书写成长期事实。

Verification 不是 OK 时,先核对系统时间,见 系统时间不准时 VPN 为何握手失败。不要先把证书失败改记成封号。

403 且带质询头时,先不要改账号

当天 chatgpt.com 与 claude.ai 的响应头都有 cf-mitigated: challenge,server 为 cloudflare。chatgpt.com 的 cf-ray 以 IAD 结尾。这和 2026-10-26 对 claude.ai 做 HEAD 时看到的质询是同一类响应头,只说明这个没有浏览器特征的客户端被要求做人机验证。浏览器带着普通页面再访问,可能得到另一个状态码。两种结果都要留下,不要互相覆盖。

帮助中心 Why can’t I sign up due to “unsupported country”? 在 2026-11-01 的页眉是 “Updated: 12 days ago”,没有日历日期。它写的是:从不在支持名单上的地方注册或创建 API 密钥时,会看到这句报错。它没有把 Cloudflare 的 cf-mitigated 写成这句报错的响应头。因此:

  • 只有质询头、没有这句英文:先换一个会完成页面的客户端再看,不要按封号处理。
  • 浏览器里已经是这句英文:对照 支持国家页。当天页眉是 “Updated: 10 days ago”。英文名单里能看到 Taiwan,没有看到 China、Hong Kong、Macau 这几个写法。名单很长,发布前应再搜索一次。
  • 状态页是否另有故障,用另一篇文章的接口看,不要从 403 推断全站宕机。那篇草稿是 状态页正常,不等于路径通,链接要等发布后才有效。

Anthropic 的 Supported Regions Policy 当天页眉生效日是 2026-11-12,晚于核对日。名单中能看到 Taiwan,没有看到中国大陆、香港、澳门。生效日之前是否已经按这张名单执行,不能从页眉反推。

同一条命令换出口,只回答有没有 HTTP

隧道按钮显示已连接,只说明本机到代理服务器的一段。上面的 curl 若不经过那条隧道,测到的是直连路径。要看「这条出口上的握手」,需要让这条 curl 走你已经在用的那条出口,再比较 appconnect 和 http。怎样把域名送进某一条出站,见 没嗅探时,AI 域名规则对不上。

换出口之后如果 appconnect 从 0 变成大于 0,并且出现 HTTP 数字,传输这一层已经换了结果。若数字旁边的正文仍是地区英文,就停在名单和账号上,不要再换协议。测速组可能在两次运行之间改换国家,那种跳跃见草稿 测速组不要给 AI 换国家,链接要等发布后才有效。

2026-11-01 没有在大陆宽带上采集「Client hello 之后连接被重置」的样本,因此不把这种重置写成某一种固定设备或某一个运营商的行为,也不把某一种协议写成更不容易被打断。

公开文件里的法律范围

2026-11-01 打开的《关于清理规范互联网网络接入服务市场的通知》(工信部信管函〔2017〕32号,通知页)写明:未经电信主管部门批准,不得自行建立或租用专线(含虚拟专用网络 VPN)等其他信道开展跨境经营活动。同日打开的 答记者问 写明,规范对象是未经电信主管部门批准、无国际通信业务经营资质的企业或个人,租用国际专线或 VPN,私自开展跨境的电信业务经营活动;企业因办公自用,向依法设置国际通信出入口局的经营者租用,不在该条针对的范围内。通知用的是「建立或租用」,答记者问用的是「建立和租用」,两句不要并成一句。本文不判断某种个人使用是否违法,也不写规避执法的做法。

一次失败留下的记录

  1. curl 版本,以及 http、connect、appconnect、exit、err 这一行。不要只写「超时」。
  2. 若开了 -v 或 openssl s_client -brief:有没有 Server hello,Verification 是什么。证书日期可以记,完整证书不必贴出。
  3. 有 HTTP 时:状态码,以及有没有 cf-mitigated。有地区英文就抄下原文,不要改写成「被墙」。
  4. 这条命令有没有走代理。没有走时,不要把它和客户端里的节点名放在同一行。

下一次升级 curl 或换出口,用同一行 -w 再记一次。2026-11-01 的秒数只属于起草环境的那几次运行。