Tailscale 配合 Mihomo(Clash.Meta) TUN/Quantumult X VPN 共存使用技巧
由于没有公网 IP,以往一直通过白嫖 Cloudflare Zero Trust 的方式异地组网。随着需求的增加,以及不久前 Cloudflare 1.1.1.1
DoH 被阻断,担心 不可抗拒因素 导致可用性进一步下降,因此将方案切换成 Tailscale + 自建 derp 服务器。
然而 Tailscale MagicDNS 往往会与代理工具为了防止 DNS 污染而采取的一系列手段相冲突。倘若你的代理工具不仅是以系统代理而是以 TUN 等更深方式还可能与完整 Tailscale 互斥。本文记录了一些解决方案。
最小化 Tailscale──作为 Socks5 节点
默认情况下,Tailscale 会作为 TUN 虚拟网关处理,这可能会与代理工具互斥。Tailscale Userspace networking mode 可以 gVisor 仅作为 Socks5 代理节点加入代理工具的链路。Tailscale 两种工作方式的技术层面对比参考 Tailscale 文档 Technical overviews 部分。
tailscaled --tun=userspace-networking --socks5-server=localhost:<socks5-port>
tailscale up --accept-dns=false --auth-key=<auth-key>
此时将 <auth-key>@localhost:<socks5-port>
作为 Socks5 节点手动添加到代理工具中即可。主流代理工具均支持以规则指定节点,亦或是仅在需要时切换至此节点,在设置好 Exit Node 并在 Exit Node 配置好出站代理后一直采用此节点均可。
完整 Tailscale 与代理工具共存
如果日常使用 Tailscale 程度更高、希望 Tailscale 更深入介入,但是又不希望干扰代理工具,经过我的尝试,至少在 Windows/macOS 上,通过以下几步便可实现:
- 代理工具排除 Tailscale 网段
- Tailscale 关闭本地 DNS 服务(并非 完全关闭 MagicDNS)
- 代理工具按需设置
100.100.100.100
DNS
代理工具排除 Tailscale 网段
仅以 Mihomo/Quantumult X 为例具体操作。
Tailscale 会为每个节点分配一个唯一的 100.x.y.z
IP,可以单独将这些地址排除在代理之外。特别的,Mihomo 还可以在规则中根据 PROCESS-NAME
来排除 Tailscale 进程、在 TUN 网关中排除 Tailscale interface。
在 Mihomo profile 中插入以下规则:
tun:
exclude-interface:
- Tailscale # maybe `utun*` on macOS
route-exclude-address:
- 100.64.0.0/10
- fd7a:115c:a1e0::/48
rules:
- PROCESS-NAME,tailscale.exe,DIRECT # remove .exe for macOS
- PROCESS-NAME,tailscaled.exe,DIRECT
对于 Quantumult X,如果你使用公共性质的代理服务商家所提供的配置文件,一般已经在 [general]
中排除了 100.64.0.0/10
,但是 Quantumult X 会添加 excluded_routes
路由到默认网关而覆盖 Tailscale 路由。由于路由规则从细到粗,可以尝试将 excluded_routes
排除放大至 100.64.0.0/9
以确保 Tailscale 100.64.0.0/10
路由优先生效。
[general]
excluded_routes = 100.64.0.0/9 ; as well as other routes
Tailscale 关闭本地 DNS 服务
对于 CLI 版本。
tailscale up --accept-dns=false
对于 GUI 版本,可以在 Settings
> General
中取消勾选「Use Tailscale DNS settings」。注意不需要完全关闭 MagicDNS,只需要关闭本地 DNS 服务即可。
其实到这一步可以通过 Tailscale IP 的方式连接到其他节点,但是对于 Tailscale 分配的 <machine-name>.<tailnet-name>.ts.net
就无法解析。如果你完全不需要此域名或者自定义域名解析,可以直接跳过下一步。
代理工具按需设置 DNS
一个比较懒的方法是直接在代理工具中全局 DNS 设置为 100.100.100.100
交由 MagicDNS,MagicDNS 在非 Tailscale 域名解析中会自动使用系统 DNS 或其他公共 DNS/DoH 服务,可在面板中设置。
而代理工具往往会提供复杂的 DNS 解析以及回退机制,更加理想的做法是根据 +.<tailnet-name>.ts.net
交由 MagicDNS 其余继续进入代理工具的 DNS 解析链路。
- Mihomo DNS 配置
dns:
nameserver-policy:
"+.<tailnet-name>.ts.net": "100.100.100.100"
- Quantumult X DNS 配置
[dns]
server = /+.<tailnet-name>.ts.net/100.100.100.100
不过遗憾的是,直接通过 <machine-name>
还是无法解析,如果你设备变化不频繁,也可以直接写进 Hosts 文件。
关于 Tailscale 本体的使用、自建 Derp 服务器等内容,已有很多文章介绍参考,本文不再赘述,仅记录了一些与代理工具共存的技巧。希望对你有所帮助。