vpn与代理工具共存

公司vpn原理

应用 → getaddrinfo("claude.ai")
   →  DNS (127.0.0.1:53) 返回 xx.100.0.3 (公司内部 IP)
   → 路由 xx.100/14 → vpn utun
   → vpn服务端转发 → vpn 海外节点 → 公网
   → Cloudflare 看到 SG 接入 → colo=SIN
   ❌ Clash 全程没参与

解决方案

macOS 的 /etc/resolver/ 是内核级的 per-domain DNS 配置: - 由 mDNSResponder 在处理 getaddrinfo() 时直接使用 - 优先级高于 scutil --dns 看到的所有 supplemental resolver - 任何 VPN 客户端推的 resolver 都无法干扰 完整链路

应用 → getaddrinfo("claude.ai")
   → mDNSResponder 查 /etc/resolver/claude.ai
   → 命中!DNS 包发到 1.1.1.1
   → UDP 53 包路由进 Clash TUN
   → Clash dns-hijack:any:53 拦截
   → Clash 返回 fake-ip 198.18.0.x
   → 应用 TCP 到 198.18.0.x
   → Clash 反查 fake-ip → claude.ai
   → 命中规则 DomainSuffix,claude.ai → Anthropic 组
   → 美国住宅代理拨号
   → 出口 LAX 美国 ✅

完整步骤

  1. 创建 /etc/resolver/ 文件
sudo mkdir -p /etc/resolver
for d in anthropic.com claude.ai claudeusercontent.com openai.com chatgpt.com; do
  echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolver/$d > /dev/null
done
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
  1. 重启代理工具 & vpn工具
  2. 验证方法(重要:不要用 dig)
工具 走哪条路径 是否读 /etc/resolver/
dig libresolv → /etc/resolv.conf ❌ 不读
host libresolv → /etc/resolv.conf ❌ 不读
dscacheutil DirectoryServices ✅ 读
curl / 浏览器 / Claude.app getaddrinfo() → mDNSResponder ✅ 读

正确验证

# 1. DNS 拿到 Clash fake-ip
dscacheutil -q host -a name claude.ai
# 期望: ip_address: 198.18.0.x

# 2. 真实应用出口在美国
curl -s https://claude.ai/cdn-cgi/trace | grep -E "loc|colo"
# 期望: colo=LAX (或其他 US 节点)  loc=US

# 3. 内网仍可达
curl -sI https://xxx.org
# 期望: HTTP 200

关键词: VPN