让香港服务器上的 Claude Code 从美国住宅 IP 出网
香港服务器直连 Anthropic,会因机房 IP 命中 Cloudflare 的「数据中心 / 非支持地区」风控。 本方案用一条 WireGuard 隧道把流量交给家里那台美国住宅机器做 NAT 出口, 再把 Claude Code 锁进一个只有隧道出口的网络命名空间—— 隧道一断就彻底没网,绝不回落香港、香港 IP 也绝不泄露给 Anthropic。
loc=US,不再命中机房风控。01目标与硬性要求
两台机器:一台香港无头服务器(有公网 IP,单一用途——只跑 Claude Code CLI),一台美国家用电脑(住宅 IP,作出口 / 网关)。要让前者访问 Anthropic 的全部流量,都从后者的住宅 IP 出去。
机房 IP 易触发风控
Cloudflare 会按 ASN 标记数据中心 / VPS 段。香港服务器直连,容易吃到验证、限速,甚至「该地区不支持」式拦截。
香港服务器:无头,靠 SSH 管
有公网 IP、专机专用。出口要落到住宅,但管理通道(SSH)不能受影响——这点决定了方案形态。
美国家用机 = 住宅出口
家里常驻的一台 Linux,住宅宽带。它来解密隧道流量、做 NAT 伪装,对端只看到一个普通美国家庭宽带 IP。
必须 fail-closed + 不泄露
隧道断 → Claude Code 直接停 / 报错,绝不回落香港;香港 IP 绝不暴露给 Anthropic。这是两条不可妥协的红线。
02结论:为什么是 netns + WireGuard
先给答案,再讲为什么。
WireGuard 隧道 + 香港服务器上一个专用网络命名空间(netns),Claude Code 只跑在这个 netns 里;美国家用机做 NAT 出口。
一句话说清它为什么最优:fail-closed 不靠防火墙 killswitch 规则,而靠「拓扑上根本没有第二条路」——netns 里只有 wg 一个网卡,隧道一断就彻底没网,物理上不可能回落到香港出口、也不可能泄露香港 IP。规则会写错、会被顺序问题绕过;「没有路由」这件事没法写错。
这条路线相较常见的 Tailscale 出口节点 / SSH+SOCKS5 更硬,专门吃本题里「硬 fail-closed + 不泄露」这两条红线。下面三节是完整的推理链;急着落地的可直接跳到 第 05 节。
03三个关键判断
为什么是它,而不是更省事的那些方案。
判断一:香港有公网 IP 且当监听端 → 纯 WireGuard 就够,不需要打洞
这点推翻了「家庭机在 NAT 后面,所以必须上 Tailscale」的常见顾虑。让美国家里那台主动拨向香港(配 Endpoint = 香港IP:端口 + PersistentKeepalive),香港只监听、不配对端 Endpoint。于是:
- 家里就算在 CGNAT / 动态 IP 后面也无所谓——出站 UDP + 每 25 秒一个 keepalive 就能把 NAT 映射撑住;
- 家里公网 IP 变了也不用管:WireGuard 的 roaming 会从已认证的 keepalive 包里自动学到家里当前的源地址;
- 不需要 DERP 中继、不需要协调服务器、不依赖任何第三方。
判断二:fail-closed 做成拓扑保证,而不是防火墙规则
把 Claude Code 关进一个只有 wg0 一个接口的网络命名空间:命名空间里没有香港的默认路由,也没有任何通往 root 命名空间的网卡。隧道在,流量走 wg;隧道断,流量直接 blackhole。
killswitch 防火墙规则可能写错、可能被规则顺序绕过、可能被某次 iptables -F 清掉;而「命名空间里压根没有第二条路由」是一种不可能写错的缺省——要泄露得先凭空造出一条路由来。这就是「拓扑保证」强过「规则保证」的地方。
判断三:netns 只隔离 Claude Code,管理面完全不动
SSH 管理、apt、NTP 全留在 root 命名空间,走香港正常出口,丝毫不受影响。你不会遇到「开了全局 VPN 把自己 SSH 锁死」或「VPN 一挂,连管理通道也没了」这类经典坑——这正是 netns 相对「整机走出口节点」的关键优势。
04数据流
三个角色:netns 里的 Claude Code、美国家用机、Anthropic。香港和美国家之间是一条私有 WireGuard 隧道,出口在美国家做 NAT。
05部署 · 香港服务器:建 wg → 搬进 netns
核心技巧是先在 root 命名空间建 wg 接口,再把接口搬进 netns——这样加密 UDP socket 留在 root ns(加密包能经香港物理网卡发到美国家),而明文那一侧进了隔离区。两个平面天然分离,连 fwmark 都不用配。
在 root ns 建 wg 接口(socket 就绑在 root ns)
# wg 接口先在 root ns 创建 —— 它的 UDP 加密 socket 会绑定在 root ns,
# 加密包因此能经香港物理网卡发往美国家
ip link add wg0 type wireguard
wg set wg0 private-key /etc/wireguard/hk.key listen-port 51820 \
peer <HOME_PUBKEY> allowed-ips 0.0.0.0/0 persistent-keepalive 25
# 香港只监听、不配对端 Endpoint:由美国家主动拨进来(见第 06 节)
建命名空间,把 wg 接口搬进去
接口搬进 netns 后,它的 UDP socket 仍留在 root ns——这是整套方案能成立的关键。
ip netns add claude
ip link set wg0 netns claude # 搬接口;socket 不跟着走,仍在 root ns
在命名空间内部配地址 / 路由 / MTU
ip -n claude link set lo up
ip -n claude addr add 10.9.0.1/24 dev wg0
ip -n claude link set wg0 mtu 1380 up
ip -n claude route add default dev wg0 # netns 里唯一的默认路由就是隧道
给 netns 配专属 DNS
ip netns exec 会把 /etc/netns/claude/resolv.conf bind 成该命名空间里的 /etc/resolv.conf。DNS 查询也只能走 wg0 → 美国家 → 从住宅出口解析,不存在 DNS 泄露。
mkdir -p /etc/netns/claude
printf 'nameserver 1.1.1.1\n' > /etc/netns/claude/resolv.conf
在命名空间内启动 Claude Code
进命名空间要 root,进去后立刻降权到普通用户(别用 root 跑 Claude Code)。
# ccuser = 跑 Claude Code 的普通用户,换成你自己的
ip netns exec claude runuser -u ccuser -- claude
香港只需放行入站 UDP 51820。WireGuard 会静默丢弃未通过加密认证的包,所以对全网开放这个端口也是「隐身」的——扫描者看不到任何响应。
06部署 · 美国家用机:转发 + MASQUERADE
家里这台是 WireGuard 的「拨号端」+「NAT 网关」。用 wg-quick 即可,配置自包含。
WireGuard 配置(家里主动拨向香港)
[Interface]
PrivateKey = <HOME_PRIVKEY>
Address = 10.9.0.2/24
[Peer] # 香港服务器
PublicKey = <HK_PUBKEY>
Endpoint = <香港公网IP>:51820 # 家里主动拨向香港,穿 NAT/CGNAT
AllowedIPs = 10.9.0.0/24 # 只接受隧道子网
PersistentKeepalive = 25 # 撑住 NAT 映射 + 让香港学到家里当前地址
开转发 + 源地址伪装(出口落到住宅 IP)
住宅线路常是 PPPoE,容易黑洞 PMTU,顺手给 TLS 兜底:钳住 MSS。
sysctl -w net.ipv4.ip_forward=1
WAN=$(ip route show default | awk '{print $5; exit}') # 家里出网网卡
iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o "$WAN" -j MASQUERADE
iptables -A FORWARD -i wg0 -s 10.9.0.0/24 -j ACCEPT
iptables -A FORWARD -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# PPPoE 黑洞 PMTU 时给 TLS 兜底
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
wg-quick up wg0
可把上面的 sysctl / iptables 写进 wg0.conf 的 PostUp / PostDown,让规则跟着 wg-quick up/down 自动加上 / 撤掉,再 systemctl enable wg-quick@wg0 开机自起。家里无需任何公网入站端口,全靠出站拨号。
07开机持久化(systemd)
把第 05 节的 netns + wg 建立过程固化为开机自动重放,Claude Code 再进这个常驻命名空间里跑。
把建立过程写成脚本
#!/usr/bin/env bash
set -euo pipefail
ip link show wg0 >/dev/null 2>&1 || ip link add wg0 type wireguard
wg set wg0 private-key /etc/wireguard/hk.key listen-port 51820 \
peer <HOME_PUBKEY> allowed-ips 0.0.0.0/0 persistent-keepalive 25
ip netns add claude 2>/dev/null || true
ip link set wg0 netns claude
ip -n claude link set lo up
ip -n claude addr add 10.9.0.1/24 dev wg0 2>/dev/null || true
ip -n claude link set wg0 mtu 1380 up
ip -n claude route add default dev wg0 2>/dev/null || true
oneshot 单元:开机建好命名空间 + 隧道
[Unit]
Description=Claude netns + WireGuard underlay
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/claude-netns-up.sh
[Install]
WantedBy=multi-user.target
启用 + 一个进命名空间的启动包装
chmod +x /usr/local/sbin/claude-netns-up.sh
systemctl daemon-reload
systemctl enable --now claude-netns.service
# 之后跑 Claude Code 都经这个包装进命名空间(交互式)
# 写成 /usr/local/bin/cc:
# #!/bin/sh
# exec sudo ip netns exec claude runuser -u ccuser -- claude "$@"
若要让 Claude Code 以服务形式常驻(无人值守),可写第二个 unit:BindsTo=claude-netns.service + ExecStart=/usr/sbin/ip netns exec claude /usr/sbin/runuser -u ccuser -- /usr/bin/claude ...。也可用 systemd 的 NetworkNamespacePath=/var/run/netns/claude 让服务直接加入该命名空间(但 DNS 的 bind 要另行处理,用 ip netns exec 起更省事)。
08会咬人的坑
几个真上手才会撞到的点。
住宅 PPPoE 上跑 wg,PMTU 一黑洞,TLS 握手或流式响应会莫名卡死。wg0 设 mtu 1380 + 美国家那条 --clamp-mss-to-pmtu,基本就稳了。出现「连上了但请求一直转圈」先查这里。
很多 VPN 方案翻车在 IPv6 绕过隧道直连。这套里 netns 压根没有 IPv6 接口和路由,泄露通道根本不存在,不用额外操心。
已通过给 netns 配专属 resolv.conf 解决(第 05 节步骤 4)。命名空间里唯一的路由是 wg0,所以连发往 1.1.1.1 的 DNS 也是从美国家出口解析的,不会泄露到香港本地解析器。
香港机器时钟偏了 TLS 会直接失败,确认 NTP 在跑。若香港公网 IP 不固定,美国家的 Endpoint 要配个 DDNS 域名;服务器一般是静态 IP,通常不用管。
09验证 + 证明 fail-closed
这一步别省。第 3 条是整个方案的验收点。
# 1. netns 里看到的应是美国住宅 IP、loc=US
sudo ip netns exec claude curl -s https://www.cloudflare.com/cdn-cgi/trace
# ip=<美国住宅IP> loc=US ← Cloudflare 把你当美国住宅,而不是机房
# 2. root ns(对照):还是香港 IP,证明只隔离了 Claude Code、管理面没动
curl -s https://api.ipify.org ; echo
# 3. 关键:把美国家的 wg 停掉(在美国家 wg-quick down wg0),再在 netns 内 curl
# 必须超时 / 失败,绝不能返回香港 IP —— 这就是 fail-closed 的实证
sudo ip netns exec claude curl -m 10 https://api.ipify.org # 期望:超时
① netns 内 cdn-cgi/trace 的 ip= 是美国住宅、loc=US;② root ns 仍是香港 IP;③ 隧道一停,netns 内 curl 超时而非吐出香港 IP。三条都满足,说明:全程住宅出口、香港 IP 不泄露、且隧道断时彻底断网不回落。
10备选方案对比
同一个问题的另两条常见路线,以及为何此场景下不如 netns + WireGuard。
| 方案 | 优点 | 为何此场景不作首选 |
|---|---|---|
| netns + WireGuard (本站推荐) |
fail-closed 是拓扑保证;只隔离 Claude Code;DNS / IPv6 泄露天然堵死;零第三方依赖 | 配置比一键脚本多几步(但每步都很短) |
| Tailscale 出口节点 | 最省事,打洞 / 重连 / 密钥全托管;对应用透明 | fail-closed 不够硬(出口节点掉线可能回落);整机走出口,要单独给 SSH 管理开例外;本场景香港有公网 IP,用不到它的打洞能力 |
| SSH 反向 SOCKS / HTTP CONNECT | 基建最轻,一条 autossh + 家里小代理 |
fail-closed 依赖 Claude Code 真把 100% 流量(含遥测端点)都走代理 env —— 这是应用层假设,不如内核层路由可靠 |
若哪天家里那台没有稳定可达性、且香港也变成动态 / 不可达(极端情况),可把 tailscaled 跑在 netns 里、用家里当 exit node——拿 Tailscale 的打洞韧性 + netns 的「没有第二条路」。但本题里香港有公网 IP,纯 WireGuard 是最简也最稳的那一档。
11安全与合规
安全姿态上的几个要点,以及长期跑下去要盯的东西。
美国家零公网入站端口(全靠出站拨号 + keepalive);香港只开 wg 的 UDP 51820,且 WireGuard 对未认证包静默丢弃、形同隐身。别图省事把 sshd 或任何服务直接暴露到公网。
wg 私钥 chmod 600、属主 root;Claude Code 以普通用户跑在 netns 内,不要用 root。AllowedIPs 严格按需:香港侧 0.0.0.0/0(全量入隧道)、家里侧只 10.9.0.0/24(只收隧道子网)。
日常盯三样:wg show wg0 latest-handshakes(握手是否新鲜)、netns 内出口 IP 是否仍是住宅段、家宽上行带宽是否被打满。家宽公网 IP 会变动属正常——靠家里主动拨 + keepalive 自动 roam,不用记死 IP。
本方案用于让自有服务在自有住宅网络合法出网、规避对机房 IP 的误伤式风控;请遵守 Anthropic 使用条款与各地法规,勿用于绕过账号封禁、转售或其它违规用途。基建做得再硬,账号若违反 ToS 一样会被封——风险自担。