目标很简单:Tailscale 负责把你安全带回家,OpenClash 负责继续按规则分流。这样人在外面,也能像在家一样访问内网、使用代理和管理设备。
背景:为什么要把 Tailscale 和 OpenClash 放在一起用?
Tailscale 很适合远程组网。它不需要公网 IP,也不需要端口映射,手机、电脑、软路由登录同一个 Tailnet 后,就能像在同一个内网里一样互相访问。
但如果只依赖 Tailscale 的 Exit Node,会遇到一个现实问题:流量策略太粗。
- 开启 Exit Node 后,公网流量全部走出口节点
- 不开启 Exit Node,又无法把外部设备的上网流量带回家
- 如果出口在国内,访问海外服务可能不顺
- 如果出口在海外,访问国内服务又可能绕路
而家里的 OpenWrt 已经通过 OpenClash 实现了成熟的分流:国内直连,国外代理,局域网设备统一受益。
所以更理想的方案是:
Tailscale 只负责“回家”,OpenClash 继续负责“怎么上网”。
最终效果是:人在外面连回家后,依然沿用家里 OpenClash 的规则分流,而不是在“全局代理”和“全局直连”之间二选一。
最终效果
配置完成后,可以实现:
- 在家:LAN 设备继续正常走 OpenClash 分流
- 在外:手机或电脑通过 Tailscale 连回家,再交给 OpenClash 分流
- 不需要公网 IP
- 不需要端口映射
- LAN 设备可以直接访问 Tailnet 节点
- 外部设备可以访问家里的 NAS、电脑、软路由等内网服务
- 可以在外用 Termius、SSH、tmux 远程控制家中设备
整体体验就是:人在外面,网络环境仍然像在家里。

整体架构

两者职责分工如下:
- Tailscale:负责设备互联、穿透和安全隧道
- OpenClash:负责 DNS、Fake-IP、TUN 和规则分流
- 策略路由:负责把 Tailscale 网段和 Clash 流量边界划清
只要路由优先级处理好,Tailscale 和 OpenClash 并不会互相冲突。
准备工作
开始前,请确认你已经具备以下环境:
- OpenWrt 已安装并正常运行 OpenClash
- 推荐模式:Fake-IP + TUN
- 已能正常按规则分流上网
- OpenWrt 已安装并登录 Tailscale
- 已开启 Tailscale MagicDNS
- 知道你的 Tailnet 域名,例如:
后文示例里会使用以下信息,请根据自己的实际情况替换:
第一步:配置 OpenClash DNS,避免 Tailnet 域名被 Fake-IP 接管
OpenClash 的 Fake-IP 很好用,但它可能会把 Tailscale 的 MagicDNS 域名也处理掉,导致 Tailnet 设备域名解析异常。
因此第一步要做的是:让 Tailscale 相关域名交给 Tailscale DNS 处理。
打开 OpenClash 管理界面:
1.1 开启第二 DNS 服务器
把第二 DNS 服务器设置为:
这是 Tailscale 内置的 MagicDNS 服务器。它负责解析 Tailnet 内部设备域名,例如:
这样 OpenClash 遇到 Tailnet 域名时,就可以交给 Tailscale DNS 解析,而不是让 Fake-IP 抢答。
1.2 添加第二 DNS 域名列表
在「第二 DNS 服务器域名列表」中添加你的 Tailnet 设备完整域名。
示例:
注意:这里通常不支持
*.ts.net 这种通配符写法,建议把需要访问的设备域名逐个列出来。1.3 添加 Fake-IP 过滤
在「Fake-IP 过滤」中添加:
这一步的作用是兜底:强制 Tailscale 相关域名不进入 Fake-IP 机制,避免出现域名能解析但访问异常的问题。
配置完成后,保存并重启 OpenClash。
第二步:调整启动顺序,让 OpenClash 先启动
Tailscale 和 OpenClash 都会操作路由、DNS 和防火墙规则。为了减少启动时互相覆盖的概率,建议让 OpenClash 先启动,Tailscale 稍后再启动。
编辑 Tailscale 启动脚本:
在
start() 函数开头加入延迟:如果你的设备启动较慢,或者 OpenClash 初始化时间较长,可以把延迟改成 20 秒:
然后重新启用并重启 Tailscale:
这一步的目的不是“玄学延迟”,而是让 OpenClash 先完成 iptables、TUN 和策略路由初始化,避免 Tailscale 的规则抢在前面生效。
第三步:添加高优先级策略路由,隔离 Tailscale 网段
这是整套方案里最关键的一步。
Tailscale 默认使用
100.64.0.0/10 这个 CGNAT 网段。如果这部分流量被 OpenClash 接管,就可能出现 Tailnet 节点无法访问、域名解析正确但连接失败、LAN 设备访问 Tailnet 异常等问题。所以我们要明确告诉 OpenWrt:
凡是去100.64.0.0/10的流量,优先走tailscale接口,不要交给 Clash。
编辑网络配置:
在
config interface 'tailscale' 后面添加以下内容:如果你的 OpenWrt 版本或 LuCI 页面没有
table 字段,也可以按实际系统能力调整,但核心原则不变:100.64.0.0/10必须走 Tailscale 接口
- 这条规则的优先级必须高于 OpenClash 插入的策略规则
priority数字越小,优先级越高
这里使用:
是为了让它排在 Clash 常见的
1000+ 优先级规则之前。重启网络:
验证规则是否生效:
正常情况下应该看到类似结果:
继续检查 table 200:
应该能看到
100.64.0.0/10 走 tailscale 接口。这一步完成后,Tailscale 网段和 OpenClash 的代理流量就被清晰分开了。
第四步:配置 OpenWrt 上的 Tailscale
在 OpenWrt SSH 中执行:
请把
192.168.100.0/24 替换成你自己的 LAN 网段。参数说明
tailscale down先断开当前 Tailscale 连接,避免旧参数残留影响后续配置。
--advertise-routes=192.168.100.0/24把家里的 LAN 网段广播给 Tailnet。这样其他 Tailscale 设备就可以通过 OpenWrt 访问家里的内网设备,例如 NAS、台式机、Home Assistant 等。
--advertise-exit-node把 OpenWrt 声明为 Exit Node。外部设备可以选择它作为互联网出口。
--accept-routes允许 OpenWrt 接收其他 Tailscale 节点广播的路由,方便实现更完整的双向互访。
--accept-dns=false不要让 Tailscale 接管 OpenWrt 的系统 DNS。DNS 仍然交给 OpenClash 处理,再通过第二 DNS 处理 Tailnet 域名,避免两套 DNS 机制互相覆盖。
--ssh开启 Tailscale SSH,方便通过 Tailnet 访问 OpenWrt。是否能登录仍然受 Tailscale ACL 控制。
--reset重置未显式指定的参数,避免之前配置过的非默认参数继续残留。遇到
requires mentioning all non-default flags 报错时,这个参数尤其有用。第五步:在 Tailscale 后台批准路由和 Exit Node
命令行只是“申请”广播路由和 Exit Node,真正生效还需要在 Tailscale 管理后台批准。
打开:
找到你的 OpenWrt 设备,例如
h28k,然后进入:确认并启用:
192.168.100.0/24子网路由
- Exit Node
Tailscale 这样设计是出于安全考虑:设备不能单方面把自己变成网关或出口,必须由管理员在后台确认。
第六步:外部设备使用家里的 OpenWrt 作为 Exit Node
在手机或电脑上执行:
请把
100.83.69.105 替换成你家 OpenWrt 的 Tailscale IP。参数说明
--exit-node=100.83.69.105指定家里的 OpenWrt 作为 Exit Node。外部设备的公网流量会先进入 Tailscale 隧道,再到家里的 OpenWrt。
--exit-node-allow-lan-access开启 Exit Node 后,保留访问本地局域网的能力。
这个参数很重要。否则你在外面开启 Exit Node 后,可能会发现能上网,但访问
192.168.100.x 这类家里内网地址不正常。典型场景:
验证配置是否成功
在 OpenWrt 上检查
查看 Tailscale 状态:
查看策略路由:
确认存在:
查看 table 200:
测试访问 Tailnet 节点:
也可以测试 Tailnet 域名:
在外部设备上检查
开启 Exit Node 后,依次验证:
- 访问
http://192.168.100.1:能打开 OpenWrt 管理页
- 访问
https://ip.sb:显示家里的公网 IP
- SSH 到
192.168.100.x:能连接家里的电脑或 NAS
- 访问 Google 等海外服务:能通过家里的 OpenClash 规则正常分流
如果以上都正常,说明这套方案已经跑通。
流量路径梳理
外部设备访问公网
LAN 设备正常上网
LAN 设备访问 Tailnet
这就是整套配置的核心边界:
tailscale0负责 Tailnet,OpenClash TUN 负责公网分流。两边通过策略路由分开,各走各的路。
常见问题
1. 开机后一段时间才恢复正常分流,怎么办?
把
/etc/init.d/tailscale 里的延迟调大一些,例如:如果 OpenClash 启动较慢,可以继续增加。
2. Tailnet 域名解析失败怎么办?
重点检查两处:
同时确认 Tailnet 设备域名已经加入第二 DNS 域名列表。
3. 外部设备无法使用 Exit Node 怎么办?
检查 Tailscale 后台是否已经批准:
- 子网路由
- Exit Node
命令行执行
--advertise-exit-node 只是申请,不代表已经生效。4. tailscale up 提示 requires mentioning all non-default flags 怎么办?
在命令末尾加上:
例如:
5. 想临时关闭 OpenWrt 的 Exit Node 怎么办?
在 OpenWrt 上执行:
外部设备清除 Exit Node:
总结
这套方案的关键只有三点:
- DNS 分流:用 Tailscale MagicDNS 处理 Tailnet 域名,避免被 Fake-IP 接管
- 策略路由:用高优先级规则让
100.64.0.0/10优先走tailscale0
- 启动顺序:让 OpenClash 先完成初始化,再启动 Tailscale
最终形成的效果是:
Tailscale 把你带回家,OpenClash 在家门口继续按规则分流。
只要 DNS、路由优先级和启动顺序处理好,Tailscale + OpenClash 就可以稳定共存。人在外面,也能继续享受家里的网络环境。
- 作者:Cheng
- 链接:https://0rz.li/%E8%B7%AF%E7%94%B1%E5%99%A8%E4%B8%8E%20OpenWrt/openwrt-tailscale-openclash-split-routing
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。


