Tailscale 与 clash 共存
前言
在家里买了 Nas 之后最头疼的事就是如何进行外网访问,如果有公网 IP 的话就非常简单,但可惜我没有,所以我选择了进行内网穿透,常见的内网穿透工具有 tailscale、zerotier、frp、ngrok,最终由于易用性等原因选择了 tailscale。
由于移动端的限制,ios/android 都同时只能使用一个 vpn 程序,而我又经常有 科学上网 的需求,所以如何使 tailscale 和 clash 等工具并存,在 科学上网 的同时进行内网穿透成为了一个问题,以下是我长期使用下来总结的一些经验。
移动端
android
安卓是我的主力设备,所以在此之上的使用经验更多,大约有以下几种使用方式:
未 root
在不 root 的情况下,只能同时存在一个 vpn 程序,所以只能通过 tailscale android + exit node 实现
- 优点:不需要 root,简单易用(对于使用者来说)
- 缺点:
暂时不支持分应用代理,无法设置某些 app 绕过,导致国内应用网速受限于 exit node 的上传带宽v1.70.0 已支持- 需要至少一个额外设备运行 clash,并设置 exit node
- 在 nat 环境下如果无法打洞成功,则网速还会受限于 derper server
如果家里有 linux 或者 macos 设备,可以将 clash 和 exit node 运行在同一台设备,否则需要两台设备,一台运行 clash 做旁路网关,一台运行 tailscale exit node
已 root
/ | Magisk Tailscaled + clash for android | Magisk Tailscaled + box_for_magisk | box_for_magisk + tailscale android |
---|---|---|---|
分应用代理 | 支持 | 支持[1] | 支持[2] |
ipv6 | 不支持[3] | 支持 | 支持 |
Taildrop | 不支持[4] | 不支持[4] | 支持 |
修复 dns | 需要[5] | 需要[5] | 不需要 |
需要修改 box_for_magisk 配置文件
clash for android 不支持使用 ipv6,所以无法通过 tailscale 建立 ipv6 直连
Magisk Tailscaled 使用的是 linux 版,Taildrop 无法自动接收文件到 Downloads 目录
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 也能实现内网穿透 + 科学上网的需求,但有以下几个缺点:
- 付费。surge 实在有点贵
- 不兼容非苹果生态。假如有 windows/android 需求,或者需要分享给非苹果生态的家人,都无法使用
桌面端
linux
如果想要将 clash 和 tailscale exit node 同时运行在在同一台设备上,需要按如下步骤修改 tailscale 设置
修改
/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"
重启 tailscale
systemctl restart tailscaled
设置 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 的解决方案如下:
增加新
proxies
proxies: - name: "tailscale-socks" type: socks5 server: localhost port: 1099
添加规则,参考
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 即可