很多人第一次学 VLAN 互通时会遇到一个“拧巴”的问题:

  • VLAN 是二层隔离,交换机负责转发

  • 不同 VLAN 要互通,需要三层转发(路由器)

  • 但路由器端口不够怎么办?

于是就有了经典方案:单臂路由(router-on-a-stick)+ VLAN。它的核心不是“神奇路由”,而是把 VLAN 标签(tag)当作“身份识别”,让同一条物理链路同时承载多个 VLAN 的三层入口。


1. 先从“端口不够”讲起:为什么要单臂路由?

假设你有两个 VLAN:

  • VLAN 10:192.168.10.0/24

  • VLAN 20:192.168.20.0/24

互通需要路由器做网关。最直观的做法是:

方案 1:每个 VLAN 用路由器一个口(多口三层)

  • 路由器口 A 接 VLAN 10 网段

  • 路由器口 B 接 VLAN 20 网段

优点:直观、没有 VLAN tag 的复杂度
缺点:路由器口越来越不够、布线越来越麻烦。

方案 2:单臂路由(router-on-a-stick)

  • 路由器只用一个物理接口

  • 交换机到路由器这条链路变成 Trunk(中继)

  • VLAN 通过 802.1Q 标签携带过去

  • 路由器再用**子接口(sub-interface)**分别处理 VLAN 10、VLAN 20

一句话总结:

单臂路由用“标签 + 子接口”把多 VLAN 的三层入口塞进同一条物理口里。


2. VLAN 与路由器到底“怎么配合”?关键概念拆解

2.1 VLAN 在这里扮演什么角色?

VLAN 的作用是让交换机在二层层面把流量划分到不同广播域。
但 VLAN 本身并不负责跨网段路由。

2.2 Router-on-a-stick 的关键点是什么?

关键点是两件事同时成立:

  1. 交换机到路由器的链路必须是 trunk(能携带多个 VLAN)

  2. 路由器在同一物理接口上创建子接口,每个子接口绑定一个 VLAN ID

    • 子接口 = VLAN 对应的三层网关(IP 地址)


3. 最核心的原理:一条链路“带很多 VLAN”,路由器如何分辨?

想象交换机到路由器的中继链路像“包裹传送带”。
每个包裹里放着以太网帧,但每个包裹会带一个“身份标签”:

  • VLAN=10 的帧,标签写 10

  • VLAN=20 的帧,标签写 20

路由器收到后就能做分流:

  • 看到 VLAN=10 → 交给 Gi0/0.10(子接口)

  • 看到 VLAN=20 → 交给 Gi0/0.20(子接口)

这就是所谓的 “stick”

路由器“贴在”交换机这条链路上,依靠 trunk 把多个 VLAN 的帧带到路由器。


4. 一次完整通信过程(强烈建议你对照理解)

我们用最常见的场景:VLAN10 主机访问 VLAN20 主机。

4.1 网络设定(例子)

  • VLAN 10:192.168.10.0/24,网关 192.168.10.1

  • VLAN 20:192.168.20.0/24,网关 192.168.20.1

PC1 在 VLAN 10(IP:192.168.10.10/24,GW:192.168.10.1
PC2 在 VLAN 20(IP:192.168.20.20/24

4.2 通信时序(一步步)

  1. PC1 发包

    • 目标 IP:192.168.20.20

    • 由于目标不在本地网段 → PC1 只会把包发给默认网关 192.168.10.1

    • 二层上目的 MAC 会先指向路由器 VLAN10 那个子接口的 MAC(ARP 完成后)

  2. 交换机接入端口接收到 VLAN 10 帧

    • PC1 所在交换机端口是 access vlan 10

    • 交换机知道“这个帧属于 VLAN 10”

  3. 交换机把帧从 trunk 发到路由器

    • 因为是 trunk,所以会给帧加 802.1Q tag

    • 帧变成:VLAN tag = 10

  4. 路由器物理口收到 tagged 帧

    • 路由器能看到 VLAN=10

    • 它会将这帧“交给 VLAN10 子接口”处理(比如 Gi0/0.10

  5. 路由器做三层转发

    • 子接口 Gi0/0.10 上的路由逻辑知道目的网段属于 VLAN20(或其路由表)

    • 然后从 Gi0/0.20 子接口转出去

  6. 路由器从 VLAN20 子接口发回

    • 这次发出的帧会带 VLAN tag = 20

  7. 交换机把帧送到 VLAN 20 的接入口

    • trunk 进入交换机后,再根据 VLAN tag=20 送到 access vlan 20 的端口

    • PC2 接收并回应

整个过程你可以抓住一句话:

二层靠 VLAN tag 标记,三层靠子接口作为网关。


5. 配置到底要配什么?按“交换机侧 / 路由器侧”分别看

下面以典型结构讲清楚“必须要点”,你不需要一开始死记命令。


5.1 交换机配置(你需要保证:接入口是 access,中继是 trunk)

(1) 用户接入口:Access 模式

  • PC1 所在端口:access vlan 10

  • PC2 所在端口:access vlan 20

(2) 交换机到路由器:Trunk 模式 + 放行 VLAN

  • 端口模式:trunk

  • 允许 VLAN:10, 20(至少要放行你需要的 VLAN)

常见错误:忘记在 trunk 放行 VLAN,导致路由器永远收不到某些 VLAN 的帧。


5.2 路由器配置(你需要保证:子接口绑定对应 VLAN ID,并配置网关 IP)

(1) 物理接口启用

  • no shutdown

(2) 创建子接口(每个 VLAN 一个)

  • Gi0/0.10

    • encapsulation dot1Q 10

    • IP:192.168.10.1/24

  • Gi0/0.20

    • encapsulation dot1Q 20

    • IP:192.168.20.1/24

注意:子接口的 VLAN ID 必须和交换机 trunk 传过来的 VLAN tag 一致。


6. 用一个“故障排查清单”帮你快速定位问题

当你部署了 router-on-a-stick 后,如果 ping 不通,通常不是“路由器坏了”,而是某个关键条件没满足。按这个顺序排最省时间:

检查 1:PC 的默认网关是否正确?

  • PC 在 VLAN10 → 默认网关应是 192.168.10.1

  • PC 在 VLAN20 → 默认网关应是 192.168.20.1

检查 2:交换机到路由器是否真的是 trunk?

  • 端口模式是否 trunk

  • trunk 是否允许 VLAN 10/20

检查 3:路由器子接口是否“up/up”

  • 子接口 VLAN 配置是否正确(尤其是 802.1Q VLAN ID)

  • 路由器上子接口 IP 是否正确

检查 4:路由表是否需要额外路由?

  • 如果只是直连网段互通(VLAN10 与 VLAN20 都直接配置在子接口上)通常无需静态路由

  • 如果 VLAN 还要访问其他网段,可能需要静态路由/动态路由


7. 应用场景:

7.1 适合的场景

  • 中小型网络:VLAN 数量不是特别多

  • 路由器端口有限:你希望用少量物理口完成多网段网关

  • 实验/课程实验:router-on-a-stick 是经典必做题

7.2 不太适合的场景

  • VLAN 非常多、频繁变动:子接口会越来越多,管理复杂

  • 高性能需求:单臂路由的瓶颈可能更集中在那条链路与路由器上
    (大规模更常见的是三层交换机 SVIs、或更先进的架构)


8. 你可以用一句“通俗总结”记住它

VLAN 让交换机分隔广播域;Trunk 把不同 VLAN 的帧一起运到路由器;子接口把每个 VLAN 变成路由器上的三层网关。