错误超时(etimedout)不等于地区限制,需先用curl -i检测是否抵达服务端:401/403说明已连接但被拒,超时或失败则代理未生效;再用nslookup和curl指定ip验证dns与代理链路。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当你在执行 codex login 或 codex suggest 时反复看到 Error: request to https://api.openai.com/v1/chat/completions failed, reason: connect ETIMEDOUT,不能直接断定是地区限制——国内网络路径本身就会触发超时,而真正的地区限制通常表现为 HTTP 403、401 或 DNS 解析失败,不是连接超时。
先确认是否真被地区限制
打开终端,逐行执行以下命令:
curl -I https://api.openai.com/v1/models --max-time 5
如果返回 HTTP/2 401 或 HTTP/2 403,说明请求已抵达 OpenAI 服务端,只是被拒绝授权或地域拦截;若返回 Failed to connect、Connection refused 或卡住超过 5 秒无输出,则大概率是本地代理未生效或端口不通,尚未到服务端拦截环节。
这一步必须用 curl -I(仅获取响应头),避免下载完整 body 导致误判延迟。
验证 DNS 是否被污染或解析异常
方法一:直连检测
运行 nslookup api.openai.com 8.8.8.8
若返回的 IP 地址是 104.18.16.121 或 104.18.17.121 等 Cloudflare 托管 IP,且能 ping 通,则 DNS 正常;若返回私有地址(如 127.0.0.1)、超时或无响应,说明本地 DNS 被劫持或不可达。
方法二:绕过系统 DNS
执行 curl -x http://127.0.0.1:7890 -H "Host: api.openai.com" https://104.18.16.121/v1/models --max-time 10
该命令强制走代理 + 指定 IP,跳过 DNS 解析。若成功返回 JSON,证明不是 DNS 问题,而是你当前配置没走代理;若仍超时,说明代理链路本身不稳定。
检查响应状态码与真实拦截痕迹
第一步:获取完整响应体与状态码
curl -v https://api.openai.com/v1/models 2>&1 | grep -E "(HTTP/|status:|
第二步:重点识别三类关键输出
① 出现 HTTP/2 403 + cf-ray 字段 → Cloudflare 明确拦截,大概率是地区限制或账号风控;
② 出现 HTTP/2 401 + Unauthorized → API Key 无效或未绑定付费账户,与地区无关;
③ 卡在 * Connected to api.openai.com (104.18.16.121) port 443 (#0) 后无后续 → TLS 握手失败或代理未转发,不是地区限制。
【注意】只要 curl -v 中没出现 cf-ray 或明确的 403 响应头,就不是地区限制,而是网络链路或配置问题。
对比不同出口 IP 的行为差异
步骤一:记录当前出口 IP
curl -s https://api.ipify.org
步骤二:切换代理节点(如从日本节点切到新加坡节点),再执行一次
步骤三:对比两次返回的 IP 是否属于同一 ASN 或数据中心 IP 段
若两次返回 IP 都归属 Cloudflare(ASN 13335)但状态码从 403 变为 200,说明原节点被封禁;若始终是 ETIMEDOUT 或 401,说明问题不在出口 IP,而在你的本地代理设置或 Key 绑定状态。
这一步操作起来很简单,直接把 curl 命令复制粘贴进终端就行。











