logo NodeSeekbeta

分享一个思路:用固定假指纹让多台机器共用同一个 Claude Code 身份

最近在研究 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_idemail、session metadata → 替换为固定的 canonical 值
Environment env 对象(40+ 字段) 整个对象替换,不是 patch
Process 物理内存、heap size、RSS → 固定值或随机化到合理区间
Header User-Agentx-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 serversmcp-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,全是不一样的指纹,照样没事

  • xhj001 xhj003

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有59806位seeker

🎉欢迎新用户🎉