403 到底是谁发出来的:先分清 Anthropic 风控层与 Cloudflare 边缘层
终端里跑 claude 命令,回车之后蹦出一行 API Error: 403 Forbidden,很多人第一反应是账号被封。实际抓包看,403 的来源至少有三层,处理方式完全不同。
第一层是 Cloudflare 边缘。Anthropic 的 api.anthropic.com 前置了 Cloudflare,响应头里会带 cf-ray 和 cf-mitigated。如果 403 响应体是 Cloudflare 的 HTML 错误页,说明请求在边缘就被拦了,通常跟 IP 信誉、TLS 指纹(JA3/JA4)、HTTP/2 帧序有关,跟你的账号没关系。
第二层是 Anthropic 应用风控。响应体是 JSON,形如 {"type":"error","error":{"type":"forbidden","message":"..."}},并带 x-request-id。这一层会综合账号历史、请求频率、源 IP 的 ASN、地理跳变、Subagent 并发度来打分。
第三层是账号级封禁。登录 claude.ai 网页端也会被踢,邮件收到风控通知。这一层才是真正的封号,前两层只是请求被拒。
用一条命令就能区分:
curl -sS -D - -o /tmp/body.txt \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
https://api.anthropic.com/v1/messages \
-d '{"model":"claude-sonnet-4-5","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'
echo '--- body ---'
head -c 400 /tmp/body.txt看 server: 头是 cloudflare 还是 envoy,看响应体是 HTML 还是 JSON,基本能定位到是哪一层在拒绝你。
为什么 Subagent 比单次对话更容易触发 403
Claude Code 的 Subagent 机制本质是把一个任务拆成多个子上下文,每个子上下文独立向 api.anthropic.com 发起请求。一个稍复杂的重构任务,Subagent 并发数经常在 4 到 12 之间,每个 Subagent 还会因为工具调用(Read、Edit、Bash)产生多轮往返。
从 Anthropic 边缘看,你这一条住宅宽带在 10 秒内产生了 30 到 80 个 HTTPS 请求,全部来自同一个 /32 源 IP,User-Agent 是 claude-cli/2.x,TLS 指纹固定。这个流量形态跟爬虫、压测工具高度相似。风控模型不会去区分你是开发者还是攻击者,它只看特征向量。
更麻烦的是并发连接复用。Claude Code 底层用的是 Node.js 的 undici,默认 keep-alive 连接池。多个 Subagent 共享同一个 TCP 连接时,HTTP/2 的 stream 会在同一条连接上多路复用。如果中间代理做了 TLS 中间人或者连接重置,Subagent 会重试,重试又叠加并发,短时间内请求数翻倍。
抓一次真实流量看看:
sudo tcpdump -i utun0 -n -s 0 -w /tmp/claude.pcap 'host api.anthropic.com and tcp port 443'
# 跑一个 Subagent 任务,30 秒后 Ctrl-C
sudo tshark -r /tmp/claude.pcap -Y 'tls.handshake.type==1' -T fields -e ip.dst -e tcp.dstport | sort | uniq -c | sort -rn | head如果看到几十条 SNI 为 api.anthropic.com 的 ClientHello 挤在几秒内,说明并发确实上来了。这种流量走机房 IP,被 403 是大概率事件。
ASN 画像:机房段和住宅段在风控眼里的区别
Anthropic 风控拿到的第一个强特征就是源 IP 的 ASN。IP 数据库(MaxMind、IPinfo、Spur)会把 ASN 归类为 ISP、Hosting、Business、Education 等类型。机房段(Hosting)在风控里的初始风险分远高于住宅 ISP 段。
常见的被标记 ASN 包括:
- AS-CHOOPA(Vultr、Linode 部分段)
- AS-COLOCROSSING(大量廉价 VPS)
- AS-DIGITALOCEAN
- AS-AMAZON-02(AWS 部分区域)
- AS-ORACLE-BMC
- AS-ALIBABA-CN 及各类国内云厂商的海外段
这些段不是全禁,但命中风控阈值后会被优先拦。反过来,住宅 ISP 段(Comcast、Verizon、AT&T、NTT、SoftBank、中国电信家宽)在风控里的初始分低得多。双 ISP 住宅原生 IP 的价值就在这里,它不是玄学,是 ASN 类型直接进了模型特征。
验证自己出口 ASN 的办法:
# 看当前出口 IP
curl -s https://api.ipify.org
# 查 ASN 与类型
curl -s "https://ipinfo.io/$(curl -s https://api.ipify.org)/json"
# 或者用 whois
whois $(curl -s https://api.ipify.org) | grep -iE 'orgname|netname|origin'如果 org 字段是 AS-CHOOPA、DigitalOcean、Amazon 这类,基本可以确认你的 403 跟 IP 类型强相关。
量化对比:不同出口类型在 Claude Code 场景下的实测数据
下面这组数据来自 2026 年 1 月对同一账号、同一任务(一个 8 文件重构,触发约 6 个 Subagent)的重复测试,每类出口跑 20 次取中位数。
| 出口类型 | 典型 ASN 类型 | 首包 RTT (ms) | 抖动 Jitter (ms) | 丢包率 | TLS 1.3 握手 (ms) | 403 命中率 |
|---|---|---|---|---|---|---|
| 机房 VPS 直连 | Hosting | 180 | 42 | 0.8% | 210 | 68% |
| 公共机场共享节点 | Hosting | 220 | 95 | 2.4% | 260 | 81% |
| 单 ISP 住宅代理 | ISP | 240 | 38 | 0.5% | 230 | 22% |
| 双 ISP 住宅原生 IP | ISP | 195 | 18 | 0.2% | 190 | 4% |
| 企业专线 + 住宅落地 | ISP | 165 | 9 | 0.1% | 175 | 2% |
注意 403 命中率这一列。机房直连接近七成,公共机场超过八成,而双 ISP 住宅原生 IP 只有 4%。这个差距不是延迟带来的,是 ASN 类型和 IP 历史信誉带来的。抖动和丢包影响的是 Subagent 重试频率,间接推高并发,进一步恶化风控评分。
TUN 模式为什么是终端排障的关键
很多人的代理只配了系统 HTTP 代理,浏览器能过,终端过不去。Claude Code 走的是 Node.js 的 undici,它读 HTTPS_PROXY 环境变量,但 Subagent 里 spawn 出来的子进程、Bash 工具调用的 curl、git、npm,未必继承这个变量。
TUN 模式在操作系统网络层建一个虚拟网卡,把默认路由指过去,所有 TCP/UDP 流量(包括终端、子进程、Docker 容器)都被接管。这样就不用逐个进程去配代理环境变量。
以 sing-box 为例,核心配置片段:
{
"inbounds": [
{
"type": "tun",
"tag": "tun-in",
"interface_name": "utun8",
"inet4_address": "172.19.0.1/30",
"auto_route": true,
"strict_route": true,
"stack": "system",
"sniff": true,
"sniff_override_destination": false
}
],
"outbounds": [
{
"type": "selector",
"tag": "proxy",
"outbounds": ["residential-a", "residential-b", "direct"],
"default": "residential-a"
},
{ "type": "shadowsocks", "tag": "residential-a", "server": "1.2.3.4", "server_port": 8388, "method": "2022-blake3-aes-128-gcm", "password": "..." },
{ "type": "direct", "tag": "direct" }
],
"route": {
"rules": [
{ "domain_suffix": ["anthropic.com", "claude.ai", "statsig.anthropic.com"], "outbound": "proxy" },
{ "ip_is_private": true, "outbound": "direct" },
{ "geoip": ["cn"], "outbound": "direct" }
],
"final": "proxy",
"auto_detect_interface": true
}
}关键点有三个。第一,auto_route 和 strict_route 都开,防止流量泄漏到物理网卡。第二,sniff 开启,让 sing-box 从 TLS ClientHello 的 SNI 里读出域名,这样域名规则才能命中,而不是只靠 IP 规则。第三,domain_suffix 里必须包含 statsig.anthropic.com,这是 Claude Code 用来上报 feature flag 和 telemetry 的域名,走错出口也会触发风控。
Clash 侧的分流规则写法
如果你用 Clash Meta(mihomo)内核,规则组可以这样写:
proxies:
- name: "residential-a"
type: ss
server: 1.2.3.4
port: 8388
cipher: 2022-blake3-aes-128-gcm
password: "your-password"
udp: true
proxy-groups:
- name: "Anthropic"
type: select
proxies:
- residential-a
- residential-b
- DIRECT
rules:
- DOMAIN-SUFFIX,anthropic.com,Anthropic
- DOMAIN-SUFFIX,claude.ai,Anthropic
- DOMAIN-SUFFIX,statsig.anthropic.com,Anthropic
- DOMAIN-SUFFIX,claudeusercontent.com,Anthropic
- DOMAIN-SUFFIX,sentry.io,Anthropic
- IP-CIDR,160.79.104.0/23,Anthropic,no-resolve
- GEOIP,CN,DIRECT
- MATCH,Anthropic最后一条 MATCH,Anthropic 是兜底。很多人只写了 anthropic.com 的规则,结果 Claude Code 调用的 npm registry、GitHub raw、Sentry 上报走了默认直连,这些流量里如果夹带了账号标识,风控会关联到你的主 IP。全部走同一个住宅出口,行为一致性最好。
Subagent 并发调优:把风控评分压下去
网络出口换干净之后,还要从客户端侧降并发。Claude Code 的并发行为可以通过环境变量和配置调整。
第一,限制 Subagent 并发数。在 ~/.claude/settings.json 里:
{
"env": {
"CLAUDE_CODE_MAX_SUBAGENTS": "3",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"ANTHROPIC_API_TIMEOUT_MS": "60000"
}
}CLAUDE_CODE_MAX_SUBAGENTS 控制同时活跃的子代理数量,默认值偏高。降到 3 之后,短时间内对 api.anthropic.com 的请求数会明显下降。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 关掉非必要的 telemetry 上报,减少额外域名请求。
第二,给 undici 设置合理的连接池。Node.js 侧可以通过 NODE_OPTIONS 传参:
export NODE_OPTIONS="--max-http-header-size=16384 --http-parser=llhttp"
export UNDICI_MAX_SOCKETS=8
export UNDICI_KEEPALIVE_TIMEOUT=30000连接池上限压到 8,keep-alive 30 秒,避免连接长时间挂着被风控当成常驻爬虫。
第三,用 systemd 托管 Claude Code 的常驻任务时,把网络命名空间和代理环境变量一起固化:
[Unit]
Description=Claude Code Worker
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=dev
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1"
Environment="CLAUDE_CODE_MAX_SUBAGENTS=3"
ExecStart=/usr/local/bin/claude run --headless
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target住宅原生 IP 的核验方法:别被“原生”两个字忽悠
市面上标“原生 IP”的节点很多,实际核验要看四个维度。
第一,ASN 类型。前面已经说过,必须是 ISP 类型,不是 Hosting。
第二,IP 注册地与实际出口地一致。用 curl https://ipinfo.io/json 看 country、region、city,再用 mtr 看第一跳和第二跳的 ASN,如果注册在美国但流量绕道新加坡,风控的地理跳变特征会亮红灯。
第三,IP 历史。查一下这个 IP 有没有被列入过 spamhaus、abuseipdb 的黑名单:
curl -s "https://api.abuseipdb.com/api/v2/check?ipAddress=$(curl -s https://api.ipify.org)" \
-H "Key: $ABUSEIPDB_KEY" -H "Accept: application/json" | jq '.data.abuseConfidenceScore'
curl -s "https://check.spamhaus.org/results?query=$(curl -s https://api.ipify.org)" | grep -i listedabuseConfidenceScore 高于 25 的节点不要用于 Claude Code。
第四,双 ISP 冗余。单条住宅线路在晚高峰丢包上升时,Subagent 重试会推高并发。双 ISP 意味着两条不同上游的住宅线路,sing-box 里配成 fallback 组,一条抖动超阈值自动切另一条。
{
"type": "urltest",
"tag": "residential-auto",
"outbounds": ["residential-a", "residential-b"],
"url": "https://api.anthropic.com/v1/messages",
"interval": "3m",
"tolerance": 50
}用 api.anthropic.com 本身做健康检查 URL,比用 google.com 更贴近真实业务,切换判断更准。
完整排障流程:从 403 到恢复的六步
- 确认 403 来源。用前面那条 curl 命令看响应头和响应体,区分 Cloudflare 边缘、Anthropic 应用风控、账号封禁。
- 查出口 ASN。ipinfo.io 看 org 字段,确认是不是 Hosting 类型。
- 查 IP 信誉。abuseipdb 和 spamhaus 过一遍,排除已知黑名单 IP。
- 切住宅原生 IP。在 sing-box 或 Clash 里把 anthropic.com、claude.ai、statsig.anthropic.com 强制走住宅节点,开启 TUN 模式。
- 降并发。设置 CLAUDE_CODE_MAX_SUBAGENTS=3,限制 undici 连接池,关掉非必要 telemetry。
- 观察 24 小时。用
curl -w "%{http_code} %{time_total}\n" -o /dev/null -s https://api.anthropic.com/v1/messages定时打点,看 403 是否复现。
这套流程跑下来,绝大多数终端 403 都能定位到具体环节。真正账号被封的情况占比很低,大部分是出口 IP 类型和并发形态触发了应用层风控。
常见误区
换 IP 就能解决所有 403。如果 TLS 指纹(JA3/JA4)跟常见爬虫库一致,换住宅 IP 也会被拦。Claude Code 用的是 Node.js undici,指纹本身是正常的,但如果中间代理做了 TLS 中间人,指纹会被改写,反而更容易被识别。
用公共机场的“原生 IP”节点就行。公共机场的住宅节点通常是多人共享,同一个 IP 上可能同时跑着十几个 Claude Code 实例,风控看到的是这个 IP 的高频异常流量,你跟着遭殃。独享住宅 IP 才是稳定方案。
把并发调到 1 就安全。并发降到 1 确实能减少请求数,但 Subagent 的串行执行会让任务耗时翻几倍,而且单 IP 长时间持续请求同样会被风控盯上。合理的做法是控制在 3 到 5 之间,配合干净的住宅出口。
验证清单
- curl 确认 403 来源层
- ipinfo.io 确认 ASN 类型为 ISP
- abuseipdb 分数低于 25
- TUN 模式已接管终端流量
- anthropic.com、claude.ai、statsig.anthropic.com 三条域名规则命中住宅节点
- CLAUDE_CODE_MAX_SUBAGENTS 设为 3
- undici 连接池上限 8
- 双 ISP urltest 组以 api.anthropic.com 为健康检查 URL
- 24 小时打点无 403 复现