Refined

Refined

基于 FakeDNS 的 Tailscale 子网透明代理方案

60
2024-06-30
基于 FakeDNS 的 Tailscale 子网透明代理方案

基于 FakeDNS 的 Tailscale 子网透明代理方案

背景

Tailscale 是一个优秀的组网工具,在 Windows 端和 Mac 端有很强的灵活性。但在移动设备上由于系统限制,通常只能激活一个 VPN,导致使用起来略有不便。尽管 Tailscale 可以通过配置 Exit-node 来支持全流量转发,但这样会占用所有流量通道,显得不太灵活。因此,需要寻找一个在网络内的节点间自动路由流量的方法,以解决 VPN 冲突的问题。

思路

Tailscale 可以自动接管设备的 DNS,支持 Magic DNS 以及 Advertise Routes。通过 Magic DNS 配置上游 DNS 服务器之后,可以在 Tailscale 网络上进行自定义 DNS 配置。由此访问外网的请求可以指定通过某个上游 DNS 服务进行解析。而 Advertise Routes 允许 Tailscale 节点发布其可访问的子网范围,使得 Tailscale 网络中的其他设备能够通过它访问特定的局域网或网络段。

Advertise Routes 的特性可以与 FakeDNS 结合起来,将 FakeDNS 的 CIDR 宣布给 Tailscale 网络之后,Tailsacle 网络内的其他节点就会知道该 CIDR 范围,并通过该节点处理该 CIDR 范围内的流量。

于是,当访问外网域名时,其域名会被解析为一个在 FakeDNS 范围内的虚拟 IP 地址;然后再通过 Advertise Routes,将所有流向该虚拟 IP 的流量路由到该代理节点,就最终实现了在整个 Tailscale 网络内的透明代理:任意节点访问该 CIDR 的流量都能自动通过代理节点,无需再针对不同设备单独配置。

实现

参考资料:mosdns wiki

基于以上思路,我选择 mosDNS + ClashMeta 实现该方案,mosDNS 负责 DNS 的管理与解析,而 ClashMeta 负责转发代理流量。

  1. 配置 mosDNS,设置上游 DNS,将国内请求解析为实际 IP,将国外请求解析为 FakeIP。
  2. 配置 Tailscale 的 DNS,指向配置 mosDNS 的节点,使所有请求都经过 mosDNS。
  3. 在代理节点上配置 ClashMeta,定义流量规则。
  4. 在运行 ClashMeta 的节点上配置 Advertise Routes,将 mosDNS 生成的 FakeIP 的 CIDR 宣布给其他节点。

优点

  • 配置简单:相比其他 FakeDNS 实现,mosDNS 配置比较简单,通过 mosDNS 的 ClashMeta 的文档很容易即可实现配置。
  • 较为可靠:由于 Tailscale 不会路由 FakeIP 的 CIDR 以外的普通流量,所以代理节点宕机时不会影响普通流量访问。
  • 较为灵活:可以实现对 DNS 的细粒度控制,为不同 FakeIP 的 CIDR 配置不同的代理,实现负载均衡等功能。

总结

这套方案的主体思路来自于这篇文章1,不过该文章是针对于物理局域网的,而本文将其迁移到了 Tailscale 网络上,同样可以适用。