第9篇:单臂路由实现 VLAN 间通信

一、写在前面

前面我们讲了跨 VLAN 通信需要三层接口。但在早期的网络中,大部分交换机是纯二层的,不支持三层功能。那怎么实现跨 VLAN 通信呢?

单臂路由(Router-on-a-Stick) 就是在路由器上创建子接口,一个物理接口划分出多个逻辑子接口,每个子接口对应一个 VLAN,实现 VLAN 间的路由。

虽然现在三层交换机很普及了,但单臂路由的思想在理解 VLAN 间通信中仍然很重要,而且在一些特殊场景下(如防火墙做 Vlan 间网关)依然在用。


二、什么是单臂路由?

2.1 名称由来

             ┌──────────────┐
             │   路由器      │
             │   AR路由器     │
             └──────┬───────┘
                    │ 1 条物理链路(Trunk)
                    │
             ┌──────┴───────┐
             │ 二层交换机    │
             └──┬───┬───┬──┘
                │   │   │
              VLAN10 VLAN20 VLAN30
              PC-A   PC-B  PC-C

路由器只有"一条手臂"(一个物理接口)伸到交换机里,通过 Trunk 携带多个 VLAN 流量,所以叫"单臂路由"。

2.2 核心思路

组件 作用
路由器的一个物理接口 连接到交换机,做 Trunk
多个子接口(Sub-interface) 每个 VLAN 一个,终结 VLAN 标签
子接口的 IP 地址 作为该 VLAN 的网关

三、配置实战

3.1 网络拓扑

                 AR路由器
              GigabitEthernet0/0/0
              子接口:
              G0/0/0.10 → VLAN 10, IP 10.0.10.254/24
              G0/0/0.20 → VLAN 20, IP 10.0.20.254/24
                     │
                     │ Trunk
                     │
                二层交换机
                  G0/0/24 (Trunk)
                ┌──┴──┐
         Access  │    │  Access
          G0/0/1 │    │ G0/0/2
                 │    │
              PC-A   PC-B
          VLAN 10    VLAN 20
      10.0.10.1/24  10.0.20.1/24
      网关:10.0.10.254  网关:10.0.20.254

3.2 交换机配置

<Switch> system-view
[Switch] vlan batch 10 20
[Switch] interface gigabitethernet 0/0/1
[Switch-GigabitEthernet0/0/1] port link-type access
[Switch-GigabitEthernet0/0/1] port default vlan 10
[Switch-GigabitEthernet0/0/1] quit

[Switch] interface gigabitethernet 0/0/2
[Switch-GigabitEthernet0/0/2] port link-type access
[Switch-GigabitEthernet0/0/2] port default vlan 20
[Switch-GigabitEthernet0/0/2] quit

[Switch] interface gigabitethernet 0/0/24
[Switch-GigabitEthernet0/0/24] port link-type trunk
[Switch-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20
[Switch-GigabitEthernet0/0/24] quit

3.3 路由器配置(关键)

<Router> system-view
[Router] interface gigabitethernet 0/0/0
[Router-GigabitEthernet0/0/0] undo shutdown

# 创建子接口 .10,对应 VLAN 10
[Router] interface gigabitethernet 0/0/0.10
[Router-GigabitEthernet0/0/0.10] dot1q termination vid 10          ← 终结 VLAN 10 的 802.1Q 标签
[Router-GigabitEthernet0/0/0.10] ip address 10.0.10.254 255.255.255.0
[Router-GigabitEthernet0/0/0.10] arp broadcast enable              ← 使能子接口的 ARP 广播
[Router-GigabitEthernet0/0/0.10] quit

# 创建子接口 .20,对应 VLAN 20
[Router] interface gigabitethernet 0/0/0.20
[Router-GigabitEthernet0/0/0.20] dot1q termination vid 20
[Router-GigabitEthernet0/0/0.20] ip address 10.0.20.254 255.255.255.0
[Router-GigabitEthernet0/0/0.20] arp broadcast enable
[Router-GigabitEthernet0/0/0.20] quit

注意:华为设备上子接口默认不终结 VLAN 标签,需要配置 dot1q termination vid 并开启 arp broadcast enable,否则 VLAN 内主机无法进行 ARP 解析。

3.4 验证配置

# 查看子接口状态
[Router] display ip interface brief
Interface                  IP Address/Mask       Physical  Protocol
GigabitEthernet0/0/0       unassigned            up        up
GigabitEthernet0/0/0.10    10.0.10.254/24        up        up
GigabitEthernet0/0/0.20    10.0.20.254/24        up        up

# 在 PC-A 上 ping PC-B
C:\> ping 10.0.20.1
Reply from 10.0.20.1: bytes=32 time<1ms TTL=127    ← 通!

# 查看路由表
[Router] display ip routing-table
Destination/Mask   Proto   Pre   Cost    NextHop         Interface
10.0.10.0/24       Direct  0     0       10.0.10.254     GE0/0/0.10
10.0.20.0/24       Direct  0     0       10.0.20.254     GE0/0/0.20

四、通信流程详解(数据包怎么走)

以 PC-A(VLAN 10, 10.0.10.1)→ PC-B(VLAN 20, 10.0.20.1)为例:

Step 1: PC-A 判断目标不在同网段 → 发到网关(10.0.10.254)
        ARP 请求:"Who has 10.0.10.254?"
        路由器子接口 .10 回复自己的 MAC(MAC-R)

Step 2: PC-A 发送 ICMP Echo Request
        二层帧:
          DMAC = MAC-R(路由器子接口的 MAC)
          SMAC = MAC-A(PC-A 的 MAC)
          VLAN Tag = 10
        通过 Access 口进入交换机,被打上 VLAN 10 标签

Step 3: 交换机从 Trunk 口转发到路由器
        帧携带 VLAN 10 标签

Step 4: 路由器收到帧
        子接口 .10 识别 VLAN 10 标签 → 剥离标签
        检查目标 IP:10.0.20.1 → 查路由表 → 下一跳从 .20 发出
        MAC 重写:
          DMAC = MAC-B(PC-B 的 MAC)
          SMAC = MAC-R20(子接口 .20 的 MAC)
        打上 VLAN 20 标签,从物理口 G0/0/0 发出

Step 5: 交换机从 Trunk 口收到
        看到 VLAN 20 标签 → 转发到 Access 口 G0/0/2
        剥离标签

Step 6: PC-B 收到帧
        目的 MAC = 自己 → 处理
        回复同理反向路径

五、单臂路由的优缺点

优点

优点 说明
成本低 一台路由器+二层交换机即可实现 VLAN 间路由
配置灵活 新增 VLAN 只需添加一个子接口
架构清晰 路由与交换分离,便于排错

缺点

缺点 说明
单点瓶颈 所有跨 VLAN 流量经过同一条物理链路
带宽受限 物理接口带宽被所有 VLAN 共享(如 1G 链路,10 个 VLAN 分)
单点故障 路由器挂了,所有 VLAN 间通信中断
延迟较高 每个跨 VLAN 包都要走路由器处理(软件转发慢)

一句话评价:单臂路由是一个低成本入门方案,适合 VLAN 数量不多、跨 VLAN 流量不大的场景。现代网络基本用三层交换机的 VLANIF 接口替代。


六、进阶:子接口的 dot1q termination 与 ARP 广播

6.1 为什么要 dot1q termination?

路由器的物理接口收到带 VLAN 标签的帧时,默认会丢弃(因为物理口不认识带标签的帧)。dot1q termination vid 告诉路由器: - 这个子接口 接收 带指定 VLAN ID 的帧 - 发送时给帧 打上 指定 VLAN ID 的标签

6.2 为什么要 arp broadcast enable?

子接口收到 ARP 广播时,默认不处理。开启后: - 子接口会处理该 VLAN 内的 ARP 请求 - 如果 ARP 请求的目标 IP 是子接口的 IP,回复 ARP Reply


七、故障排查

7.1 Ping 不通的常见原因

现象 排查点
PC 无法 ping 通网关 子接口的 arp broadcast enable 配了吗?
跨 VLAN ping 不通 路由表中有对方网段吗?
交换机 Trunk 口配置漏了 display port vlan 看 Trunk 口允许了哪些 VLAN
子接口 down display interface brief 看物理口和子接口状态
线缆不够快 所有 VLAN 共享一条链路,带宽足够吗?

7.2 抓包检查

在路由器物理口上抓包,可以观察到:

帧1: VLAN 10, ARP, Who has 10.0.10.254?    ← PC-A 请求网关
帧2: VLAN 10, ARP, 10.0.10.254 is at MAC-R  ← 路由器回复
帧3: VLAN 10, ICMP Echo Request             ← PC-A 发请求
帧4: VLAN 20, ICMP Echo Request             ← 路由器改写后发往 PC-B
帧5: VLAN 20, ICMP Echo Reply               ← PC-B 回复
帧6: VLAN 10, ICMP Echo Reply               ← 路由器改写后回 PC-A

注意帧 3 和帧 4 的 VLAN 标签从 10 变为了 20,这正是子接口做的事。


八、思考

  1. 单臂路由为什么叫"单臂"?
  2. 一个路由器的物理接口最多可以创建多少个子接口?(理论值和实际限制)
  3. 华为路由器上子接口为什么要配 dot1q termination vidarp broadcast enable
  4. 如果所有 VLAN 的跨 VLAN 流量都走同一条物理链路,会有哪些问题?
  5. 在单臂路由方案中,物理接口坏了会影响什么?
  6. 对比单臂路由和三层交换机 VLANIF 的优缺点,什么场景该选哪种?

下篇预告:第10篇《三层交换机VLANIF接口实战配置》——掌握三层交换机VLANIF接口的实战配置。