Claude Code 被封之后,我把出口 IP 固定了下来
前阵子我的 Claude 账号被封,Claude Code 也跟着用不了。官方不会告诉你具体触发了哪条规则,申诉也往往得不到具体解释。重新注册后,我开始认真处理网络出口,目前稳定用了一段时间。
先说结论:固定一个干净的住宅 IP,比频繁换节点重要得多。
封号通常不是单一原因
常见诱因包括:
- IP 在多个国家或地区之间跳变
- 使用机房 IP、免费代理或多人共享的出口
- 支付方式与账号地区不一致
- 短时间高频请求,或多设备、多人共用账号
官方不会逐条解释,所以能做的是把可控项尽量固定下来。
我现在的组合
- 固定住宅 IP:webshare.io 的静态代理,一个月 1.5 美元左右,一个人用 Claude Code 足够。关键是选固定端点,不要用轮换 IP。
- 支付:在 Android 上通过 Google Play 订阅 Claude Pro。相比虚拟卡,应用内订阅的支付链路更稳定,也更容易和账号地区保持一致。
- 两跳代理:Clash Verge 里先走机场,再用 webshare 的 HTTP 代理做落地;同时开启 TUN。
为什么要两跳
直接连 webshare 的问题是:从国内到它的线路不一定稳,而且你的家庭 IP 会直接暴露给代理商。加上机场这一跳后:
本机 → 机场(自动选最快节点)→ webshare(固定住宅 IP)→ Claude
机场负责“走得出去”,webshare 负责“落地 IP 干净且固定”。目标网站看到的是 webshare 的 IP,而不是机场或你家宽带的 IP。
注意:机场仍然能看到你的目标域名和流量元数据,所以机场本身也要选可信的。这条链解决的是出口 IP 信誉问题,不是匿名。
Clash Verge 配置
-
在 webshare 后台创建静态代理,记下 host、port、username、password。

-
Clash Verge Rev → 订阅 → 全局扩展脚本,点进去新建或编辑,粘贴下面的脚本。这个脚本是全局生效的。

-
修改脚本顶部的 webshare 端点,并在节点里取消注释、填入用户名和密码。
-
确认你的机场订阅里存在“自动选择”“延迟选优”之类的组。
-
开启 TUN 模式。Claude Code 是命令行程序,不读系统代理设置,不开 TUN 很可能根本没走代理。
-
验证:
curl https://ipinfo.io/json,看到的应该是 webshare 的 IP。
脚本在做什么
这个全局覆写脚本核心是六步:
- 在机场订阅里找到自动测速组,作为第二跳的入口。
- 用 webshare 端点生成 HTTP 代理节点,并给每个节点设置
dialer-proxy指向机场自动组——这就是“机场 → webshare”的链式出口。 - 新建一个
🔒 纯净IP的 select 组,默认选第一个 webshare 节点。 - 重写规则:原来的 DIRECT / REJECT / PASS 保留;其他代理规则的目标统一改成出口组;去掉原来的 MATCH / FINAL。
- 追加两条兜底:
GEOIP,CN,DIRECT,no-resolve让国内 IP 直连,MATCH,🔒 纯净IP让其余流量走链式出口。 - 做重名保护和调试日志;
HONOR_PROFILE用于多订阅场景,只在指定订阅上注入。
注意事项
- 这套方案只能降低概率,不能保证不封。账号行为、支付方式和使用模式同样重要。
- 一个账号固定一个出口,不要今天美国、明天日本。
- webshare 的账号密码在脚本里是明文,别把带凭证的配置发给别人;泄露后立即改密码。
- 不要在机场和 webshare 之间频繁切换节点,出口组默认只选第一个。
- 本文只是个人经验,不构成绕过服务条款的建议,封号规则以官方为准。
完整脚本(凭证已隐去)
function main(config, profileName) {
/* ======================= 用户配置区 ======================= */
// 机场里“自动测速/延迟选优”的组名,按优先级列多个,取第一个命中的
var AUTO_CANDIDATES = ["自动选择", "延迟选优", "url-test", "Proxy", "PROXY", "节点选择"];
// webshare 端点 [IP, 端口]
var WS_ENDPOINTS = [
["YOUR_ENDPOINT_IP", 6000],
["YOUR_ENDPOINT_IP", 6001]
];
var EXIT_GROUP = "🔒 纯净IP"; // 出口组名(只选 1 个,默认第 1 个)
var WS_NODE_PREFIX = "🇺🇸 纯净IP-"; // 出口节点名前缀
var HONOR_PROFILE = false; // true=仅当 profileName 匹配才注入
/* ====================== 用户配置区结束 ====================== */
config = config || {};
var groups = config["proxy-groups"] = config["proxy-groups"] || [];
var proxies = config.proxies = config.proxies || [];
var rules = config.rules = config.rules || [];
// 0. 可选:按订阅名过滤
if (HONOR_PROFILE) {
if (!profileName || String(profileName).indexOf("YOUR_PROFILE_KEYWORD") === -1) {
return config;
}
}
// 1. 找机场“自动测速”组作为第二跳
var autoGroupName = null;
for (var a = 0; a < AUTO_CANDIDATES.length; a++) {
var cand = AUTO_CANDIDATES[a];
for (var g = 0; g < groups.length; g++) {
if (groups[g].name === cand) { autoGroupName = cand; break; }
}
if (autoGroupName) break;
}
// 2. 重名保护
var taken = {};
proxies.forEach(function (p) { taken[p && p.name] = true; });
groups.forEach(function (gr) { taken[gr && gr.name] = true; });
function uniq(base) {
var n = base, i = 1;
while (taken[n]) { n = base + "·" + i; i++; }
taken[n] = true;
return n;
}
// 3. 生成 webshare 出口节点(经机场最快节点拨号)
var wsNames = [];
WS_ENDPOINTS.forEach(function (ep, idx) {
var rawPort = parseInt(String(ep[1]).replace(/[^0-9]/g, ""), 10);
var node = {
name: uniq(WS_NODE_PREFIX + (idx + 1)),
type: "http",
server: ep[0],
port: rawPort,
// webshare 代理需要认证:取消注释并填入自己的凭证
// username: "YOUR_USERNAME",
// password: "YOUR_PASSWORD",
udp: false
};
if (autoGroupName) { node["dialer-proxy"] = autoGroupName; }
wsNames.push(node.name);
proxies.push(node);
});
// 4. 出口组:select,默认选第 1 个
var exitGroupName = uniq(EXIT_GROUP);
groups.push({
name: exitGroupName,
type: "select",
proxies: wsNames
});
// 5. 规则重写:保留直连/拦截,其余全部改走出口组
var DIRECT_TARGETS = { "DIRECT": 1, "REJECT": 1, "REJECT-DROP": 1, "PASS": 1 };
var kept = [];
for (var r = 0; r < rules.length; r++) {
var t = String(rules[r]).trim();
if (!t) continue;
var parts = t.split(",");
var type = String(parts[0] || "").toUpperCase();
if (type === "MATCH" || type === "FINAL") continue;
var last = String(parts[parts.length - 1] || "").trim();
if (DIRECT_TARGETS[last]) { kept.push(t); continue; }
parts[parts.length - 1] = exitGroupName;
kept.push(parts.join(","));
}
kept.push("GEOIP,CN,DIRECT,no-resolve");
kept.push("MATCH," + exitGroupName);
config.rules = kept;
// 6. 调试输出
try {
if (!autoGroupName) {
console.log("[chain] 警告:未找到机场自动测速组,webshare 将直连,可能连不上。候选=" +
AUTO_CANDIDATES.join("/"));
} else {
console.log("[chain] 第二跳=" + autoGroupName + ",出口组=" + exitGroupName +
",节点=" + wsNames.length + " 个");
}
} catch (e) { /* 某些引擎 console 不可用,忽略 */ }
return config;
}