由于没有公网 IP,以往一直通过白嫖 Cloudflare Zero Trust 的方式异地组网。随着需求的增加,以及不久前 Cloudflare 1.1.1.1 DoH 被阻断,担心 不可抗拒因素 导致可用性进一步下降,因此将方案切换成 Tailscale + 自建 derp 服务器。
然而 Tailscale MagicDNS 往往会与代理工具为了防止 DNS 污染而采取的一系列手段相冲突。倘若你的代理工具不仅是以系统代理而是以 TUN 等更深方式还可能与完整 Tailscale 互斥。本文记录了一些解决方案。
默认情况下,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 更深入介入,但是又不希望干扰代理工具,经过我的尝试,至少在 Windows/macOS 上,通过以下几步便可实现:
- 代理工具排除 Tailscale 网段
- Tailscale 关闭本地 DNS 服务(并非 完全关闭 MagicDNS)
- 代理工具按需设置
100.100.100.100DNS
代理工具排除 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 服务器等内容,已有很多文章介绍参考,本文不再赘述,仅记录了一些与代理工具共存的技巧。希望对你有所帮助。