loading image

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

Posted by Enovace on March 31, 2026

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

Banner

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 更容易中招

把上面五个叛徒放在一起,你就明白了:

Image

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,希望这篇文章能帮你少踩坑。