Tailscale 与 clash 共存

前言

在家里买了 Nas 之后最头疼的事就是如何进行外网访问,如果有公网 IP 的话就非常简单,但可惜我没有,所以我选择了进行内网穿透,常见的内网穿透工具有 tailscale、zerotier、frp、ngrok,最终由于易用性等原因选择了 tailscale

由于移动端的限制,ios/android 都同时只能使用一个 vpn 程序,而我又经常有 科学上网 的需求,所以如何使 tailscaleclash 等工具并存,在 科学上网 的同时进行内网穿透成为了一个问题,以下是我长期使用下来总结的一些经验。

移动端

android

安卓是我的主力设备,所以在此之上的使用经验更多,大约有以下几种使用方式:

未 root

在不 root 的情况下,只能同时存在一个 vpn 程序,所以只能通过 tailscale android + exit node 实现

  1. 优点:不需要 root,简单易用(对于使用者来说)
  2. 缺点:
    1. 暂时不支持分应用代理,无法设置某些 app 绕过,导致国内应用网速受限于 exit node 的上传带宽 v1.70.0 已支持
    2. 需要至少一个额外设备运行 clash,并设置 exit node
    3. 在 nat 环境下如果无法打洞成功,则网速还会受限于 derper server

如果家里有 linux 或者 macos 设备,可以将 clash 和 exit node 运行在同一台设备,否则需要两台设备,一台运行 clash 做旁路网关,一台运行 tailscale exit node

已 root

/Magisk Tailscaled + clash for androidMagisk Tailscaled + box_for_magiskbox_for_magisk + tailscale android
分应用代理支持支持[1]支持[2]
ipv6不支持[3]支持支持
Taildrop不支持[4]不支持[4]支持
修复 dns需要[5]需要[5]不需要
  1. 需要修改 box_for_magisk 配置文件

  2. 需要 tailscale android v1.70.0

  3. clash for android 不支持使用 ipv6,所以无法通过 tailscale 建立 ipv6 直连

  4. Magisk Tailscaled 使用的是 linux 版,Taildrop 无法自动接收文件到 Downloads 目录

  5. Magisk Tailscaled 使用的是 linux 版,默认 dns 是通过 /etc/resolv.conf 查找的,但安卓没有该文件,需要手动添加以下内容到 /etc/resolv.conf,否则可能出现问题

    nameserver 8.8.8.8
    nameserver 8.8.4.4

ios

ios 参照 android 设置,使用 tailscale ios + exit-node 即可

surge ponte 也能实现内网穿透 + 科学上网的需求,但有以下几个缺点:

  1. 付费。surge 实在有点贵
  2. 不兼容非苹果生态。假如有 windows/android 需求,或者需要分享给非苹果生态的家人,都无法使用

桌面端

linux

如果想要将 clash 和 tailscale exit node 同时运行在在同一台设备上,需要按如下步骤修改 tailscale 设置

  1. 修改 /etc/default/tailscaled 为以下内容,这一步的作用是使 tailscale 不再修改 iptables,只充当纯净代理,参考

    # Set the port to listen on for incoming VPN packets.
    # Remote nodes will automatically be informed about the new port number,
    # but you might want to configure this in order to set external firewall
    # settings.
    PORT="0"
    
    # Extra flags you might want to pass to tailscaled.
    FLAGS="--tun=userspace-networking --socks5-server=0.0.0.0:1099"
  2. 重启 tailscale

    systemctl restart tailscaled
  3. 设置 tailscale exite-node

    tailscale set --advertise-exit-node

如此设置之后的网络图:

flowchart BT
tailscale1 --> tailscale
tailscale2 --> tailscale
exit-node --> Internet

subgraph exit-node
    tailscale --> clash
end

subgraph Android1
    Android --> tailscale1
end

subgraph Others
    Other --> tailscale2
end

不过这样会有一个问题,exit-node 这台设备无法连接到 tailnet,修复该问题需要修改 clash 或其他科学上网程序的设置,详细解决方案可参考 这里,clash 的解决方案如下:

  1. 增加新 proxies

    proxies:
    - name: "tailscale-socks"
        type: socks5
        server: localhost
        port: 1099
  2. 添加规则,参考

    rules:
    - IP-CIDR,100.64.0.0/10,tailscale-socks
    - IP-CIDR,fd7a:115c:a1e0::/48,tailscale-socks
    # 其他 subroutes
    # - IP-CIDR,xxxx,tailscale-socks 

macos

macos 也可参照 android 设置,使用 tailscale macos + exit-node 即可

顺便提一句,macos 也可像 linux 一样同时运行 clash 和 tailscale 并作为 exit-node 节点对其他设备提供服务,如果家里没有软路由,但是有闲置 macos 设备时可考虑

windows

可参照 android 设置,使用 tailscale windows + exit-node 即可