Lazy loaded image
🛜OpenWrt 上让 Tailscale + OpenClash 完美共存:在外也能享受家里分流
字数 2907阅读时长 8 分钟
2026-6-22
2026-6-22
目标很简单: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 分流架构图
Tailscale 与 OpenClash 分流架构图
两者职责分工如下:
  • Tailscale:负责设备互联、穿透和安全隧道
  • OpenClash:负责 DNS、Fake-IP、TUN 和规则分流
  • 策略路由:负责把 Tailscale 网段和 Clash 流量边界划清
只要路由优先级处理好,Tailscale 和 OpenClash 并不会互相冲突。

准备工作

开始前,请确认你已经具备以下环境:
  1. OpenWrt 已安装并正常运行 OpenClash
      • 推荐模式:Fake-IP + TUN
      • 已能正常按规则分流上网
  1. OpenWrt 已安装并登录 Tailscale
  1. 已开启 Tailscale MagicDNS
  1. 知道你的 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/10tailscale 接口。
这一步完成后,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:

总结

这套方案的关键只有三点:
  1. DNS 分流:用 Tailscale MagicDNS 处理 Tailnet 域名,避免被 Fake-IP 接管
  1. 策略路由:用高优先级规则让 100.64.0.0/10 优先走 tailscale0
  1. 启动顺序:让 OpenClash 先完成初始化,再启动 Tailscale
最终形成的效果是:
Tailscale 把你带回家,OpenClash 在家门口继续按规则分流。
只要 DNS、路由优先级和启动顺序处理好,Tailscale + OpenClash 就可以稳定共存。人在外面,也能继续享受家里的网络环境。
上一篇
用 Docker 部署 Tailscale DERP,并用 NPM 反代 + 伪装(端口安全策略)
下一篇
CloudFlare 单域名 SaaS 优选实战指南 | 全托管零成本提速