最近在研究 Claude Code 的 telemetry 机制,发现一个有意思的开源项目 cc-gateway,核心思路是固定假指纹——让多台机器对 Anthropic API 呈现同一个设备身份。整理一下分享给大家。
背景:Claude Code 采集了什么
根据 这份逆向分析报告,Claude Code 会持续上报:
- 640+ 种 telemetry 事件,每 5 秒回传一次
- 40+ 个环境维度:OS、CPU 架构、物理内存、Node.js 版本、Shell 类型、已安装的包管理器、CI 标志……
- 每个设备有一个永久唯一的 device_id,会嵌入所有 API 请求中
- System prompt 的
<env>区块也会暴露 Platform、Shell、OS Version、工作目录
换句话说,每台机器的身份都是可区分的,而且这些信息会与 telemetry 交叉比对。
核心思路:固定假指纹
cc-gateway 做的事情很直观:在 Claude Code 与 Anthropic API 之间架一个反向代理,在 proxy 层统一改写所有指纹字段,让所有机器对外呈现同一个「标准身份」。
Client A ─┐
Client B ─┤── cc-gateway ──→ Anthropic API
Client C ─┘ ↑
在这里改写身份
改写范围涵盖三层:
| 层级 | 字段 | 动作 |
|---|---|---|
| Identity | device_id、email、session metadata |
→ 替换为固定的 canonical 值 |
| Environment | env 对象(40+ 字段) |
→ 整个对象替换,不是 patch |
| Process | 物理内存、heap size、RSS | → 固定值或随机化到合理区间 |
| Header | User-Agent、x-anthropic-billing-header |
→ canonical 版本号 |
| System Prompt | <env> 区块中的 Platform、Shell、OS |
→ 与 telemetry 一致的 canonical 值 |
特别值得注意的是 System Prompt 层的改写:如果 telemetry 说你在 Linux,但 system prompt <env> 里写的是 macOS,这种矛盾本身就是可识别特征。cc-gateway 把两者一起改掉,消除交叉比对的可能。
三层防御架构
光靠 proxy 还不够,因为 Claude Code 有些连接是 hardcode 的,不走 ANTHROPIC_BASE_URL。cc-gateway 采用三层叠加:
Layer 1 — 环境变量(让 CC 自愿走 gateway)
export ANTHROPIC_BASE_URL="https://gateway.your-domain.com:8443"
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
export CLAUDE_CODE_OAUTH_TOKEN="gateway-managed"
export ANTHROPIC_CUSTOM_HEADERS="Proxy-Authorization: Bearer YOUR_TOKEN"
Layer 2 — Clash 规则(网络层拦截直连)
rules:
- DOMAIN,gateway.your-domain.com,DIRECT
- DOMAIN-SUFFIX,anthropic.com,REJECT
- DOMAIN-SUFFIX,claude.com,REJECT
- DOMAIN-SUFFIX,datadoghq.com,REJECT # Datadog telemetry
Layer 3 — Gateway 改写(真正的指纹规范化)
前两层负责「让流量进来」,第三层负责「改写内容再送出去」。
OAuth 集中管理
传统多机共用的痛点是 OAuth token 管理。cc-gateway 的解法:
- 只在一台机器上跑
extract-token.sh(从 macOS Keychain 取出 refresh token) - Gateway 统一管理 token 自动刷新
- 客户端机器永远不需要打开浏览器登录,也不会直连
platform.claude.com
部署方式
git clone https://github.com/motiful/cc-gateway.git
cd cc-gateway && npm install
# 生成固定的 canonical 身份
npm run generate-identity
# 生成给客户端用的 token
npm run generate-token my-machine
cp config.example.yaml config.yaml
# 填入 device_id、client token、OAuth refresh_token
Docker 也有支持:
docker-compose up -d
健康检查与改写前后 diff 验证:
curl http://localhost:8443/_health
curl -H "Authorization: Bearer <token>" http://localhost:8443/_verify
已知限制
- MCP servers:
mcp-proxy.anthropic.com是 hardcode 的,不走ANTHROPIC_BASE_URL,需要用 Clash 额外封锁 - CC 版本更新:新版可能新增 telemetry 字段,需要关注 Clash REJECT log 有无新的直连尝试
- Alpha 阶段:项目还在早期,建议先用非主力账号测试
小结
这个方案的核心洞察是:指纹不可能靠「不发送」来消除,但可以靠「统一伪造」来规范化。把 40+ 个环境维度都替换成同一套固定值,多台机器对 API 的呈现就变成一台机器。
有在跑多机 Claude Code 的朋友可以研究看看,项目 MIT 授权:https://github.com/motiful/cc-gateway
包含ai润色
和指纹没关系,我几十个容器同时开Claude code,全是不一样的指纹,照样没事