第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,这正是子接口做的事。
八、思考
- 单臂路由为什么叫"单臂"?
- 一个路由器的物理接口最多可以创建多少个子接口?(理论值和实际限制)
- 华为路由器上子接口为什么要配
dot1q termination vid和arp broadcast enable? - 如果所有 VLAN 的跨 VLAN 流量都走同一条物理链路,会有哪些问题?
- 在单臂路由方案中,物理接口坏了会影响什么?
- 对比单臂路由和三层交换机 VLANIF 的优缺点,什么场景该选哪种?
下篇预告:第10篇《三层交换机VLANIF接口实战配置》——掌握三层交换机VLANIF接口的实战配置。