# Intro

最近 OpenAI 虽然送了很多重置,但是它的过度小心和防御性编程严重拖累了我的一些工作。

于是很想用 Claude Code,但我最主要面临的问题有如下这么几个:

  • 环境问题,需要特别配置网络等环境避免封号
  • 分发问题,有多台开发机,那么每一个开发机都要因为上面的环境问题而进行适配,会很麻烦
  • 使用体验问题,使用体验最好能接近当前最好的 Codex Desktop,如果能 cli2wewb 使得我随时用手机 / 笔记本等终端设备用浏览器打开使用就更好了
  • 模型能力问题,因为 Anthropric 和 OpenAI 在训练 Coding 模型的时候会针对自家 CLI 的接口进行调优优化,包括对源代码文件频繁的 View/Edit 等操作和执行 Shell 指令,如果号池机不能使用这些 CLI 原生功能,比如会降低模型的能力

可能你会觉得反代能轻松解决这些问题,但我首先否决反代,一方面是我已经反代了 Codex 很长一段时间,我已经遇到了降智问题,是观察得出的结果。另一方面从技术上讲,实际上开源社区里诸如 sub2api 和 CLIProxyAPI 这些反代工具是 “破绽百出” 的:

  • 首先不用官方 CLI 的首先就会因为官方远端只看得到推理请求看不到遥测数据而被发现了,更别提修改了 system prompt 的使用更是推理的时候就能发现。
  • 就算是使用官方 CLI 接反代,只要存在分发到不同环境,在远端官方看来就是同一个 CLI 发送了 2 种不同的遥测数据,同样能揪出来。
  • 严格限制一个号同时只能反代给一个环境用,也就是槽位分配限制,看上去没有上面两个问题了,但是官方 CLI 依然能上报当前使用 CLI 的方式和鉴权相关信息,必然会和反代系统里那个账号的授权信息不一样。
  • 那在此基础上反代系统逆向和伪装官方授权,将一模一样的授权 token 给到下游 CLI,下游 CLI 还修改本地 DNS 让官方域名指向反代网关使得 BASE_URL 也和官方一模一样?TLS 自签证书链必然会向 CLI 暴露中间人劫持的存在。

实际上,就好比完全逆向微信我们就能随便接 BOT 而不被封号,只要完全逆向官方 CLI,我们还真能在避免上述问题的前提下用反代。实际上这样的做法已经存在了,不过完全逆向以及持续跟进官方更新是成本极高的事情,我所见到的都是利用此道盈利的商业模式,例如 rawchat.cn 和 reclaude.ai 。他们完全逆向了官方 CLI,要求用户使用他们专门改良的二开 CLI,实现伪装所有遥测数据的上报。

我并不希望也不太可能做到这样足以商业化的程度,我希望是一个更轻量更优雅的解决方案。经过我和 AI 的深入交流,最终设计制造出来如下框架:

架构图

其中号池机上的部分已经开源到 Github 上:https://github.com/fuuzen/cc-pool

其余配置部分如下:

# 拓扑与网络规划参数

网络拓扑上,采用双网桥隔离(双臂)+ LXC 网关 TUN + DNAT 端口映射的架构,能够实现号池机与外部主网的二层物理隔离。外部机器连接 LXC 网关的 IP 访问号池机的 SSH 与 Web 服务,而号池机发出的外网请求则 100% 强制进入家宽代理,不存在任何因配置重置或 ICMP 重定向导致的 IP 泄漏隐患。

PVE截图

本质上就是普通的家庭路由器透明代理,如果不使用 PVE,也可以通过普通路由器或其他软路由设备对你的真机号池机搭建。

这里我列出我的搭建过程各项参数,后续按照如下参数配置:

节点 / 接口绑定网桥IP 地址 / 子网网关作用说明
LXC 网关 eth0vmbr0 (外网桥)172.18.198.209/26172.18.198.254承接外部 DNAT 访问(SSH 2222 / Web 8080)及代理出站
LXC 网关 eth1vmbr1 (内网桥)10.10.10.1/24留空号池专用内网的唯一网关出口
号池 VM ens18vmbr1 (内网桥)10.10.10.10/2410.10.10.1物理隔离环境,无任何代理进程与虚拟网卡

# PVE 宿主机网桥与网卡绑定

这里我的 PVE 版本为 9.1.9

创建 LXC 和 VM 过程略。

  1. 创建隔离内网桥 vmbr1 :
    登录 PVE 网页管理端,依次进入 节点 →\rightarrow 系统 →\rightarrow 网络 →\rightarrow 创建 →\rightarrow Linux Bridge:
  • 名称: vmbr1
  • IPv4/CIDR、网关、桥接端口: 全部留空(使其成为纯粹的内部虚拟交换机)。
  • 点击右上角 应用配置 (Apply Configuration)。
  1. 创建 LXC 网关,同时配置双网卡:
    选中 LXC 容器 →\rightarrow 网络 (Network):
  • eth0 : 桥接 vmbr0 ,IPv4 设为 172.18.198.209/26 ,网关设为 172.18.198.254 。
  • 点击上方 添加 (Add) 新增 eth1 :桥接 vmbr1 ,IPv4 设为 10.10.10.1/24 ,网关留空。
  1. 创建号池 KVM 虚拟机,同时绑定单网卡:
    选中号池 VM →\rightarrow 硬件 (Hardware) →\rightarrow 网络设备 (net0):
  • 将桥接配置为 vmbr1 。
  1. 需要为 LXC 网关容器开启 TUN 权限,在 PVE 宿主机上 nano /etc/pve/lxc/<lxc-id>.conf 加入如下内容:
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

# 配置 LXC 网关

# 开启内核转发

创建 /etc/sysctl.d/99-forward.conf 并开启 IPv4 转发:

cat << 'EOF' > /etc/sysctl.d/99-forward.conf
net.ipv4.ip_forward = 1
EOF
sysctl --system

# 配置 sing-box

我的 sing-box 版本为 1.14.3

编辑 /etc/sing-box/config.json ,使用 TUN 虚拟网卡接收来自 eth1 内网的流量:

{
  "$schema": "https://sing-box.sagernet.org/schema.json",
  "log": {
    "level": "info"
  },
  "dns": {
    "servers": [
      {
        "type": "tls",
        "tag": "proxy-dns",
        "detour": "home-proxy",
        "server": "1.1.1.1"
      }
    ],
    "final": "proxy-dns",
    "reverse_mapping": true,
    "strategy": "prefer_ipv4"
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "address": "198.18.0.1/16",
      "auto_route": true,
      "strict_route": true,
      "route_exclude_address": [ // 这里加入开发机的 IP (段)
        "127.0.0.0/8",
        "172.16.0.0/12",
        "192.168.0.0/16",
        "10.0.0.0/8",
        "17.0.0.0/8",
        "100.64.0.0/10",
        "224.0.0.0/4",
        "202.116.65.236/32" // 我学校的镜像站
      ]
    }
  ],
  "outbounds": [
    {
      // 我的家宽配置 ......
      "tag": "home-proxy"
    },
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": "tun-in",
        "action": "sniff",
        "timeout": "1s"
      },
      {
        "port": 22,
        "outbound": "direct"
      }
    ],
    "final": "home-proxy",
    "auto_detect_interface": true
  }
}

# 编写 DNAT 端口映射自动化脚本

创建 /usr/local/bin/gateway-rules.sh 。脚本中已包含以下四项核心逻辑:

  1. 入站 DNAT: 将访问 172.18.198.209:2222 转发至 10.10.10.10:22 (SSH),将 172.18.198.209:8080 转发至 10.10.10.10:8080 (cli2web)。
  2. 开发机直连白名单: 号池机主动发起的去往开发机或 172.18.198.192/26 主网段的流量直接内核三层转发。
cat << 'EOF' > /usr/local/bin/gateway-rules.sh
#!/bin/bash
set -e
WAN_IF="eth0"
LAN_SUBNET="10.10.10.0/24"
POOL_IP="10.10.10.10"
SSH_EXT_PORT="2222"
WEB_EXT_PORT="8080"
WEB_INT_PORT="8080"
# 先清理旧的残留规则
iptables -t mangle -F 2>/dev/null || true
ip rule del fwmark 1 table 100 2>/dev/null || true
ip route flush table 100 2>/dev/null || true
case "$1" in
  start)
    iptables -t nat -N POOL_DNAT 2>/dev/null || iptables -t nat -F POOL_DNAT
    iptables -t nat -D PREROUTING -i $WAN_IF -j POOL_DNAT 2>/dev/null || true
    # 入站 DNAT:2222 -> 号池机 22,8080 -> 号池机 8080
    iptables -t nat -A POOL_DNAT -p tcp --dport $SSH_EXT_PORT -j DNAT --to-destination ${POOL_IP}:22
    iptables -t nat -A POOL_DNAT -p tcp --dport $WEB_EXT_PORT -j DNAT --to-destination ${POOL_IP}:${WEB_INT_PORT}
    iptables -t nat -A PREROUTING -i $WAN_IF -j POOL_DNAT
    # 出站 SNAT:让直连开发机的流量与 DNAT 回包正常路由
    iptables -t nat -D POSTROUTING -s $LAN_SUBNET -o $WAN_IF -j MASQUERADE 2>/dev/null || true
    iptables -t nat -A POSTROUTING -s $LAN_SUBNET -o $WAN_IF -j MASQUERADE
    ;;
  stop)
    iptables -t nat -D PREROUTING -i $WAN_IF -j POOL_DNAT 2>/dev/null || true
    iptables -t nat -F POOL_DNAT 2>/dev/null || true
    iptables -t nat -X POOL_DNAT 2>/dev/null || true
    iptables -t nat -D POSTROUTING -s $LAN_SUBNET -o $WAN_IF -j MASQUERADE 2>/dev/null || true
    ;;
esac
EOF
chmod +x /usr/local/bin/gateway-rules.sh

# 配置 Systemd 开机自启服务

在 LXC 网关中创建 /etc/systemd/system/gateway-rules.service :

cat << 'EOF' > /etc/systemd/system/gateway-rules.service
[Unit]
Description=TUN and DNAT Gateway Rules for CLI Pool
After=network-online.target sing-box.service
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/gateway-rules.sh start
ExecStop=/usr/local/bin/gateway-rules.sh stop
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sing-box
systemctl enable --now gateway-rules

# 配置号池 VM

我的虚拟机发行版为 Ubuntu 26.04

我这里直接在安装系统过程中填好网络地址和网关就生成了配置。

若没有,则需登录号池 KVM 虚拟机,修改 /etc/netplan/00-installer-config.yaml ,将 IP 固定为 10.10.10.10 ,网关与 DNS 指向 LXC 的内网口 10.10.10.1 :

network:
  version: 2
  ethernets:
    ens18:
      dhcp4: false
      addresses:
        - 10.10.10.10/24
      routes:
        - to: default
          via: 10.10.10.1
      nameservers:
        addresses:
          - 10.10.10.1
          - 1.1.1.1

应用网络配置:

sudo netplan apply
Edited on Views times