小型网络系列:LAG、VLAN 和 Macvlan 为什么会一起出现
系列导航
- 小型网络系列:开篇 - 300-500 Devices 的网络为什么也会复杂
- 小型网络系列:RouterOS 和 Switch 的职责边界
- 小型网络系列:LAG、VLAN 和 Macvlan 为什么会一起出现
- 小型网络系列:PCC 分流逻辑和故障行为
- 小型网络系列:WireGuard 为什么是日常路径
- 小型网络系列:脚本、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 上看到 vlan10、vlan20、vlan30。
那为什么还要 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
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 上
bonding1、br-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。