Homelab 网络系列:RouterOS 主网关和 WRT 旁路由为什么要分工

系列导航

  1. Homelab 网络系列:开篇 - 家庭网络为什么会变复杂
  2. Homelab 网络系列:RouterOS 主网关和 WRT 旁路由为什么要分工
  3. Homelab 网络系列:透明代理 VIP、VRRP 和 Fallback DNS
  4. Homelab 网络系列:NetBird ACL:Mobile Devices / MacBook 如何访问 Homelab / Hometown / Office 网络
  5. Homelab 网络系列:Backup Path:ZeroTier P2P 和 Sing-box Inbound 为什么还留着
  6. Homelab 网络系列:自动化和可恢复性:订阅生成、健康检查、配置同步、回滚

背景

上一篇说到,Homelab 网络最后变复杂,不是因为一开始想把事情做复杂,而是需求慢慢超过了普通家庭路由器能舒服承载的范围。

这一篇只讲其中一个拆分:为什么我最后让 RouterOS 做主网关,让 WRT 做旁路由,而不是把所有东西都塞到其中一边。

现在这套网络里,RouterOS 和 WRT 的分工大概是这样:

  • RouterOS 负责主网关、DHCP、NAT、WAN/LAN 边界、公网入口 Hairpin、主要国内访问兜底
  • WRT 负责海外访问分流、Sing-box、NetBird Peer、透明代理 VIP、部分跨站路由
  • 普通设备默认只依赖 RouterOS
  • 需要策略能力的设备,才通过 DHCP Option-set 走到 WRT 这层

这个拆分看起来多了一台设备和一堆联动,但核心目标其实很朴素:日常主要网络要稳,工作、管理和个人海外访问偏好可以作为额外层存在。

全塞到 WRT 的阶段

最早我用 OpenWrt / ImmortalWrt 承载过几乎所有东西。

它可以拨号,可以 NAT,可以跑 DNS,可以跑代理,也可以跑各种 Overlay Peer。对个人网络来说,这种方案的吸引力很强:

  • 配置入口集中
  • 软件生态足够丰富
  • 调整代理、DNS、VPN 都很方便
  • 机器少,拓扑也短

如果只是一个人用,或者只是做一个很轻量的家庭旁路由,这样完全可以。

但 Homelab 一旦承载了更多基础服务,它的问题就开始明显了。WRT 上的能力太“活”了:代理订阅会更新,Sing-box 会升级,NetBird 会变更 Peer 和 Route,DNS 策略也会经常跟着业务调。

这些东西本身都不是问题。真正的问题是,它们不应该和“全家正常上网”绑在同一个故障域里。

比如:

  • 代理配置生成错了,不应该影响普通设备上网
  • Overlay Route 调试错了,不应该影响默认出口
  • DNS 策略变更,不应该把公网服务入口一起改坏
  • WRT 升级或重启,不应该让主网关也跟着失效

所以全塞到 WRT 的方案,后面最大的问题不是性能,而是职责太混。

为什么需要 WRT 这层额外能力

另一个方向也很自然:既然 RouterOS 已经是主网关,那能不能把所有东西都放在 RouterOS 上?

RouterOS 做路由、NAT、防火墙、DHCP 都很强,而且稳定。主网关已经掌握了所有流量入口,在它上面做规则,路径最短,排查也直观。

但我现在并不希望 RouterOS 变成一个“全能应用网关”。它在这套网络里的角色,是稳定主网关和主要国内访问兜底,而不是直接承载所有海外分流、Overlay 管理和代理策略。

WRT 这层额外能力解决的是另一类问题:

  • Sing-box Gateway 配置、订阅生成和规则集会频繁变化
  • NetBird Peer 和站点路由属于 Admin Overlay,不应该污染普通默认出口
  • VRRP 和健康检查是为了让海外分流失败时可以降级,而不是让主网关一起失败
  • ZeroTier、Sing-box Inbound 这类 Backup Path 也更适合放在可替换的旁路层
  • 日志、包管理、Nftables、脚本调试都更接近普通 Linux 习惯

这些能力更像应用层或系统层组件。它们需要包管理、文件模板、脚本、日志、版本升级和较快的回滚节奏。WRT 做这些事情明显更顺手。

更重要的是,WRT 这层的失败应该是有边界的。

最坏情况下,NetBird、ZeroTier、Sing-box、WRT 这层全部失效,受影响的应该是额外能力:

  • Mobile Devices / MacBook 在外面的管理入口
  • 跨站点 Overlay 访问
  • 海外访问分流和个人偏好策略
  • 依赖代理 VIP 的策略客户端

而不是所有普通设备的日常主要访问。

RouterOS 更适合做边界和控制面:

  • 谁是默认网关
  • 哪些客户端属于哪个 DHCP 策略组
  • 公网入口的 DNAT / Hairpin 怎么走
  • Fallback 时要不要让代理 VIP 回到普通 LAN/WAN 出口
  • 哪些 RouterOS 脚本是稳定、可审计、可回滚的

换句话说,RouterOS 适合回答“基础网络还能不能正常工作”,WRT 适合承载“哪些设备需要额外策略能力”。这不是 RouterOS 做不了,而是我不希望快变化的海外分流和 Overlay 管理,变成主网关的核心风险。

当前分工

现在 Homelab 的分工是把基础网络和策略网络拆开。

普通设备走 RouterOS:

  • DHCP 拿到普通默认网关 10.1.1.1
  • DNS 使用普通 LAN 策略,Upstream 是 10.1.1.100 上的 AdGuardHome
  • 出口 NAT 和防火墙都在 RouterOS 上完成
  • 日常主要国内访问由 RouterOS 兜底
  • WRT 故障不会直接影响这类设备

需要透明代理的设备走 WRT:

  • DHCP Option-set 下发代理 VIP 10.1.1.253 作为默认网关和 DNS
  • VIP 正常由 WRT 10.1.1.254 持有
  • WRT 后面是 Sing-box DNS / TUN / Route Policy,DNS Backend 是 10.1.1.254:53
  • 只有被归入这个策略组的设备才进入这条路径

需要跨站访问的设备再多一层:

  • 默认网关和 DNS 仍然走代理 VIP
  • NetBird / Site Route 通过 DHCP Classless Route 下发
  • 特定远端网段直接指向 WRT,而不是让 RouterOS 假装自己理解 Overlay 内部状态

这里的关键不是“所有设备都走代理”,而是不同设备进入不同策略组。RouterOS 负责分组和下发,WRT 负责执行变化更快的策略。

VIP 和 Fallback 是这条边界的接口

RouterOS 和 WRT 的交界点,是一个代理 VIP。

正常情况下,WRT 10.1.1.254 持有 10.1.1.253 这个 VIP。代理客户端看到的是一个稳定的网关和 DNS 地址,背后实际由 WRT 上的 Sing-box 接住;也就是客户端目标是 10.1.1.253,健康 Backend 是 10.1.1.254

当 WRT 的基础健康检查失败时,VIP 可以回到 RouterOS 10.1.1.1。这个 Fallback 并不等价于完整的代理能力,它只是保留一个普通 LAN/WAN 出口,让客户端不至于因为 WRT 故障完全断网。DNS 这部分会被 RouterOS 的 Firewall Redirect 转到 10.1.1.100 上的 AdGuardHome,因此 Fallback 后仍然和普通客户端共用同一套 LAN DNS 语义和 Cache。

这里有一个取舍:Fallback 不是为了让所有能力无感恢复,而是为了让故障影响范围变小。

我更关心的是:

  • Sing-box 挂了,代理客户端至少还能普通出网
  • WRT 重启时,普通客户端不受影响
  • NetBird / ZeroTier 出问题时,只影响管理和 Backup Path
  • Fallback DNS 能回到本地解析器,但不承担公网服务入口改写
  • VIP 的拥有权切换能通过健康检查验证,而不是靠人工记忆

后面会单独写 VIP、VRRP 和 Fallback DNS。这里先把它当成 RouterOS / WRT 分工之间的接口来看。

公网入口为什么仍然归 RouterOS

这个拆分里还有一个容易混的点:公网入口不在 WRT 的透明代理层里解决。

Homelab 有一些服务需要从外面访问,也需要在 LAN 内用同一套公网视角访问。这里我没有把它做成“内网 DNS 改写到内网地址”,而是让 RouterOS 继续负责公网入口的 DNAT 和 LAN Hairpin。

原因是 DNS 只认识名字,但入口问题不只看名字。

同一个域名可能有不同端口,不同端口可能落到不同后端,有的走 HTTP(S) 入口,有的不是 HTTP(S)。把这些都交给 DNS Rewrite,会把问题压扁成“名字到地址”的映射,后面很难维护。

RouterOS 在这里更合适:

  • WAN 访问走公网入口 DNAT
  • LAN 内访问同一公网入口时走 Hairpin
  • 后端回复路径由 Hairpin SNAT 保证回到 RouterOS
  • DNS 视角保持一致,不需要为了 LAN 访问维护另一份公网服务 Rewrite

所以 WRT 可以负责透明代理 DNS,但公网服务入口仍然应该留在 RouterOS 的边界 NAT 里。

被刻意留下来的复杂度

这个设计不是无成本的。

它留下了几类复杂度:

  • DHCP Option-set 要维护普通、代理、跨站几类客户端
  • VIP 健康检查要足够严格,但不能因为慢探测频繁误切
  • NetBird Route 需要和 DHCP Classless Route 同步
  • RouterOS 和 WRT 都要保留各自的回滚路径
  • 文档里必须明确哪些能力属于主网关,哪些属于旁路

这些复杂度不适合隐藏。隐藏之后,下一次排障时还是会回来。

我更倾向于把它们变成明确的边界:

  • RouterOS 是稳定边界
  • WRT 是策略执行层
  • PVE 是承载层
  • DNS 不负责公网入口分流
  • NetBird 是 Admin Overlay,不是普通客户端的默认出口

边界清楚之后,即使组件多,排障时也知道先问哪个问题。

最后的结论

RouterOS 和 WRT 分工的核心,不是“哪个系统更强”,而是把不同变化速度的东西放在不同位置。

RouterOS 负责慢变化的网络底座:主网关、NAT、DHCP、Hairpin、公网入口和可审计脚本。

WRT 负责快变化的策略能力:Sing-box、NetBird、透明代理、健康检查和备用路径。

这样做不会让 Homelab 网络变简单,但它能让故障域更清楚。主网关保持稳定,旁路能力可以升级、重启、替换;当旁路失败时,最多降级成普通网络,而不是把整个家庭网络一起带走。

后面继续拆透明代理 VIP、VRRP 和 Fallback DNS。那一层才是真正把“旁路可以失败,但不要把客户端完全断网”落到实现里的部分。