Claude / Codex 防直连泄漏配置
Mac mini · Clash Verge Rev v2.5.x(mixed 7897 + TUN)+ Tailscale · <尖括号>/★ 为占位 · 勾选只存本机浏览器
核心判断:规则 + TUN 只在 Clash 运行时生效。Clash / mihomo 没有 kill-switch——内核退出或崩溃后 TUN 路由消失,流量直接走国内出口。Clash 退出后还能挡住的只有应用防火墙(Little Snitch)或 pf。
思路:①进 Clash 后 AI 流量只能走固定 US/JP 节点,绝不 DIRECT;②Clash 不在时由 Little Snitch 拒绝;③启动前再查一次出口。
1AI 专用策略组(无 DIRECT)
-
function main(config) { // ★ 占位:按你机场的节点命名修改。只留美国/日本,排除香港和信息节点 const KEEP = /美国|日本|🇺🇸|🇯🇵|\bUS\b|\bJP\b|United States|Japan/i; const DROP = /香港|🇭🇰|\bHK\b|Hong ?Kong|剩余|到期|官网|流量|套餐/i; const nodes = (config.proxies || []) .map(p => p.name) .filter(n => KEEP.test(n) && !DROP.test(n)); // AI 组:无 DIRECT;REJECT 兜底(无匹配节点时也只剩 REJECT → 断网而非直连) const groups = (config["proxy-groups"] || []).filter(g => g.name !== "AI"); groups.unshift({ name: "AI", type: "select", // 固定 IP 用 select;想自动切换可改 fallback(会换出口 IP) proxies: nodes.concat(["REJECT"]) }); config["proxy-groups"] = groups; const front = [ // Tailscale(与开箱清单一致;本脚本可直接替换旧的全局扩展脚本) "PROCESS-NAME,tailscaled,DIRECT", "PROCESS-NAME,io.tailscale.ipn.macsys.network-extension,DIRECT", "DOMAIN-SUFFIX,ts.net,DIRECT", "IP-CIDR,100.64.0.0/10,DIRECT,no-resolve", "IP-CIDR6,fd7a:115c:a1e0::/48,DIRECT,no-resolve", // AI:进程优先,域名兜底 "PROCESS-NAME-REGEX,(?i)(claude|chatgpt|codex),AI", "DOMAIN-SUFFIX,anthropic.com,AI", "DOMAIN-SUFFIX,claude.ai,AI", "DOMAIN-SUFFIX,claude.com,AI", "DOMAIN-SUFFIX,claudeusercontent.com,AI", "DOMAIN-SUFFIX,openai.com,AI", "DOMAIN-SUFFIX,chatgpt.com,AI", "DOMAIN-SUFFIX,oaistatic.com,AI", "DOMAIN-SUFFIX,oaiusercontent.com,AI", // 让第 6 步的出口检查与 AI 组同出口 "DOMAIN-SUFFIX,ipinfo.io,AI" ]; const rules = front.concat((config.rules || []).filter(r => !front.includes(r))); // 确保有 MATCH 兜底 if (!rules.some(r => /^\s*MATCH\s*,/i.test(r))) { const first = groups.find(g => g.name !== "AI"); rules.push("MATCH," + (first ? first.name : "AI")); } config.rules = rules; config["find-process-mode"] = "strict"; config.dns = config.dns || {}; const f = config.dns["fake-ip-filter"] || []; if (!f.includes("+.ts.net")) f.push("+.ts.net"); config.dns["fake-ip-filter"] = f; const p = config.dns["nameserver-policy"] || {}; p["+.ts.net"] = "100.100.100.100"; config.dns["nameserver-policy"] = p; return config; }- 先改 ★ 处
KEEP/DROP正则匹配你的节点名;Verge「代理」页确认AI组里只有 US/JP 节点 + REJECT。 - 已包含开箱清单里的 Tailscale 规则 / DNS 设置,替换旧脚本即可,不必叠加。
ipinfo.io也走 AI 组,第 6 步查到的就是 AI 实际出口。
REJECT 放末位是自行设计的取舍:无节点匹配时组里只剩 REJECT → 断网而不是直连;代价是正则写错时 AI 全部不可用。select 不会自动切走,节点挂了就是连不上(这是预期)。 - 先改 ★ 处
2固定干净 IP
-
不用香港(不在 Anthropic 支持地区);不在多个国家间来回跳,也不要用 url-test / 负载均衡。可用链式代理把机场节点作为前置,落地到静态 IP。
3TUN
-
排除网段(同一对话框里手动填,v2.5.x 脚本里写的 tun 字段会被丢弃):
100.64.0.0/10 fd7a:115c:a1e0::/48严格路由开启后若 Tailscale 互访异常,先核对排除网段;仍不行可关掉严格路由,靠第 4 步兜底。TUN 需服务模式。
4Little Snitch 兜底(Clash 退出后唯一防线)
-
# 对 Claude.app / ChatGPT.app / claude(CLI)/ codex(CLI)各建 3 条(node 仅限 npm 版 Claude Code 才需要) 允许 出站 → 198.18.0.0/15 任意端口 # mihomo fake-ip 段 允许 出站 → 127.0.0.1 端口 7897 # 本地 mixed 端口 拒绝 出站 → 任何服务器 # 规则优先级须低于上面两条原理:Clash 运行时 AI 域名解析为 198.18.x.x 并被 TUN 接走;Clash 退出后系统 DNS 返回真实 IP → 命中拒绝规则;走 HTTP 代理时只到 127.0.0.1:7897,端口无人监听则失败。
这是推理出的方案,未经社区验证。前提是 fake-ip 模式(fake-ip-range 默认 198.18.0.1/16);若改 redir-host 会失效。若给 node 加规则会波及所有 node 程序。需更硬的话可用 pf 按出口网卡封锁,但配置复杂、易误伤。
5Claude Code 代理
-
{ "env": { "HTTPS_PROXY": "http://127.0.0.1:7897", "HTTP_PROXY": "http://127.0.0.1:7897", "NO_PROXY": "localhost,127.0.0.1,100.64.0.0/10,.ts.net" } }只认
HTTPS_PROXY/HTTP_PROXY,不支持 SOCKS,忽略ALL_PROXY。/status确认。
6启动前检查出口 IP
-
_safe() { local cc=$(curl -s -m 5 https://ipinfo.io/country); if [[ -z "$cc" || "$cc" == "CN" ]]; then echo "代理异常(出口:${cc:-无}),已拦截"; return 1; fi; echo "出口:$cc ✓"; } claude() { _safe && command claude "$@"; } codex() { _safe && command codex "$@"; } gpt() { _safe && open -a ChatGPT; } claudeapp() { _safe && open -a Claude; }只是启动时检查一次,运行中 Clash 断开它管不到。 -
系统设置 → 通用 → 登录项与扩展。避免开机时 Clash 未就绪就先连上。
7其他(经验之谈,未证实)
平台怎么判定
- Anthropic:IP + 支付方式 + 手机号,部分账号还会要求 Persona 身份验证。2026 年 10 月有香港用户经 VPN 使用被封(SCMP 报道)。
- OpenAI:主要看 IP + 支付方式。
- 防泄漏只降低风险,不能改变账号本身的支付 / 手机 / 身份信息。
✓验证清单
-
curl -s https://ipinfo.io/json # 出口应为固定的 US/JP 节点 dig +short claude.ai # 应返回 198.18.x.x(fake-ip 生效) -
Little Snitch 应显示拒绝记录;测完重开 Clash Verge。