背景
最近在整理手机上的代理配置,碰到一个问题:Android 上想同时使用代理和 Tailscale。
我平时手机上会开 Clash 类客户端,主要用来走代理规则。同时又希望手机能通过 Tailscale 访问家里的 Mac mini,比如用 CC Pocket 连 Mac 上的 bridge。桌面端还好,Tailscale 和 Clash Verge 可以同时跑,通过路由排除就能共存。但 Android 上麻烦一点,因为官方 Tailscale App 和代理 App 都要占用系统 VPN。
后来发现 FlClash 使用的 mihomo 内核已经支持 type: tailscale 出站,于是就尝试把 Tailscale 放进 FlClash 配置里,让它作为一个特殊节点使用。
这篇记录一下配置和排查过程。主要是为了以后自己再换手机时别踩同样的坑。
大概思路
最终思路是:
- FlClash 继续作为 Android 上唯一的 VPN。
- 普通外网流量按原来的代理规则走。
100.64.0.0/10这段 Tailscale 地址走 mihomo 内置的 Tailscale 出站。- 局域网地址,比如
192.168.0.0/16,继续直连。
也就是把 Tailscale 当成一个代理节点来用,而不是再单独开官方 Tailscale App。
我这里用的是 FlClash,版本是 0.8.93
Tailscale 出站配置
核心配置是一个 type: tailscale 的 proxy:
yaml
proxies:
- name: TAILSCALE
type: tailscale
hostname: flclash-android
auth-key: tskey-auth-xxxx
control-url: https://controlplane.tailscale.com
state-dir: ./tailscale
ephemeral: false
udp: true
accept-routes: true
ip-version: ipv4-prefer这里有几个字段比较关键:
hostname:这个设备在 Tailscale 里显示的名字。auth-key:Tailscale 的授权 key,这个不要公开。state-dir:Tailscale 本地状态目录,后面踩坑主要就在这里。accept-routes:是否接受 Tailscale 路由,我这里先开着。
规则配置
然后需要在规则里把 Tailscale 网段放到前面:
yaml
proxy-groups:
- name: Tailscale
type: select
proxies:
- TAILSCALE
- DIRECT
rules:
- IP-CIDR,100.64.0.0/10,Tailscale,no-resolve
- IP-CIDR,100.100.100.100/32,Tailscale,no-resolve
- DOMAIN-SUFFIX,ts.net,Tailscale
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,169.254.0.0/16,DIRECT,no-resolve
# 其他代理规则
- MATCH,节点选择这里 100.64.0.0/10 是 Tailscale 使用的 CGNAT 网段,100.100.100.100 是 Tailscale DNS。规则要尽量靠前,不然可能先被其他规则截走。
局域网地址我还是直接放行。比如手机在家里访问 192.168.x.x,就没必要绕 Tailscale。
## 最后
目前这套方案已经能满足我的需求:Android 上只开 FlClash,一个 VPN 同时处理代理和 Tailscale 访问。