Claude Code 被封之后,我把出口 IP 固定了下来

2026-10-20 · Claude Code · 网络代理 · EN

前阵子我的 Claude 账号被封,Claude Code 也跟着用不了。官方不会告诉你具体触发了哪条规则,申诉也往往得不到具体解释。重新注册后,我开始认真处理网络出口,目前稳定用了一段时间。

先说结论:固定一个干净的住宅 IP,比频繁换节点重要得多。

封号通常不是单一原因

常见诱因包括:

  • IP 在多个国家或地区之间跳变
  • 使用机房 IP、免费代理或多人共享的出口
  • 支付方式与账号地区不一致
  • 短时间高频请求,或多设备、多人共用账号

官方不会逐条解释,所以能做的是把可控项尽量固定下来。

我现在的组合

  1. 固定住宅 IP:webshare.io 的静态代理,一个月 1.5 美元左右,一个人用 Claude Code 足够。关键是选固定端点,不要用轮换 IP。
  2. 支付:在 Android 上通过 Google Play 订阅 Claude Pro。相比虚拟卡,应用内订阅的支付链路更稳定,也更容易和账号地区保持一致。
  3. 两跳代理:Clash Verge 里先走机场,再用 webshare 的 HTTP 代理做落地;同时开启 TUN。

为什么要两跳

直接连 webshare 的问题是:从国内到它的线路不一定稳,而且你的家庭 IP 会直接暴露给代理商。加上机场这一跳后:

本机 → 机场(自动选最快节点)→ webshare(固定住宅 IP)→ Claude

机场负责“走得出去”,webshare 负责“落地 IP 干净且固定”。目标网站看到的是 webshare 的 IP,而不是机场或你家宽带的 IP。

注意:机场仍然能看到你的目标域名和流量元数据,所以机场本身也要选可信的。这条链解决的是出口 IP 信誉问题,不是匿名。

Clash Verge 配置

  1. 在 webshare 后台创建静态代理,记下 host、port、username、password。

    webshare 的 Static Residential → Proxy List:固定端点、端口、认证方式和在线状态

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

    Clash Verge 的“订阅”页底部:全局扩展脚本

  3. 修改脚本顶部的 webshare 端点,并在节点里取消注释、填入用户名和密码。

  4. 确认你的机场订阅里存在“自动选择”“延迟选优”之类的组。

  5. 开启 TUN 模式。Claude Code 是命令行程序,不读系统代理设置,不开 TUN 很可能根本没走代理。

  6. 验证:curl https://ipinfo.io/json,看到的应该是 webshare 的 IP。

脚本在做什么

这个全局覆写脚本核心是六步:

  1. 在机场订阅里找到自动测速组,作为第二跳的入口。
  2. 用 webshare 端点生成 HTTP 代理节点,并给每个节点设置 dialer-proxy 指向机场自动组——这就是“机场 → webshare”的链式出口。
  3. 新建一个 🔒 纯净IP 的 select 组,默认选第一个 webshare 节点。
  4. 重写规则:原来的 DIRECT / REJECT / PASS 保留;其他代理规则的目标统一改成出口组;去掉原来的 MATCH / FINAL。
  5. 追加两条兜底:GEOIP,CN,DIRECT,no-resolve 让国内 IP 直连,MATCH,🔒 纯净IP 让其余流量走链式出口。
  6. 做重名保护和调试日志;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;
}
已复制短链