启用 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
2
3
{
"CorpDNS": true
}

这里的关键是 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
2
3
resolver #1
search domain[0] : tailaf9694.ts.net
nameserver[0] : 100.100.100.100

定位问题

根据 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