把 Tailscale 塞进 FlClash:用覆写脚本实现「订阅刷新不丢配置」
实测环境:FlClash 0.8.94(Android)。整套流程从零走通,脚本可直接复制使用。方法源自 seewhy.me 的这篇文章,本文在它的基础上补了覆写脚本、脚本挂载和验证这几段实践中踩到的坑。
要解决的两个问题
问题一:FlClash 和 Tailscale 在安卓上打架。
Android 同一时间只允许一个 App 占用系统 VPN 通道。FlClash 要用它跑代理,Tailscale 官方 App 也要用它组网,两个不能同时开。上一篇里我的解法是用 work profile 隔出第二个 VPN 槽位、保留官方 App;这篇是另一条路线:好在 FlClash 的内核 mihomo 从 v1.19.25(2026-05-16 发布)起内置了 Tailscale 出站(基于 tsnet,Tailscale 官方的嵌入式库)——FlClash 自己就能作为一个 Tailscale 节点登录 tailnet,官方 App 可以卸载了。
顺便说清楚两条路线怎么选。work profile 的好处是隔离得非常彻底:两边互相不用改任何东西,各跑各的,维护起来最省心 —— 不想折腾,选它就挺好。本文这条路线适合稍微想折腾一下的人,或者不想为此多装一个 Shelter,又或者 work profile 槽位已经被公司 MDM 占用、ROM 压根不支持的情况。
问题二:直接改订阅配置,一刷新就白改。
seewhy.me 那篇文章的做法是手工编辑订阅下载下来的 YAML,往里加 Tailscale 节点和规则。能用,但订阅文件是机场的,每次刷新订阅都会重新下载覆盖,手工改的部分全部丢失。
第二个问题的正解是 FlClash 自带的覆写脚本:一段独立保存的 JavaScript,每次加载或刷新订阅时,FlClash 都会把下载到的配置传进脚本的 main(config) 函数,脚本在内存里追加自己的内容后返回。订阅文件本身永远不被修改,刷新多少次,脚本都会重新套用一遍。Clash Verge 用户对这套机制应该不陌生(那边叫 Merge / Script 覆写)。
版本要求
FlClash ≥ 0.8.93,一步都不能少:type: tailscale 是 mihomo v1.19.25 才有的,而 FlClash 0.8.93(2026-05-29)才更新到带这个功能的内核。0.8.92 及更早的版本,内核发布时间比这个功能的诞生还早,配置写得再对也没用。覆盖安装升级不丢数据,保险起见可以先在「工具」里做个备份。
第一步:申请 Tailscale authkey
打开 Tailscale 管理后台的 Keys 页面 → Generate auth key,几个选项这样勾:
| 选项 | 建议 | 原因 |
|---|---|---|
| Reusable | 开 | 关掉就是一次性 key,首次登录后即作废,之后泄露了也无害。代价是万一 FlClash 数据被清、登录状态丢了,要回后台重新生成一个 —— 这事不常发生,值得换个安心。开着的风险见下方警告 |
| Ephemeral | 关 | 设备离线后不会被自动从 tailnet 移除 |
| Expiration | 默认即可 | key 只在第一次登录时用,之后登录状态持久化在本地(state-dir),key 过期不影响已登录的设备 |
| Pre-approved | 如果你的 tailnet 开了 device approval,勾上 | 否则新设备会卡在待审批状态,看起来就像「配置对了但死活不上线」。注意这种 key 的泄露危害也最大,见下方警告 |
生成后复制 tskey-auth- 开头的完整字符串,它只显示这一次。
authkey 本身是有有效期的(默认 90 天),不过它只在登录那一刻用得上;登录之后设备还有另一层节点密钥的定期过期,到期就得重新认证。省事的做法是:设备连上之后回到后台 Machines 页面,找到这台设备 → 右侧 ⋯ → Disable key expiry,把密钥过期关掉,之后就不用再操心过期这件事了。
第二步:添加覆写脚本
FlClash 里:工具 → 进阶配置 → 覆写脚本 → 新建脚本,粘贴以下内容,把 auth-key 换成你刚生成的 key:
1 | function main(config) { |
几处配置的含义:
hostname:这台设备在 tailnet 里显示的名字,随意改;100.64.0.0/10:Tailscale 给所有节点分配 IP 的网段(CGNAT 段),命中就走 Tailscale 出站;100.100.100.100:Tailscale 的 MagicDNS 解析器地址;ts.net是 MagicDNS 域名后缀 —— 这两条让你可以用机器名而不是 IP 访问节点;- 三条规则插在订阅规则前面,保证 tailnet 流量不会先被机场的规则截走;
- 分组里保留
DIRECT是留个手动逃生口,需要时可以在代理页把 Tailscale 分组切成直连; - mihomo 要求节点名、分组名全局唯一。万一你的订阅里恰好已经有叫
TAILSCALE的节点或叫Tailscale的分组(后面第四步的「预览」里搜一下就知道),把脚本里的这两个名字改成别的再用,三条规则里的分组名记得一起改,否则整份配置会因为重名而不合法。
⚠️ authkey 会明文存在脚本里,认真对待它的泄露面。 脚本不只可能被截图外传,还会跟着 FlClash 的备份文件一起走。而一个 Reusable 的 key 一旦泄露,拿到的人可以反复往你的 tailnet 里注册设备;如果还勾了 Pre-approved,连设备审批都拦不住 ——Tailscale 官方文档专门警告过 reusable key 被盗的风险。所以:
- 本文里的 key 是占位符。你自己的脚本别截图、别发原文,带着真实 key 的备份文件也别外传;
- 如果改用一次性 key(Reusable 关),首次登录成功后 key 即作废,脚本里剩下的只是一段废字符串,之后就不用惦记它了;
- 如果为了省事开了 Reusable(或勾了 Pre-approved),登录成功后建议回 Keys 页面把这个 key 直接 revoke 掉,revoke 不影响已经登录的设备。
第三步:把脚本挂到订阅上(最容易漏的一步)
只把脚本存进脚本库是不会生效的。 FlClash 的覆写是每个订阅独立设置的,且默认模式是「标准」—— 脚本模式必须手动切换:
- 「配置」页 → 你的订阅卡片右上角 ⋮ → 更多 → 覆写;
- 顶部「覆写模式」选 「脚本」;
- 下方列表里点选你刚建的脚本(单选圆点选中);
- 退出页面,FlClash 自动重新应用配置。
我第一次就栽在这里:脚本添加完、版本也升了,怎么都不生效,最后发现订阅还停在默认的「标准」模式,脚本从头到尾没被执行过。
第四步:验证
按顺序检查,每一步验证的东西不一样:
- 脚本执行了没:覆写页右上角(或订阅卡片菜单里)的「预览」显示的是脚本处理后的最终配置,在里面能搜到
tailscale就是铁证; - 代理页出现 Tailscale 分组:订阅里本来没有这个分组,它只可能来自脚本;
- 登录成功了没:管理后台 Machines 页面 里出现
flclash-android并显示在线(看不到的话,先做第 4 步再回来看,原因见下); - 链路通不通:手机上直接访问 tailnet 里任意一台机器的
100.xIP(比如 SSH 或某个内网服务); - 刷新不丢:手动刷新一次订阅,回代理页确认 Tailscale 分组还在 —— 这就是覆写脚本相对手改订阅文件的全部意义。
第 3 步有一个容易误判的实测行为:这个出站是按需连接的。光把 VPN 开着、覆写脚本挂好,它并不会自动登上 tailnet—— 只有真的有流量命中 Tailscale 规则(比如在终端里 SSH 一台内网机器)时,后台才会显示这个客户端的状态。所以「后台看不到设备」不一定是配置错了,先发起一次真实访问再下结论。(2026 年 8 月在 FlClash 0.8.94 上实测如此,之后的版本不确定会不会变。)
排除掉上面这条之后,设备还是一直不上线,优先怀疑 authkey:过期了没用过、或者 tailnet 开了 device approval 但 key 没勾 pre-approved—— 这两种情况配置全对,卡在授权上。
已知限制:只出站,进不来
mihomo 的这个 Tailscale 集成是一个代理出站节点:流量命中规则才从手机走出去,官方文档也只把它描述为和其他协议并列的可选代理节点,没有提供任何入站能力。所以:
- 手机访问 tailnet 里的设备(SSH 回家、连 NAS):可以,本文全部内容都是这个方向;
- tailnet 里的其他设备反向访问这台手机(Taildrop 传文件、SSH 进手机):不行;
- 如果需要手机被反向访问,还是得跑官方 App,用上一篇的 work profile 方案让它和 FlClash 并存。
这个限制和 Surge 内置的 Tailscale policy 是一样的 —— 凡是「代理软件以出站节点身份加入 tailnet」的路线,都只有出站这一个方向。
参考
- Integrating Tailscale with FlClash on Android — seewhy.me(原始思路,本文的起点)
- mihomo Tailscale 出站配置文档
- mihomo v1.19.25 Release(Tailscale 出站首次加入)
- FlClash
- Tailscale 与代理软件共存:手机远程 SSH 到无公网 IP 的 Mac(上一篇,work profile 路线)