Claude Code 封号真相:挖了源码,我发现了 5 个"叛徒"

TMD又封了,每天都能刷到这样的消息。
用 CC有一阵子了,庆幸自己还没被封,但心里总有点虚。
网上关于封号的讨论很多,但没人说得清真正原因。
好巧不巧,今天cc源码暴露了。我立刻 clone 下来,想搞清楚——CLI 到底是怎么触发风控的?说实话,挖完之后我释然了。没找到什么「作恶证据」,但我发现一件事:光靠 VPN 藏 IP,根本不够。Claude Code 有 5 个设计,会在你毫不知情的情况下「出卖」你。
我找到了 5 个「叛徒」。
一、device_id:你换 IP,它不换
第一个叛徒,藏在每次 API 请求里。
打开 src/services/api/claude.ts,519-527 行,有这么一段:
return {
user_id: jsonStringify({
device_id: getOrCreateUserID(),
account_uuid: getOauthAccountInfo()?.accountUuid ?? '',
session_id: getSessionId(),
}),
}
这个 user_id 字段,嵌入在每一条/api/messages 请求体中。
关键点:device_id 是本地持久化的 UUID。只要你不清除本地文件,它永远不变。
这意味着什么?
你换了 VPN 节点,IP 变了。但 device_id 还是同一个。
Anthropic 服务端看到的画面是这样的:
- 这个 device_id 之前从日本 IP 访问
- 现在从美国 IP 访问
- 半小时后又从新加坡 IP 访问
同一个设备,短时间内跨越三个国家。这不是正常用户的行为模式。
更狠的是,这个字段关不掉。它不是遥测,是 API 协议的一部分。你关闭所有隐私设置,它照样发。
二、归因水印:写在 prompt 里的"钉子"
第二个叛徒,更隐蔽。
它不是藏在 HTTP 请求里,而是藏在每次对话的 system prompt 里。
src/constants/system.ts,73-95 行:
const header = `x-anthropic-billing-header: cc_version=${version};
cc_entrypoint=${entrypoint}; cch=39d86; cc_workload=${workload}`
这个 x-anthropic-billing-header 会被注入到 system prompt 里,包含:
- CLI 版本号
- 入口类型(cli/desktop/vscode)
- cch 字段:客户端证明,发送时由底层覆写
这是写在 prompt 里的,不是 HTTP header。你没法通过代理或中间人修改它。每条消息都带着这个水印,告诉服务端:这是 CLI 用户。
三、x-app: cli:主动标记自己为"特殊群体"
第三个叛徒,在请求头里主动"自首"。
src/services/api/client.ts,105-116 行:
defaultHeaders = {
'x-app': 'cli',
'User-Agent': 'claude-cli/1.0.0 (regular, cli)',
'X-Claude-Code-Session-Id': getSessionId(),
}
x-app: cli 直接告诉服务端:我是 CLI 用户。
Web 用户呢?User-Agent 是浏览器标识,混在数十亿浏览器请求里,根本分不出来。
CLI 用户呢?直接给自己贴了个标签:「我是特殊群体」。
服务端可以对这个群体单独应用更严格的风控规则。
四、遥测:5 秒一次的"电话汇报"
第四个叛徒,是最话痨的那个。
遥测系统,每 5 秒上报一次。
src/services/analytics/firstPartyEventLoggingExporter.ts 写得很清楚:
Export cycles triggered when: Time interval elapses (default: 5 seconds)
上报什么?看看 metadata.ts:
- 操作系统、架构、Node 版本
- 终端类型、包管理器
- 是否 CI 环境、是否远程
- CPU/内存使用率
- accountUuid、organizationUuid、emailAddress
- sessionId、subscriptionType
一个 30 分钟的编码 session,会产生 360 次遥测请求。每次都带着你的 IP。
好消息:这个可以关。设置 DISABLE_TELEMETRY=1 就行。
坏消息:前面三个叛徒关不掉。
五、重试机制:不稳定 VPN 的灾难
第五个叛徒,是重试机制。
src/services/api/withRetry.ts:
默认最多重试 10 次
指数退避:500ms → 1s → 2s → 4s → ... → 最大 32s
遇到 429 会重试,遇到 401 会刷新 token 后重试
问题在哪?
如果你的 VPN 不稳定,偶发连接错误。
一次失败的请求,可能触发 10 次重试。
从服务端看,这是短时间内从不同 IP 发起的大量请求。
典型的异常行为模式。
六、CLI vs Web:为什么 CLI 更容易中招
把上面五个叛徒放在一起,你就明白了:

Web 版的用户藏在浏览器流量里,CLI 用户直接把自己标记出来。
不是 Anthropic 针对 CLI,是 CLI 的设计让风控信号更丰富。## 七、怎么办:4 个自救方案
知道了叛徒在哪,就知道怎么对付它们。
以下环境变量都需要添加到你的 shell 配置文件里:
- macOS 默认用 zsh → ~/.zshrc
- Linux 用 bash → ~/.bashrc
改完后记得 source ~/.zshrc 或者重启终端。
方案 A:关遥测(减少 80% 暴露)```text 在 ~/.zshrc 中添加: export DISABLE_TELEMETRY=1 更激进的话: export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
<strong>方案 B:用 API Key 代替 OAuth 登录</strong>用 API Key 时,不会调用 /api/oauth/profile,减少一个暴露 IP 的端点。account_uuid 字段也会变成空字符串。
```text
在 ~/.zshrc 中添加:
export ANTHROPIC_API_KEY=sk-ant-xxx
方案 C:用第三方云提供商(最安全)用 Bedrock/Vertex/Foundry 时,遥测自动关闭,请求发往 AWS/GCP/Azure 而非 api.anthropic.com。
Anthropic 看不到你的 IP。
在 ~/.zshrc 中添加:
# AWS Bedrock
export CLAUDE_CODE_USE_BEDROCK=1
# Google Vertex AI
export CLAUDE_CODE_USE_VERTEX=1
方案 D:稳定 IP(住宅更佳)+ 减少重试```text 在 ~/.zshrc 中添加: export CLAUDE_CODE_MAX_RETRIES=2
确保 VPN 出口 IP 稳定,避免同一 session 内 IP 跳跃。
<strong>优先级:Bedrock/Vertex > 关遥测 + API Key > 稳定 IP(住宅更佳)+ 减少重试</strong>说实话,挖完源码我反而放心了。
没找到什么「黑幕」,**因为根本没有黑幕**。
Anthropic 没有在客户端写地域封锁代码。封号是服务端基于行为模式的风控,是算法,不是针对。
但 Claude Code 的设计,确实让它比 Web 版更容易触发风控。
知道了原理,就知道怎么规避。
如果你也在用 Claude Code,希望这篇文章能帮你少踩坑。

