小型网络系列:LAG、VLAN 和 Macvlan 为什么会一起出现

系列导航

  1. 小型网络系列:开篇 - 300-500 Devices 的网络为什么也会复杂
  2. 小型网络系列:RouterOS 和 Switch 的职责边界
  3. 小型网络系列:LAG、VLAN 和 Macvlan 为什么会一起出现
  4. 小型网络系列:PCC 分流逻辑和故障行为
  5. 小型网络系列:WireGuard 为什么是日常路径
  6. 小型网络系列:脚本、Scheduler 和可恢复性

背景

如果只看名词,LAG、VLAN、Macvlan 很容易让人以为这是在做一套“企业级网络隔离”。

Office-JT 当前不是这么用的。

这里的核心问题更朴素:

  • 当前已经是 3 条 WAN Source 从 Switch 侧接入
  • 后续还要预留继续增加 Modem 的可能
  • RouterOS CHR 在 PVE Host 里,需要通过 Switch Port 扩展有限的有线网口能力
  • 两个 1G 电口最多提供 2G 全双工的 WAN UP/DOWN 承载空间
  • 单条链路不能既承担所有 LAN,又承担多条 WAN 的物理上限和扩展需求
  • RouterOS 还需要让不同 WAN Path 拥有独立 L2 身份

所以最后才会同时出现:

  • LAG1 / bonding1
  • VLAN 10 / 20 / 30
  • macvlan10 / macvlan20 / macvlan30

它不是为了让拓扑看起来高级,而是为了解决物理链路、WAN 复用和 RouterOS 接口语义的问题。

Bonding 不只是冗余

很多时候提到 Bonding,第一反应是“冗余”。

这里当然也有冗余价值:两根 1G 物理链路组成 LAG1,少一根至少不至于整个 RouterOS 到 Switch 的承载直接断掉。

但它还有一个更现实的原因:当前实际已经是 3 条 WAN 接入,多条 WAN 的实际带宽叠起来会超过单个 1G 电口。

如果所有 LAN、WAN Source、PCC 出口都挤在一根 1G 物理链路上,理论拓扑再清楚,实际吞吐也会先撞到物理口上限。LAG1 提供的是 2x1G 的承载空间,也就是最多 2G 全双工的 WAN UP/DOWN 余量,让多客户端、多连接、多 WAN 场景有更大的总带宽空间。

这里也要说清楚:LAG 不是让单条 TCP 连接自动变成 2G。

它更适合解决多客户端、多连接、多 WAN 并发时的总吞吐和链路余量。对 300-500 Devices 的办公室网络来说,这个收益比“看起来多一根线”实在得多。

还有一层原因是扩展。

RouterOS CHR 跑在 PVE Host 里,PVE Host 的有线网口数量有限,不可能为每个 Modem 都准备一根独立直连物理线。把 Modem 接入 Managed Switch,再用 VLAN / LAG 送到 RouterOS,相当于用 Switch Port 扩展 PVE Host 的有线接入面,也给后续继续增加 Modem 留了空间。

VLAN 在这里不是部门隔离

当前 VLAN 表可以简化成这样:

VLAN 名称 / 角色 用途
1 System-VLAN 普通 LAN 和基础管理承载
10 ppp1 route1 / PPPoE WAN Source
20 pcc2 route2 WAN Source
30 pcc3 route3 WAN Source

这张表里没有“研发部 VLAN”“财务 VLAN”“访客 VLAN”。

原因上一篇已经说过:当前公司环境比较宽松,管理目标是稳定、可理解、可恢复,而不是一上来就做细粒度部门隔离。VLAN 先服务接入问题,而不是组织结构。

LAN 侧 192.168.8.0/21 这个大子网也是同一个取舍。它是延续了快 10 年的初始设计,不是严格规划出来的广播域模型。真正在网设备大概 300-500 Devices,还没逼到必须把地址规划、部门 VLAN、广播域治理一起重做。说白了,也有一部分就是懒得改。

更具体地说,VLAN 做了两件事:

  • 把不同 WAN Source 从 Switch 侧 Access Port 带到 RouterOS
  • 让这些 WAN Source 可以复用同一个 LAG1 / bonding1 承载

也就是说,VLAN 是 WAN Carrier,不是部门边界。

Macvlan 解决什么

有了 VLAN,RouterOS 已经能在 bonding1 上看到 vlan10vlan20vlan30

那为什么还要 Macvlan?

因为不同 WAN Path 需要独立的 L2 / MAC 身份。

Office-JT 的接口关系可以抽象成这样:

Switch VLAN RouterOS Interface Route Role
10 vlan10 -> macvlan10 -> pppoe-out1 route1 / pcc1
20 vlan20 -> macvlan20 route2 / pcc2
30 vlan30 -> macvlan30 route3 / pcc3

文章里不应该放真实 MAC,也不应该放公网地址。这里真正重要的是接口层级:

  • VLAN 负责把 WAN Source 分开带进 RouterOS
  • Macvlan 负责给每条 WAN Path 独立 L2 身份
  • PCC 再按 route1 / route2 / route3 使用这些路径

没有 Macvlan 时,多个 WAN 身份都压在同一个父接口语义上,后面做 PPPoE、静态 WAN、PCC 标记和排障都会更别扭。

拓扑展开

这张图只画公共安全的角色名和 LAN 地址,不画公网 IP、真实域名和 MAC:

flowchart LR
  wan1["WAN Source
route1 / PPPoE"] wan2["WAN Source
route2"] wan3["WAN Source
route3"] switch["Managed Switch
192.168.8.90"] lag["LAG1
2x1G Full-Duplex Carrier"] ros["RouterOS CHR
192.168.8.1"] lan["Office LAN
192.168.8.0/21"] wan1 -->|Access VLAN 10| switch wan2 -->|Access VLAN 20| switch wan3 -->|Access VLAN 30| switch switch --> lag lag -->|bonding1| ros ros -->|br-lan on bonding1| lan ros -->|vlan10 -> macvlan10 -> pppoe-out1| wan1 ros -->|vlan20 -> macvlan20| wan2 ros -->|vlan30 -> macvlan30| wan3
flowchart LR
  wan1["WAN Source
route1 / PPPoE"] wan2["WAN Source
route2"] wan3["WAN Source
route3"] switch["Managed Switch
192.168.8.90"] lag["LAG1
2x1G Full-Duplex Carrier"] ros["RouterOS CHR
192.168.8.1"] lan["Office LAN
192.168.8.0/21"] wan1 -->|Access VLAN 10| switch wan2 -->|Access VLAN 20| switch wan3 -->|Access VLAN 30| switch switch --> lag lag -->|bonding1| ros ros -->|br-lan on bonding1| lan ros -->|vlan10 -> macvlan10 -> pppoe-out1| wan1 ros -->|vlan20 -> macvlan20| wan2 ros -->|vlan30 -> macvlan30| wan3
flowchart LR
  wan1["WAN Source
route1 / PPPoE"] wan2["WAN Source
route2"] wan3["WAN Source
route3"] switch["Managed Switch
192.168.8.90"] lag["LAG1
2x1G Full-Duplex Carrier"] ros["RouterOS CHR
192.168.8.1"] lan["Office LAN
192.168.8.0/21"] wan1 -->|Access VLAN 10| switch wan2 -->|Access VLAN 20| switch wan3 -->|Access VLAN 30| switch switch --> lag lag -->|bonding1| ros ros -->|br-lan on bonding1| lan ros -->|vlan10 -> macvlan10 -> pppoe-out1| wan1 ros -->|vlan20 -> macvlan20| wan2 ros -->|vlan30 -> macvlan30| wan3

这个图里最反直觉的地方,是 bonding1 同时和 LAN / WAN 有关系。

它不是一个简单的“WAN 口”或“LAN 口”,而是一个复用承载。基础 bonding1 进入 br-lan,让 LAN 继续存在;WAN 则通过 VLAN 子接口从同一条承载上剥离出来。

这也是这套设计看起来复杂的原因之一。

这个取舍的成本

这套设计不是无成本。

它的成本主要有几个:

  • Switch Port、PVID、VLAN Membership 必须记录清楚
  • RouterOS 上 bonding1br-lan、VLAN、Macvlan 的层级不能混
  • 出问题时要先判断是物理承载问题,还是 RouterOS 路由策略问题
  • 后续如果真的要做部门 VLAN 隔离,不能简单复用现在的 WAN VLAN 语义
  • LAG 的 Hash 行为不是“所有流量平均 2G”,更不是单条 TCP 连接变 2G,需要避免过度期待

但它换来的东西也很实际:

  • 多条 WAN 不需要为每条都拉一条独立 RouterOS 物理口
  • RouterOS 到 Switch 的总承载空间更大
  • PVE Host 不需要为了后续 Modem 扩展继续消耗物理网口
  • route1 / route2 / route3 有清楚的接口语义
  • PCC 能围绕这些 Route Role 做分流
  • 后续排障时可以按层拆开看

这就是小型网络里经常出现的取舍:它不是标准化得很漂亮,但它解决了当时最具体的物理和容量问题。

最后的结论

Office-JT 里的 LAG、VLAN 和 Macvlan 是一组配套设计。

LAG 解决 Switch 到 RouterOS 的 2x1G 全双工承载空间和冗余,VLAN 解决当前 3 条 WAN Source 复用同一条承载,也给后续 Modem 扩展留空间,Macvlan 解决每条 WAN Path 的独立 L2 身份。

它们不是部门隔离方案,也不是企业网络模板。

它们只是让 RouterOS 能在有限物理条件下,稳定拿到多条 WAN,并把这些 WAN 交给后面的 PCC 使用。

后面继续写 PCC 分流逻辑和故障行为。LAG / VLAN / Macvlan 只是把路径送到 RouterOS;真正决定新连接走哪条 WAN 的,是 PCC。