这两天,Claude 圈子又不太平,又在大面积封号了。Reddit、X、中文技术社区里,都有人在晒 Claude 被暂停、Claude Code 不能用、账号收到风控邮件的截图。Anthropic 公开谈蒸馏攻击,外媒报道 Anthropic 指控 Alibaba 通过大量账号抽取 Claude 能力,还有 Reddit 上有人把 Claude Code 里的可疑代码扒了出来。

我本来以为又是老三样:IP 不干净、支付路径异常、新号用太猛。后来顺着 Reddit 那篇帖子,把 Claude Code 的几个 npm 包自己拉下来对比了一遍,才发现这事不是一句「换个干净 IP」就能讲完。

Claude Code 客户端里确实有一套很隐蔽的环境标记逻辑。它会读你的本地时区、ANTHROPIC_BASE_URL,再对照一份内置域名和关键词名单,最后悄悄改掉 system prompt 里的一句话。

表面上只是日期:

Today's date is 2026-06-30.

实际上,这句话可以变成好几个版本。肉眼看着差不多,服务端却能轻松区分。

先说最近这波封号

最近几天,Reddit、X、Linux.do、V2EX 一类社区里,确实有不少 Claude 和 Claude Code 用户在讨论账号暂停、风控邮件、封号截图。

Anthropic 自己也确实在讲蒸馏攻击。他们那篇《Detecting and preventing distillation attacks》里说得很明白,会用 IP correlation、request metadata、infrastructure indicators、behavioral fingerprinting 这些信号去识别大规模蒸馏。

外媒这边,Reuters、Tom’s Hardware 等都报道了 Anthropic 指控 Alibaba 相关活动的事情。报道里提到的数字很大:约 25,000 个虚假账号,28.8M 次 Claude 交互。

再加上 Claude Code 客户端里能看到的那套环境水印逻辑,这几件事合在一起看,就不是普通的「我听说又封号了」。

我的判断是:这轮风控不一定只针对某一个群体,但 Claude 对账号、网络、客户端环境、调用行为的画像肯定变细了。

深入分析

按照 Reddit 帖子,我拉了Claude Code的这些版本:

@anthropic-ai/claude-code@2.1.90
@anthropic-ai/claude-code@2.1.91
@anthropic-ai/claude-code@2.1.126
@anthropic-ai/claude-code@2.1.196

对比结果很直接。

2.1.90 里,我没有搜到这套 Asia/ShanghaiANTHROPIC_BASE_URL、Unicode 撇号标记逻辑。

2.1.91 里,相关逻辑出现了。

我本机装过的 2.1.126,主逻辑已经被打进一个 200MB 级别的二进制文件里,但用字符串搜索仍然能看到同类代码。

到了 2.1.196,npm 主包变成了很小的 wrapper。真正的程序在平台相关的 native 包里,比如 macOS arm64 对应:

@anthropic-ai/claude-code-darwin-arm64@2.1.196

这个 native 包解压后大约 225MB。我把它也拉下来搜了一遍,确认同类逻辑仍然存在。

所以时间线大概是这样:

2.1.90:没看到
2.1.91:开始出现
2.1.126:仍存在
2.1.196:仍存在

这也解释了为什么 Reddit 那篇帖子的说法值得认真看。它不是凭空猜的,至少版本点对得上。

2.1.91 里那段代码

2.1.91 的包里还有明文 cli.js,所以比较好查。

Asia/Shanghai,能看到一段压缩后的代码。整理成人能看的样子,大概是这样:

function fi_() {
  let q = process.env.ANTHROPIC_BASE_URL;
  if (!q) return null;
  try {
    return new URL(q).hostname.toLowerCase();
  } catch {
    return null;
  }
}

function Zi_() {
  if (OM()) return null;
  let q = fi_();
  let K = Hu6();
  let _ = K === "Asia/Shanghai" || K === "Asia/Urumqi";

  if (!q) return { known: false, labKw: false, cnTZ: _, host: null };

  return {
    known: Wi_().some((z) => q === z || q.endsWith("." + z)),
    labKw: Di_().some((z) => q.includes(z)),
    cnTZ: _,
    host: q,
  };
}

function Gi_(q, K) {
  if (!q && !K) return "'";
  if (q && !K) return "’";
  if (!q && K) return "ʼ";
  return "ʹ";
}

function fM4(q) {
  let K = Zi_();
  let _ = Gi_(K?.known ?? false, K?.labKw ?? false);
  let z = K?.cnTZ ? q.replace(/-/g, "/") : q;
  return `Today${_}s date is ${z}.`;
}

这段代码做的事不复杂,但很巧。

它先读 ANTHROPIC_BASE_URL,拿到 hostname。然后读本机时区,看是不是 Asia/ShanghaiAsia/Urumqi。接着查两份名单:一份是域名名单,一份是关键词名单。最后,根据命中结果,改变 Today's date is ... 这句话里的撇号和日期格式。

重点不在日期。

重点在于:客户端环境被编码进了 system prompt。

日期水印长什么样

普通情况下,system prompt 里可能是:

Today's date is 2026-06-30.

命中不同条件后,可能变成:

Today’s date is 2026-06-30.
Todayʼs date is 2026-06-30.
Todayʹs date is 2026-06-30.
Today’s date is 2026/06/30.

这几个撇号不是一个字符:

'   普通 apostrophe
’   U+2019
ʼ   U+02BC
ʹ   U+02B9

人眼很难注意到,更不容易区分开,但是程序不会看错。

如果本机时区是 Asia/ShanghaiAsia/Urumqi,日期分隔符还会从 - 换成 /。比如 2026-06-30 变成 2026/06/30

这就像在正常句子里塞了一个小标签。你看着它还是一句日期提示,服务端看到的却是几种不同环境的编码结果。

那份内置名单

代码里还有一个简单的解码函数:

function DM4(q) {
  let K = Buffer.from(q, "base64");
  let _ = "";
  for (let z of K) _ += String.fromCharCode(z ^ Mi_);
  return _.split(",");
}

var Mi_ = 91;

就是把 base64 解出来,再每个字节和 91 做异或,最后按逗号切开。

解出来以后,有 147 个域名或后缀,还有 11 个关键词。

域名名单前面一段长这样:

cn
sankuai.com
netease.com
163.com
baidu-int.com
baidu.com
alibaba-inc.com
alipay.com
antgroup-inc.cn
kuaishou.com
bytedance.net
xiaohongshu.com
ctripcorp.com
jd.com
jdcloud.com
bilibili.co
iflytek.com
stepfun-inc.com
aliyuncs.com
cn-shanghai.fcapp.run
cn-beijing.fcapp.run
xaminim.com
moonshot.ai
anyrouter.top

后面还有不少第三方 API、聚合转发、代理服务相关域名。

关键词名单是:

deepseek
moonshot
minimax
xaminim
zhipu
bigmodel
baichuan
stepfun
01ai
dashscope
volces

看到这里,味道就出来了。

它不是单纯判断「你有没有代理」。它还在判断你有没有使用某些第三方 API 转发、国产模型聚合、国内云服务、国内大厂相关域名。

尤其是 alibaba-inc.comaliyuncs.comdashscope 这几个,放在 Anthropic 指控 Alibaba 蒸馏 Claude 的背景里,很难让人不联想。

2.1.196 里还在

新版的包结构变了。

@anthropic-ai/claude-code@2.1.196 主包里有个 install.cjs,安装时会按平台复制 native binary。macOS arm64 对应的包是:

@anthropic-ai/claude-code-darwin-arm64@2.1.196

这个包里的主文件是 225MB 左右的 claude 二进制。

我在这个二进制里继续搜 ANTHROPIC_BASE_URLAsia/ShanghaiAsia/Urumqi,还能看到同类逻辑,只是函数名变成了另一组:

function Qup() {
  let e = process.env.ANTHROPIC_BASE_URL;
  if (!e) return null;
  try {
    return new URL(e).hostname.toLowerCase();
  } catch {
    return null;
  }
}

function Zup() {
  if (Crt()) return null;
  let e = Qup();
  let t = e0t();
  let n = t === "Asia/Shanghai" || t === "Asia/Urumqi";

  if (!e) return { known: false, labKw: false, cnTZ: n, host: null };

  return {
    known: Jup().some((r) => e === r || e.endsWith("." + r)),
    labKw: Xup().some((r) => e.includes(r)),
    cnTZ: n,
    host: e,
  };
}

function edp(e, t) {
  if (!e && !t) return "'";
  if (e && !t) return "\u2019";
  if (!e && t) return "\u02BC";
  return "\u02B9";
}

function Vla(e) {
  let t = Zup();
  let n = edp(t?.known ?? false, t?.labKw ?? false);
  let r = t?.cnTZ ? e.replaceAll("-", "/") : e;
  return `Today${n}s date is ${r}.`;
}

那两份名单也还在:147 个域名或后缀,11 个关键词。alibaba-inc.comaliyuncs.comdashscopedeepseekmoonshotvolces 这些都能看到。

所以这套逻辑不是 4 月某个版本里昙花一现。至少到我验证的 2.1.196,它还在。

这算不算间谍软件?

Reddit 标题里用了 spyware 这个词。这个词很抓眼球,也很容易传播。

但我觉得技术上要说准一点。

它不像传统意义上的间谍软件,不是偷偷扫描你的硬盘,也不是把你的项目文件打包上传。至少我这次看的是这条线,没有看到那种行为。

但它也绝不是普通的日期格式小优化。

它做的事是:把客户端环境特征编码进 system prompt。

也就是说,服务端不需要再发一个单独的检测请求。你正常用 Claude Code,请求里本来就要带 system prompt。只要这句话里的撇号和日期格式发生变化,服务端就能反推出一些东西:

是不是中国时区
有没有配置 ANTHROPIC_BASE_URL
Base URL 是否命中某些第三方转发域名
Base URL 是否包含 deepseek、dashscope、volces 这类关键词

这比明着传一个 telemetry 字段更隐蔽,因为它混在正常 prompt 里。

所以我更愿意叫它「system prompt 水印」或者「客户端环境水印」。这个说法比 spyware 冷一点,但更准确。

邮件追踪那件事

这两天还有一种说法:Claude 的封号邮件里有追踪像素,用户打开邮件后,Anthropic 通过远程图片拿到 IP,再进一步判断账号风险。

这个说法不能完全排除。

邮件追踪像素本来就能拿到一些信息,比如打开时间、打开邮件时的 IP、邮件客户端、是否加载远程图片。很多营销邮件都这么干,不是什么新技术。

但我不建议把它归类为这轮封号的主因。

原因很现实。

很多邮箱会代理图片请求,Gmail 和 Apple Mail 都会影响追踪结果。很多人也默认不加载远程图片。更重要的是,如果封号邮件是在账号被封之后发出的,那它最多是后续校验信号,不可能是触发封号的前置原因。

它可能有用。比如账号长期声称自己在美国使用,但封号邮件打开时暴露了一个国内 IP,这种矛盾可能会被记一笔。

但和 Claude Code 里这套已经能验证的环境水印相比,邮件像素这条线目前证据不够硬。

我会把它放在「可能的辅助信号」里,而不是当成主线。

我对封号原理的判断

Claude 大概率不是靠一条规则封号。

不是「中国时区就封」,也不是「用了代理就封」,更不是「打开封号邮件就封」。这种大服务的风控通常不会这么粗。

更可能是多项信号叠加。

账号本身会被看:邮箱、手机号、支付路径、账号年龄、新号是不是一上来就高强度使用。

网络也会被看:出口 IP 属于哪个国家,ASN 是什么,像住宅 IP 还是机房 IP,是不是很多人共享,是不是频繁换国家,DNS 有没有泄露,系统时区和出口地区是不是对得上。

客户端这边,现在能看到的信号就更多了:Claude Code 版本、system prompt 水印、ANTHROPIC_BASE_URL、第三方转发、国内服务域名命中情况。

行为也跑不掉:短时间高频请求,大量相似 prompt,快速消耗额度,自动化批处理,或者明显像在批量生成训练数据。

最后还有图谱。多个账号共用一个出口、行为节奏接近、都走同一套转发基础设施,这种东西风控系统很容易串起来。

Anthropic 自己讲蒸馏攻击时说过 IP correlation、request metadata、infrastructure indicators、behavioral fingerprinting。翻译成人话就是:他们看的不是一个点,而是一张网。

普通用户最麻烦的地方就在这里。

你可能只是写代码,并没有蒸馏模型。但如果你的环境长得像批量账号的一部分,比如共享机场节点、国内时区、DNS 泄露、第三方 Base URL、新号高强度使用,那风控系统未必有耐心区分你到底是不是无辜。

它只会觉得你像高风险用户。

我的建议

自建 VPS 不能保证 Claude 永远不封号,这个话不能说满。

但它至少能解决一个很实际的问题:不要和几百上千个人挤同一个高危出口。

很多机场节点的问题不是慢,而是脏。一个出口 IP 后面可能有正常用户,也可能有批量注册、爬虫、自动化工具、API 转发服务,还有各种乱七八糟的流量。你和这些人共用一个出口,风控系统很难把你摘干净。

自建 VPS 的价值在于可控。

出口相对独立,线路自己选,IP 不乱跳,DNS 规则自己管,Claude 相关站点可以固定走同一条链路。你可以把系统时区、浏览器环境、DNS、代理规则都调到一致,而不是今天一个节点,明天另一个国家,后天又从一个被滥用的共享出口登录。

如果再配合静态住宅 IP 或链式代理,整体画像会更稳定。它不是绕过风控,而是减少误伤。

说白了,风控最怕你像机器、像批量账号、像共享代理池。自建 VPS 做不到让你百分百安全,但能让你的网络环境更像一个稳定的真实用户。

如果你想自己搭,可以先看这两篇:

现在该注意什么

如果你已经在用 Claude Code,我建议先检查几件事。

不要乱配 ANTHROPIC_BASE_URL。不明来源的第三方 Claude API 转发,能不用就不用。频繁切换国家和出口 IP,也尽量避免。DNS 泄露、系统时区和出口地区对不上,这些以前可能只是小问题,现在都可能变成画像的一部分。

新号尤其别上来就猛干。刚注册没多久,就连续高强度跑 Claude Code、快速打满额度、配合自动化脚本批量请求,这种行为太像风控系统要抓的东西。

如果你长期订阅 Claude,尤其是拿 Claude Code 做 AI Coding,最好准备一套稳定环境:固定出口、固定 DNS、固定时区、固定设备环境、固定使用节奏。

很多人以前只关心「能不能打开」「速度快不快」。现在看,还得多问几句:

这个出口干不干净?
是不是很多人共用?
会不会频繁跳 IP?
DNS 和时区是否一致?
能不能长期稳定?

Claude 这轮封号真正提醒我的,不是「别用 Claude」,而是海外 AI 服务的风控已经细到客户端环境这一层了。

以前能打开网页就行。

现在不一样。

现在它看的是完整环境画像。

参考