avatar🌌
seewhyseewhy的小木屋

宠辱不惊,看庭前花开花落。 去留无意,望天空云卷云舒。

在 FlClash Android 中使用 Tailscale

背景

最近在整理手机上的代理配置,碰到一个问题: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 访问。

Docker 部署 Nowledge Mem 时绕过设备限制跑通 ChatGPT MCP OAuth
we-mp-rss 的自动化扫码登录方案
Valaxy v0.28.11 驱动|主题-Yunv0.28.11