启用 Tailscale 无法开启 Clash Verge 的 TUN 模式解决方法
问题概述
在 Mac 上同时使用 Tailscale 和 Clash Verge 时,如果 Clash Verge 使用系统代理,浏览器可以正常上网,但是启用了 TUN 模式后,就无法正常上网。
这个问题本质上是两个软件都会接管系统网络路径,尤其是 DNS 和虚拟网卡路由配置。如果 Tailscale 启用了 DNS 接管,Clash Verge 再开启 TUN 模式时,就可能出现 DNS 流量处理冲突。
排查过程
先查看 Tailscale 当前是否启用了接管系统 DNS:
1 | tailscale status |
该命令用于验证的假设是:当前机器已经连接到 Tailscale,并且问题只在 Tailscale 连接后出现。
然后查看 Tailscale 当前配置:
1 | tailscale debug prefs |
该命令用于验证的假设是:Tailscale 当前启用了 AcceptDNS,连接后会把系统 DNS 调整为 Tailscale 提供的 DNS 配置。
如果输出中可以看到类似如下字段:
1 | { |
这里的关键是 CorpDNS。在部分版本里,CorpDNS 对应的就是 accept-dns 相关行为。开启后,Tailscale 会使用自己的 DNS 设置。
也可以直接查看系统 DNS 是否被调整为 Tailscale 的 DNS:
1 | scutil --dns |
当连接 Tailscale 后,系统 DNS 中出现了 100.100.100.100,说明 DNS 查询会走 Tailscale 的 MagicDNS。
如果输出中能看到 100.100.100.100,说明当前系统 DNS 已经被 Tailscale 接管。
1 | resolver #1 |
定位问题
根据 Clash Verge Rev 社区 issue 中的反馈,在 Mac 上启用 Tailscale 后,Tailscale MagicDNS 会将系统 DNS 调整为 100.100.100.100。
而 Clash Verge 开启 TUN 模式后,也会接管系统流量和 DNS 流量。这样就可能导致同一段 DNS 流量同时被 Clash Verge TUN 和 Tailscale 的底层网络处理。
所以这里可以判断 Tailscale 的 DNS 接管和 Clash Verge TUN 的 DNS 劫持之间产生了冲突。
解决方法
执行如下命令,关闭 Tailscale 接管系统 DNS:
1 | tailscale set --accept-dns=false |
该命令只关闭 Tailscale 的 DNS 接管,不影响 Tailscale VPN 本身连接。执行后,Tailscale 仍然可以连接 Tailnet,但不会继续把系统 DNS 强制改成 Tailscale DNS。
如果使用的是图形界面,也可以在 Tailscale 设置中关闭:
然后重新启动 Clash Verge。
验证
再次查看系统 DNS:
1 | scutil --dns |
然后验证 Tailscale 连接是否还正常:
1 | tailscale status |
可以看到,Tailscale 仍然保持连接,这说明关闭 accept-dns 只是关闭 DNS 接管,不是断开 Tailscale。
最后验证 Clash Verge 的 TUN 模式:
1 | curl -I https://www.google.com |