住宅出口方案 proxy.sinogenomics.com
跨境出口 · Claude Code · 硬 fail-closed

让香港服务器上的 Claude Code 从美国住宅 IP 出网

香港服务器直连 Anthropic,会因机房 IP 命中 Cloudflare 的「数据中心 / 非支持地区」风控。 本方案用一条 WireGuard 隧道把流量交给家里那台美国住宅机器做 NAT 出口, 再把 Claude Code 锁进一个只有隧道出口的网络命名空间—— 隧道一断就彻底没网,绝不回落香港、香港 IP 也绝不泄露给 Anthropic

WireGuard 网络命名空间 netns fail-closed · 拓扑保证 iptables MASQUERADE 零第三方依赖 systemd 持久化
REQ-01
100% 住宅出口
Claude → Anthropic 全程从美国住宅 IP 出网;Cloudflare 看到的是住宅 ASN + loc=US,不再命中机房风控。
REQ-02
香港 IP 不泄露
香港服务器从不直连 Anthropic,只跟美国家跑一条私有隧道;Anthropic / Cloudflare 自始至终只见美国住宅 IP。
REQ-03
fail-closed
隧道一断,Claude Code 立即报错,绝不回落香港出口。靠「命名空间里没有第二条路由」做成拓扑保证,而非防火墙规则。

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。

香港服务器 无头 · 有公网 IP 网络命名空间 netns:claude Claude Code wg0 — 唯一出口 无默认路由 → 隧道断 = 无网 WireGuard 加密 香港网卡发出 美国家用机 住宅宽带 wg0 解密 iptables MASQUERADE 源 IP 改写成住宅地址 住宅 NAT 出网 Anthropic Cloudflare 边缘 只见住宅 IP loc = US
Claude Code 的包从 netns 里的 wg0 出去 → 加密后经香港物理网卡发到美国家 → 家里解密 + MASQUERADE → 从住宅宽带出网。Anthropic / Cloudflare 看到的源 IP 是美国住宅;香港 IP 从头到尾没跟 Anthropic 建过连接,它只跟美国家跑了一条私有 wg 隧道。

05部署 · 香港服务器:建 wg → 搬进 netns

核心技巧是先在 root 命名空间建 wg 接口,再把接口搬进 netns——这样加密 UDP socket 留在 root ns(加密包能经香港物理网卡发到美国家),而明文那一侧进了隔离区。两个平面天然分离,连 fwmark 都不用配。

香港服务器 网络命名空间 netns:claude Claude Code wg0(明文侧) 唯一路由 default → wg0 root ns(根命名空间 · 香港正常出口) wg0 的 UDP socket(留此) 物理网卡 eth0 把接口搬进 netns,socket 不动 加密包出 互联网 → 美国家 美国家用机 解密 + MASQUERADE 住宅出网 → Anthropic
关键:wg 接口在 root ns 创建,它的加密 UDP socket 就绑在 root ns(加密包从香港真实网卡出去);再把 wg 接口搬进 netns,明文那一侧进了隔离区。底层(root ns)与上层(netns)天然分离。
1

在 root ns 建 wg 接口(socket 就绑在 root ns)

香港服务器 · rootbash
# 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 节)
2

建命名空间,把 wg 接口搬进去

接口搬进 netns 后,它的 UDP socket 仍留在 root ns——这是整套方案能成立的关键。

香港服务器 · rootbash
ip netns add claude
ip link set wg0 netns claude        # 搬接口;socket 不跟着走,仍在 root ns
3

在命名空间内部配地址 / 路由 / MTU

香港服务器 · rootbash
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 里唯一的默认路由就是隧道
4

给 netns 配专属 DNS

ip netns exec 会把 /etc/netns/claude/resolv.conf bind 成该命名空间里的 /etc/resolv.conf。DNS 查询也只能走 wg0 → 美国家 → 从住宅出口解析,不存在 DNS 泄露。

香港服务器 · rootbash
mkdir -p /etc/netns/claude
printf 'nameserver 1.1.1.1\n' > /etc/netns/claude/resolv.conf
5

在命名空间内启动 Claude Code

进命名空间要 root,进去后立刻降权到普通用户(别用 root 跑 Claude Code)。

香港服务器 · rootbash
# ccuser = 跑 Claude Code 的普通用户,换成你自己的
ip netns exec claude runuser -u ccuser -- claude
防火墙

香港只需放行入站 UDP 51820。WireGuard 会静默丢弃未通过加密认证的包,所以对全网开放这个端口也是「隐身」的——扫描者看不到任何响应。

06部署 · 美国家用机:转发 + MASQUERADE

家里这台是 WireGuard 的「拨号端」+「NAT 网关」。用 wg-quick 即可,配置自包含。

1

WireGuard 配置(家里主动拨向香港)

/etc/wireguard/wg0.conf · 美国家ini
[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 映射 + 让香港学到家里当前地址
2

开转发 + 源地址伪装(出口落到住宅 IP)

住宅线路常是 PPPoE,容易黑洞 PMTU,顺手给 TLS 兜底:钳住 MSS。

美国家 · rootbash
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
把 NAT 规则随隧道起落

可把上面的 sysctl / iptables 写进 wg0.confPostUp / PostDown,让规则跟着 wg-quick up/down 自动加上 / 撤掉,再 systemctl enable wg-quick@wg0 开机自起。家里无需任何公网入站端口,全靠出站拨号。

07开机持久化(systemd)

把第 05 节的 netns + wg 建立过程固化为开机自动重放,Claude Code 再进这个常驻命名空间里跑。

1

把建立过程写成脚本

/usr/local/sbin/claude-netns-up.shbash
#!/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
2

oneshot 单元:开机建好命名空间 + 隧道

/etc/systemd/system/claude-netns.serviceini
[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
3

启用 + 一个进命名空间的启动包装

香港服务器 · rootbash
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会咬人的坑

几个真上手才会撞到的点。

MTU / MSS —— 最容易出的玄学问题

住宅 PPPoE 上跑 wg,PMTU 一黑洞,TLS 握手或流式响应会莫名卡死。wg0mtu 1380 + 美国家那条 --clamp-mss-to-pmtu,基本就稳了。出现「连上了但请求一直转圈」先查这里。

IPv6 泄露 —— netns 天然堵死

很多 VPN 方案翻车在 IPv6 绕过隧道直连。这套里 netns 压根没有 IPv6 接口和路由,泄露通道根本不存在,不用额外操心。

DNS 必须也走隧道

已通过给 netns 配专属 resolv.conf 解决(第 05 节步骤 4)。命名空间里唯一的路由是 wg0,所以连发往 1.1.1.1 的 DNS 也是从美国家出口解析的,不会泄露到香港本地解析器。

时钟 + 香港 IP 变动

香港机器时钟偏了 TLS 会直接失败,确认 NTP 在跑。若香港公网 IP 不固定,美国家的 Endpoint 要配个 DDNS 域名;服务器一般是静态 IP,通常不用管。

09验证 + 证明 fail-closed

这一步别省。第 3 条是整个方案的验收点。

香港服务器bash
# 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/traceip= 是美国住宅、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 —— 这是应用层假设,不如内核层路由可靠
想要打洞韧性又要硬 fail-closed:混合款

若哪天家里那台没有稳定可达性、且香港也变成动态 / 不可达(极端情况),可把 tailscaled 跑在 netns 里、用家里当 exit node——拿 Tailscale 的打洞韧性 + netns 的「没有第二条路」。但本题里香港有公网 IP,纯 WireGuard 是最简也最稳的那一档。

11安全与合规

安全姿态上的几个要点,以及长期跑下去要盯的东西。

两端攻击面都最小

美国家零公网入站端口(全靠出站拨号 + keepalive);香港只开 wg 的 UDP 51820,且 WireGuard 对未认证包静默丢弃、形同隐身。别图省事把 sshd 或任何服务直接暴露到公网。

密钥与最小权限

wg 私钥 chmod 600、属主 root;Claude Code 以普通用户跑在 netns 内,不要用 rootAllowedIPs 严格按需:香港侧 0.0.0.0/0(全量入隧道)、家里侧只 10.9.0.0/24(只收隧道子网)。

监控

日常盯三样:wg show wg0 latest-handshakes(握手是否新鲜)、netns 内出口 IP 是否仍是住宅段、家宽上行带宽是否被打满。家宽公网 IP 会变动属正常——靠家里主动拨 + keepalive 自动 roam,不用记死 IP。

合规边界

本方案用于让自有服务在自有住宅网络合法出网、规避对机房 IP 的误伤式风控;请遵守 Anthropic 使用条款与各地法规,勿用于绕过账号封禁、转售或其它违规用途。基建做得再硬,账号若违反 ToS 一样会被封——风险自担。