Chancel's blog

1622 字 6 分钟阅读

告别 Claude 封号:Incus 为团队构建统一代理的远程开发环境

  • DevOps

Incus 是一个现代化的 Linux 系统容器与虚拟机管理器,可以看作 LXD 的社区分支。它基于 LXC 运行系统容器(接近轻量虚拟机体验),也通过 QEMU 支持完整虚拟机;提供镜像管理、快照、热迁移、集群等企业级特性,并且命令行/API 非常简洁,所以 Incus 很适合做小团队开发容器。

尤其是现在 Vibe Coding 时代有太多的地区封锁,例如 Claude 的环境代理,小团队如果每个成员都采用自部署容易出现指纹泄露从而导致被封号问题,如果采用堡垒机则显得过分笨重,借助 Incus 可以把团队开发环境拆成了三层:

  1. 宿主机只负责运行 Incus
  2. 用一个专门的 dev-gateway 容器做统一网络出口
  3. 每个开发者拥有独立的 *-box 容器,统一接入内网开发网段

这样做有几个直接好处:

  1. 每个人都有独立开发盒子,环境互不污染
  2. 所有开发容器的 DNS、代理、出网策略都可以做到统一
  3. 容器内可以继续跑 Docker、VS Code Server、Claude/Codex 等工具互相不干扰
  4. 运维层面便于快照、迁移、回滚

下面将实践在一台配置较高的服务器上安装 Incus 并创建路由容器 dev-gateway,再创建一个开发容器 dev-box 网络指向 dev-gateway,并实现统一开发环境和网络信息的容器模板,实现类似统一多个远程开发环境在一样的网络环境中运行 Claude ,从而降低封号概率。

1. 架构

宿主机的 Incus 如下:

  • 存储池:local-sys(推荐 ZFS 更利于快照和运维,作为实验阶段 local-sys 也足够方便)
  • 存储驱动:dir
  • 开发网桥:incusbr-dev(宿主机真实网卡是 br0
  • 网段:10.66.0.0/24
  • 网桥地址:10.66.0.254/24

落地的网络示意图:

PlantUML diagram

宿主机规格如下:

  • Debian 12 / 6.1.0-37-amd64
  • Giga Computing MZ73-LM2-000
  • 2 x AMD EPYC 9755,共 256 核 512 线程
  • 1.5 TiB RAM
  • 3 x NVIDIA H100 80GB HBM3
  • 4TB WD_BLACK SN850X NVMe
  • 2 x 8TB Seagate ST8000AS0002
  • ZFS mirror,池名 zdata,可用约 5.45 TiB

这套规格可以支撑数十人的开发需求,并适当分配算力给需要的开发同事

2. 准备

2.1. 安装 Incus

安装方法如下,在宿主机上执行:

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc
chmod a+r /etc/apt/keyrings/zabbly.asc

sudo sh -c 'cat > /etc/apt/sources.list.d/zabbly-incus-stable.sources <<EOF
Enabled: yes
Types: deb
URIs: https://pkgs.zabbly.com/incus/stable
Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc
EOF'

apt update
apt install -y incus
incus admin init

刚初始化 Incus 时,默认会生成 incusbr0

2.2. 创建存储池

让我们来创建一个存储池,用于存放开发容器的实际存储:

incus storage create local-sys dir

注意,这是 dir 驱动的,不利于快照

创建之后,容器的根盘都会落在:

/var/lib/incus/storage-pools/local-sys

Incus 这套机器上用 dir 驱动已经能稳定工作。对于先快速搭起来的团队开发环境没问题(对快照不友好)

到这里基础的创建就完成了

3. 网关实现

3.1. 专用网桥

让我们来创建一个独属于这些开发容器的子网:

incus network create incusbr-dev ipv4.address=10.66.0.254/24 ipv4.nat=false ipv6.address=none

ipv4.nat=falseIncus 不做 NAT 出网,而是把所有开发容器的出口统一交给后面的 dev-gateway 容器处理。

从团队运维角度看,这样可以实现:

  1. 出口策略统一
  2. 代理统一
  3. DNS 统一
  4. 容器网络结构清晰

4. 网关容器 dev-gateway

创建 dev-gateway 的命令如下:

incus profile copy default router-basic
incus profile edit router-basic

进入编辑模式之后,router-basic 配置如下:

config:
  security.nesting: "true"
devices:
  eth0:
    name: eth0
    nictype: bridged
    parent: incusbr-dev
    type: nic
  eth1:
    name: eth1
    nictype: bridged
    parent: br0
    type: nic
  tun:
    path: /dev/net/tun
    type: unix-char
  root:
    path: /
    pool: local-sys
    type: disk

说明:

  • eth0 接开发内网 incusbr-dev
  • eth1 接外部桥 br0
  • security.nesting=true 允许更多的容器内能力
  • /dev/net/tun 支持常见 vpn 的完全伪装 tun 模式

如上,路由模板搭建完成

Tips: 单开一个空白容器之后再赋予能力来实现路由容器也完全可以

然后创建网关容器:

incus launch images:debian/12 dev-gateway --profile router-basic

4.1. 网关容器内部实现

网关容器采用 netplan 来控制网络,/etc/netplan/01-netcfg.yaml 的配置如下:

network:
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [10.66.0.1/24]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.1.2/24] # 假设宿主机的网段是 192.168.1.0/24
      nameservers:
        addresses:
          - 127.0.0.1
      routes:
        - to: default
          via: 192.168.1.1
          on-link: true

应用并查看网络信息:

root@dev-gateway:/opt/mihomo # netplan apply
root@dev-gateway:/opt/mihomo # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
325: eth0@if326: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:66:6a:d1:42:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.66.0.1/24 brd 10.66.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::1266:6aff:fed1:42a3/64 scope link 
       valid_lft forever preferred_lft forever
327: eth1@if328: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:66:6a:36:86:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::1266:6aff:fe36:860a/64 scope link 
       valid_lft forever preferred_lft forever

说明:

  • eth0 作为入口承担各个开发容器的网络入口
  • eth1 作为出口承担流量加密之后的网络出口

开启网关的网络转发能力:

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

到这步为止,这个容器初步具备了访问互联网的能力,接下来我们对它进行伪装改造,这一步的选择较多,可以用任何支持 tun 模式的设备来做网关分流,这里以 mihomo 为例,先下载并初始化:

mkdir /opt/mihomo
cd /opt/mihomo
wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.22/mihomo-linux-amd64-v2-go123-v1.19.22.gz
gzip -d mihomo-linux-amd64-v2-go123-v1.19.22.gz
chmod +x mihomo-linux-amd64-v2-go123-v1.19.22

如果只有全局代理没有分流策略的需求,下面的 dat 文件可跳过

创建配置文件夹并下载 dat 文件:

./mihomo-linux-amd64-v2-go123-v1.19.22 -d config
cd config
wget https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat
wget https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geoip.dat

配置文件在这里不展开,简单讲思路就是拦截所有的 dns 请求做 fake-ip,然后 match 所有流量发送到 tun 代理的目标侧落地机上,实现全局网络的完美伪装

注册成 systemd 服务,创建 /opt/mihomo/systemd.service

[Unit]
Description=Mihomo Proxy Service
Documentation=https://github.com/MetaCubeX/mihomo
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/mihomo
ExecStart=/opt/mihomo/mihomo-linux-amd64-v2-go123-v1.19.22 -d /opt/mihomo/config
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal
ProtectHome=yes
NoNewPrivileges=yes
PrivateTmp=yes
LimitNOFILE=infinity
LimitNPROC=infinity
TasksMax=infinity

[Install]
WantedBy=multi-user.target

链接到系统服务内并加载:

ln -s /opt/mihomo/systemd.service /etc/systemd/system/mihomo.service
systemctl daemon-reload
systemctl enable --now mihomo

mihomo 在这里实现了:

  1. 开发网默认网关
  2. DNS 出口
  3. 代理服务
  4. 透明代理/策略转发能力

网关容器的建设到这一步为止就是一个完美的虚拟软路由了,其核心的全局代理 + Fake-IP 防止 DNS 泄露,在 whoer.net 上的伪装检测程度可以达到 90% 以上(时区会 -10%)。

5. 开发容器

5.1. 创建

创建一个基础的容器模板:

incus profile create dev-incusbr-dev
incus profile edit dev-incusbr-dev

dev-incusbr-dev 的内容如下:

config:
  security.nesting: "true"
description: Basic CPU-only development environment
devices:
  eth0:
    name: eth0
    nictype: bridged
    parent: incusbr-dev # 全部桥接到前面创建的私有开发网桥上
    type: nic
  fuse:
    source: /dev/fuse
    type: unix-char
  root:
    path: /
    pool: local-sys
    type: disk
name: dev-incusbr-dev

创建第一个开发容器 dev-box-01

incus launch images:debian/12 dev-box-01 --profile dev-incusbr-dev

进入容器之后,安装 netplan :

apt-get install netplan.io openvswitch-switch

编辑 /etc/netplan/01-netcfg.yaml:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 10.66.0.2/24
      nameservers:
        addresses:
          - 10.66.0.1
      dhcp4: false
      dhcp6: false
      routes:
        - to: default
          via: 10.66.0.1
          on-link: true

说明:

  1. 每个开发容器固定一个静态 IP(或者自行完善 dev-gateway 的 dhcp 服务)
  2. 默认路由和 DNS 统一指向 dev-gateway

比起让每台容器自己维护代理和隧道要稳定得多,泄露的可能性更低

验证网络:

root@dev-box-01:~ # curl -vvv ip.sb
*   Trying 198.18.0.31:80...
* Connected to ip.sb (198.18.0.31) port 80 (#0)
> GET / HTTP/1.1
> Host: ip.sb
> User-Agent: curl/7.88.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Mon, 04 May 2026 06:23:31 GMT
< Content-Type: text/plain; charset=UTF-8
< Content-Length: 14
< Connection: keep-alive
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
< Vary: accept-encoding
< Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=xdudu4SThPvImmrd7IUOplTriEp31waFrv4xmmQVi8OYUq%2BpL7gsfN%2Bf%2BfPdpiOiUAqWY%2Fq%2BH5G%2F5EXK%2FZcM%2F8fS%2BWUkcxq43jw1Vj0nb5tlNOr1kkg6"}]}
< Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
< Server: cloudflare
< CF-RAY: 9f656acf9d4755c7-LAX
< alt-svc: h3=":443"; ma=86400
< 
<我的 Claude 实际落地机器 IP>
* Connection #0 to host ip.sb left intact

说明:

  • 对端 IP 解析为 198.18.0.31 说明 Fake-IP 生效了
  • CF-RAY: 9f656acf9d4755c7-LAX 成功走了洛杉矶的 CF 节点
  • 落地 IP 为你的实际代理落地机,自行检查

5.2. 验证

在部署完成后,建议使用下面这些命令做最基本的验证

宿主机侧:

incus list
incus profile list
incus profile show router-basic
incus profile show dev-incusbr-dev
incus network list
incus network show incusbr-dev
incus storage list

验证网关容器:

incus exec dev-gateway -- bash -lc 'ip a; echo "---"; ip r; echo "---"; cat /etc/resolv.conf'
incus exec dev-gateway -- bash -lc 'sysctl net.ipv4.ip_forward'
incus exec dev-gateway -- bash -lc 'iptables-save 2>/dev/null || true'
incus exec dev-gateway -- bash -lc 'nft list ruleset 2>/dev/null || true'

验证开发容器:

incus exec dev-box-01 -- bash -lc 'ip a; echo "---"; ip r; echo "---"; cat /etc/resolv.conf'

如果配置正确,应该看到:

  1. 开发盒子地址都在 10.66.0.0/24
  2. 默认路由指向 10.66.0.1
  3. DNS 指向 10.66.0.1
  4. dev-gateway 拥有双网卡
  5. dev-gateway 的默认路由走外部桥
互动

留言

暂无留言,来做第一个吧。

发表留言