到达接口的公网地址若不在你自己打开的 IP 允许列表里,调用会被拒绝。这和「国家、地区或领土不支持」不是同一条错误。2026-11-09 核对的是 OpenAI、Anthropic 的允许列表,以及 Google 的密钥限制和 Gemini API 地区页。起草环境不是大陆宽带,没有使用真实密钥。
OpenAI、Anthropic 和 Google 都没有把中国大陆写成这些 API 的无条件服务地。从名单外访问或向名单外提供访问,可能违反条款,账号可能被限制或停用。把出口写进允许列表,只满足你自己设下的那一层,不把人移进国家名单。本文不写伪造证件、购买或借用账号、手机号和支付卡,也不写购买或共用密钥。
先按错误正文分行
一个可单独引用的区分:允许列表比对的是这次请求到达对方时的公网地址;国家名单比对的是对方是否把这个来源当成可服务的国家、地区或领土。
| 你抄到的结果 | 更像哪一份文件 | 不要先做的事 |
|---|---|---|
| 没有 HTTP 状态,只有超时或重置 | 路径还没到接口 | 不要先改允许列表 |
OpenAI HTTP 401,type 为 ip_not_authorized | 你的项目或组织允许列表 | 不要记成 403 的国家错误 |
| OpenAI HTTP 403,正文是国家、地区或领土不支持 | API 地区名单 | 不要靠往列表里加地址去修 |
Anthropic HTTP 403,permission_error,消息写 IP 不在允许范围 | 组织允许列表 | 不要当成错误目录里那句泛指的权限 |
| 只有「缺少密钥」的 401 | 认证还没过 | 不要用这次证明允许列表 |
Gemini 密钥的 reason 写着 IP、引荐来源或应用被拦 | 这把密钥自己的客户端限制 | 不要把它抄成地区页上的句子 |
网页和 API 是否同一出口,见 网页能开,不代表 API 同一出口。账单上的 401、402、429 见 国外 AI 的 API、订阅与支付排查。那一篇核对日更早,本文没有重开它的整张表。商店账号里的国家是另一层,见同日草稿 商店扣款国家不是出口国家,链接要等发布后才有效。
OpenAI:允许列表只盖住 API
IP allowlist 在 2026-11-09 写明:打开之后,不在列表里的地址即使带了有效密钥也会被拒绝。它只作用于 API 请求,不限制 platform.openai.com,也不限制用户登录。文档让你在 NAT、VPN、防火墙或代理之后确认公网出口,因为接口看的是到达 OpenAI 的源地址。
同一页的数量和优先级:
- 列表最多 50 条,可以是单个地址或 CIDR。
- 项目级列表优先于组织级。两份不合并:项目有自己的有效列表时只用项目的;没有时才用组织的。
- 改完最多等 15 分钟。
- 设置路径写成 Settings、Security、IP allowlist。组织所有者角色具备读写这项设置的权限。
帮助中心 IP allowlisting for OpenAI API 页眉是 “Updated: 15 days ago”,没有日历日期。它给的拦截示例是 HTTP 401,type 为 ip_not_authorized,消息为 “Your IP is not authorized to access this organization.”。这是页面上的示例,不是本文当天打出来的响应。
错误码 把 401 “IP not authorized” 的原因写成:请求 IP 与项目或组织配置的允许列表不符。解决办法一栏是从正确的 IP 发送,或更新允许列表。同一张表里,403 “Country, region, or territory not supported” 的原因是从不支持的国家、地区或领土访问,解决办法只指向地区说明。
API 支持的国家与地区 当天以 .md 打开,HTTP 200。正文写明,在列出的国家与地区之外访问或提供访问,账号可能被封锁或暂停。名单里能看到 Taiwan,没有看到 China、Hong Kong、Macau。ChatGPT 网页那份帮助页当天用 curl 得到 HTTP 403,正文没有打开,所以不把 API 名单说成已经重核了网页名单。
文档里的排查是:在发出 API 请求的同一条网络路径上确认公网出口;看 NAT、VPN、防火墙、代理或云厂商是否改了出口;用设置里的 Check 工具对照;确认列表作用在这把密钥所属的组织或项目;改完再等最多 15 分钟。这些步骤核对的是你自己的列表。它们没有写「把任意出口加进去,就可以从名单外的国家访问」。
没有密钥时,先停在另一句 401
2026-11-09 对 https://api.openai.com/v1/models 发送不带 Authorization 的 GET。响应是 HTTP 401,www-authenticate 为 Bearer realm="OpenAI API",x-request-id 为 06b4b452-f82b-46bf-9df4-a9ad1f3d37a0。JSON 的 type 是 invalid_request_error,消息是 “Missing bearer authentication in header”,code 为 null。响应头日期是 Mon, 09 Nov 2026 01:30:32 GMT。
这次没有走到允许列表,也不能用来展示 ip_not_authorized。密钥放在环境变量里,不要写进仓库或聊天记录。
Anthropic:403 要看消息原文
IP allowlisting 当天写明这项处于 beta,行为可能变。组织管理员或所有者设定一份覆盖整个组织的范围。对范围内的请求,Anthropic 拿请求的公网地址去比,不在列表里就拒绝。
页面给的 API 例子是:Messages API 返回 403,permission_error,消息为 “Your IP address isn’t in this organization’s allowed range.”。网页和桌面应用上,被拦的人看到标题 “Your current network can’t access this organization.”。Claude Code 看到的是同一句 403。个人账号或其他组织不在这份列表里。
同一页还写了这些边界:
- 改完最多 15 分钟生效。Enterprise 上,已经打开的连接、Office 加载项和 Remote Tools 可能更慢。
- 条目最多 1000 条。可以是单个地址或 CIDR,IPv4 不能宽于
/8,IPv6 不能宽于/32。要写公网地址,不要写10.0.0.0/8这类私网。 - 若代理把
bridge.claudeusercontent.com送到和claude.ai、api.anthropic.com不同的地址,页面让你把那个地址也写上。这是在说组织自己的列表,不是地区政策。 - 页面提醒:把共享代理地址写进去之后,拿到泄漏密钥或被盗登录的人有可能经这个代理使用。不要把别人的出口或公共节点写进列表。
- 这项不适用于 Amazon Bedrock、Claude Platform on AWS、Google Cloud 上的 Claude 模型,或 Microsoft Foundry。
错误目录 当天仍把 403 permission_error 写成:密钥没有使用该资源的权限。目录这句话比允许列表页宽。看到 403 时先抄 error.message 和 request-id,再决定对的是哪一页。
支持地区政策 页眉是 Effective Nov 12, 2026,晚于核对日。产品只在列出的国家与地区提供,未列出的不受支持,并包括人在未列出的地区使用。正文里能看到 Taiwan,没有看到 China、Hong Kong、Macau。当天这段可见文字里没有 “IP allowlist”。生效日之前是否已经执行,不能从页眉反推。
2026-11-09 向 https://api.anthropic.com/v1/messages 发送 POST,头只有 anthropic-version: 2026-10-21 和 content-type: application/json,没有密钥。模型名是 claude-3-5-sonnet-latest,max_tokens 为 1。响应是 HTTP 401,error.type 为 authentication_error,消息为 “x-api-key header is required”。响应头 request-id 与正文 request_id 都是 req_011CgrVPSgywNrrb7LkdJUdq。认证先失败了,所以这次看不到允许列表那句 403。
Gemini:密钥限制是另一套字段
为 API 密钥添加限制 的页脚写着 Last updated 2026-10-26 UTC。客户端限制一次只能选一种:网站引荐来源(browserKeyRestrictions)、调用方 IP(serverKeyRestrictions)、Android 应用或 iOS 应用。不满足限制的请求会失败。IP 可以写成单个地址或 CIDR。页面没有把这四种限制叫成国家名单。
管理 API 密钥 写明 IP 限制用的是调用方的外部地址,不支持内网地址和 localhost。控制台路径是 Credentials 里选中密钥,在 Application restrictions 选择 IP addresses。
ErrorReason 枚举(页面版本 4.8.1)把违反限制的 reason 写成:
| reason | 该页的含义 |
|---|---|
API_KEY_IP_ADDRESS_BLOCKED | 违反密钥的 IP 地址限制 |
API_KEY_HTTP_REFERRER_BLOCKED | 违反密钥的 HTTP 限制 |
API_KEY_ANDROID_APP_BLOCKED | 违反 Android 应用限制 |
API_KEY_IOS_APP_BLOCKED | 违反 iOS 应用限制 |
这四条例子里的 service 都是 storage.googleapis.com,不是 generativelanguage.googleapis.com。2026-11-09 没有用 Gemini 密钥打出这些 reason,不能把例子抄成 Gemini 当天的响应原文。domain 在例子里是 googleapis.com。
Gemini API 可用地区 当天 HTTP 200。页面写这些国家与地区可用;不在其中时,去看 Gemini Enterprise Agent Platform,而不是把名单外说成可用。可见名单里有 Taiwan,没有看到 China、Hong Kong、Macau。密钥限制通过,也不等于这张地区页把来源写成可用。
先看这条路径的出口,再对列表
2026-11-09 在起草环境执行 curl -4 -sS --max-time 20 https://www.cloudflare.com/cdn-cgi/trace。响应里有 ip、loc、colo、http、tls。当天 loc 为 US,colo 为 IAD,http 为 http/2,tls 为 TLSv1.3。这次的 ip 不写入文章。起草环境不是大陆宽带,这个 loc 不能代表你的出口。
在和 API 调用相同的那条路径上分别看两族地址:
curl -4 -sS --max-time 20 https://www.cloudflare.com/cdn-cgi/trace
curl -6 -sS --max-time 20 https://www.cloudflare.com/cdn-cgi/trace
- 两条的
ip不同:允许列表若只写了其中一族,另一族会失败。OpenAI、Anthropic 和 Google 的文档都允许写 IPv6。 loc变了:出口变了。共享地址的含义见 共享出口 IP。- 命令本身超时:先按 大陆代理连上后仍失败 看路径。没有 HTTP 的 API 错误时,不要先改账号。
进程是否读了代理变量,见 官方 SDK 怎么走代理。证书签发者变了,是路径上有人重新签名,见同日草稿 AI 证书签发者变了,先别改账号,链接要等发布后才有效。
公开文件里的法律范围
2026-11-09 打开《关于清理规范互联网网络接入服务市场的通知》(工信部信管函〔2017〕32号,通知页)。其中一节的原文是:未经电信主管部门批准,不得自行建立或租用专线(含虚拟专用网络 VPN)等其他信道开展跨境经营活动。同日打开的 答记者问 在转述时写成「建立和租用」。答记者问写明,规范对象是未经电信主管部门批准、无国际通信业务经营资质的企业或个人,租用国际专线或 VPN,私自开展跨境的电信业务经营活动;外贸企业、跨国企业因办公自用需要跨境联网时,可以向依法设置国际通信出入口局的电信业务经营者租用。两处的「或」和「和」不要并成一句。本文不判断某种个人使用是否违法,也不写规避执法的做法。
一次拒绝留下的记录
- HTTP 状态、
type或reason、消息原文、request-id。没有状态码就写超时或重置。 - 这条请求的主机是
api.openai.com、api.anthropic.com还是generativelanguage.googleapis.com。 - 同一条路径上
trace的loc,以及你对的是 IPv4 还是 IPv6。不要把 IP 贴进公开仓库。 - 这是允许列表、国家名单,还是密钥的客户端限制。三份文本不要合成一句。