网络修炼笔记:单臂路由与跨网段通信底层分析

单臂路由(Router on a Stick)如何实现跨 VLAN 通信?本文通过华为 eNSP + Wireshark 抓包,完整解析 VLAN 标签的打标、换标、剥标全过程,以及 Trunk 链路四步交互时序,适合网络运维入门参考。

...

实验环境与规划

  • 模拟器:华为 eNSP
  • 实验拓扑:PC1/PC2 PC3/PC4 接入 SW1;SW1 (GE0/0/5) 单线连接 R1 (GE0/0/0)。
  • IP 与网关规划
  • VLAN 10(研发部):网段 192.168.1.0/24。PC1 IP 为 192.168.1.1,网关必须指向 R1 的子接口 192.168.1.254
  • VLAN 20(市场部):网段 192.168.2.0/24。PC3 IP 为 192.168.2.3,网关必须指向 R1 的子接口 192.168.2.254

单臂路由实验拓扑图

为什么一定要配网关? 当 PC1 发现要 Ping 的目标(192.168.2.3)和自己不在同一个网段时,PC1 绝对不会在局域网里发 ARP 去找 PC3 的 MAC 地址。它会直接把数据包交给自己的“带路人”——网关(192.168.1.254)。如果不配网关,PC1 在底层直接就会放弃发包。


实验一:路由器直连路由表查看

操作步骤

交换机部分的 VLAN 10/20 创建及 Access 口划分配置与前文一致,详见 网络修炼笔记:交换机基础与 VLAN 隔离

此外,还需将 SW1 的 GE0/0/5 口配置为 Trunk,允许 VLAN 10 和 VLAN 20 的标签通过:

1
2
3
4
[sw1] interface g0/0/5
[sw1-GigabitEthernet0/0/5] port link-type trunk
[sw1-GigabitEthernet0/0/5] port trunk allow-pass vlan 10 20
[sw1-GigabitEthernet0/0/5] q

在路由器 R1 上配置子接口 GE0/0/0.10GE0/0/0.20,并输入 arp broadcast enable(开启子接口的 ARP 广播功能)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<Huawei> system-view
[Huawei] sysname R1

// 1. 创建并进入用于对接 VLAN 10 的逻辑子接口
[R1] interface GigabitEthernet 0/0/0.10
[R1-GigabitEthernet0/0/0.10] dot1q termination vid 10       // 终结 VLAN 10 标签(入向剥标,出向打标)
[R1-GigabitEthernet0/0/0.10] ip address 192.168.1.254 24    // 配置该子接口 IP,作为 VLAN 10 的网关
[R1-GigabitEthernet0/0/0.10] arp broadcast enable           // 开启子接口的 ARP 广播转发功能
[R1-GigabitEthernet0/0/0.10] quit

// 2. 创建并进入用于对接 VLAN 20 的逻辑子接口
[R1] interface GigabitEthernet 0/0/0.20
[R1-GigabitEthernet0/0/0.20] dot1q termination vid 20       // 终结 VLAN 20 标签
[R1-GigabitEthernet0/0/0.20] ip address 192.168.2.254 24    // 配置该子接口 IP,作为 VLAN 20 的网关
[R1-GigabitEthernet0/0/0.20] arp broadcast enable           // 开启子接口的 ARP 广播转发功能
[R1-GigabitEthernet0/0/0.20] quit

在R1系统视图下查看路由表:display ip routing-table

R1 直连路由表

路由表底层拆解

配置完成后,路由表中会自动生成两条核心的直连路由表项:

  • 目的网段 192.168.1.0/24,下一跳为 192.168.1.254,Proto 为 Direct
  • 目的网段 192.168.2.0/24,下一跳为 192.168.2.254,Proto 为 Direct

什么是直连下一跳? 在路由表的 Proto(协议)一栏中,Direct 代表“直连路由”。这意味着路由器发现这两个网段就在它自己抬手就能碰到的“隔壁房间”(逻辑子接口上)。 当数据包到了路由器手里后,路由器发现目标的下一跳写的是它自己的子接口 IP,它就不需要再把包丢给别的路由器了,而是直接在自己内部把数据包从 VLAN 10 的接口“递给” VLAN 20 的接口。


实验二:单臂路由 Trunk 链路四步交互抓包分析

操作步骤

  1. 右键点击 SW1 与 R1 的互联链路(GE0/0/5),开始抓包。
  2. 从 PC1 发起跨网段 PING 测试:ping 192.168.2.3

PC1 ping PC3 结果

Wireshark 报文时序与标签(802.1Q)透视

在这根“单臂”链路上,一个完整的 PING 交互(一问一答)其实在这根线上跑了 4 次(进去 2 次,出来 2 次)。抓包数据如下:

1
2
3
4
10  5.485000  192.168.1.1  192.168.2.3  ICMP  78  Echo (ping) request  ttl=128  | VLAN ID: 10
11  5.485000  192.168.1.1  192.168.2.3  ICMP  78  Echo (ping) request  ttl=127  | VLAN ID: 20
12  5.531000  192.168.2.3  192.168.1.1  ICMP  78  Echo (ping) reply    ttl=128  | VLAN ID: 20
13  5.531000  192.168.2.3  192.168.1.1  ICMP  78  Echo (ping) reply    ttl=127  | VLAN ID: 10

Trunk链路 Wireshark抓包


单臂路由数据包完整生命周期(去程与回程)

为了让所有人都能看懂,我们将上述抓包的 4 个步骤详细说明一下:

去程:PC1(VLAN 10) → PC3(VLAN 20)

  • 第一步:普通包出门 PC1 封装好一个普通的 ICMP Request 包,丢给交换机。此时包里干净无污染,没有带任何 VLAN 标签。
  • 第二步:交换机强行打标签(包 10) 当包从交换机的 GE0/0/1(Access 接口)进入交换机内部时,接口像安检站一样,强行在数据包的二层以太网帧头塞入一个 VLAN 10 的标签(Tag)。随后,数据包带着这个标签,顺着 Trunk 链路(GE0/0/5)冲向路由器。此时因为没经过路由器转发,TTL 依然是初始值 128
  • 第三步:路由器换标签(包 11) 路由器 GE0/0/0.10 子接口收到包,发现标签是 10,于是把标签剥掉,露出三层 IP 核心。路由器查路由表,发现要去 192.168.2.3(VLAN 20),于是把数据包移交给 GE0/0/0.20 子接口。0.20 子接口重新给数据包打上 VLAN 20 的标签,并吐回给交换机。因为跨越了网段,完成了三层转发,TTL 减 1 变成了 127。
  • 第四步:交换机剥离标签送达 带着 VLAN 20 标签的数据包回到交换机内部。交换机发现目标 PC3 在 GE0/0/3(Access 接口)上。当数据包准备从这个接口跨出交换机、走向 PC3 的网卡时,Access 接口会强行把 VLAN 20 的标签剥离掉

注意:普通的 PC 网卡默认是不认识 802.1Q 标签的,如果带着标签给电脑,电脑会直接报错丢弃。所以交换机出口必须剥标签,给电脑最干净的数据。

回程:PC3(VLAN 20) → PC1(VLAN 10)

回包的逻辑完全是对称的镜像过程:

  • 包 12:PC3 回应 Reply,进交换机打上 VLAN 20 标签,通过 Trunk 线送到路由器,此时 TTL 为 128
  • 包 13:路由器接收后,在内部查路由表,把标签剥离并换成 VLAN 10 标签,重新扔回 Trunk 线,TTL 减 1 变为 127
  • 数据包回到交换机,从连接 PC1 的 Access 接口剥离 VLAN 10 标签,送回 PC1。

结论

  1. 电脑不带标,带标电脑抛:电脑收发都是普通包,标签只在交换机和路由器之间流转。
  2. 入向打标,出向剥标:交换机的 Access 接口,进去必须盖章(打标签),出来必须撕掉(剥标签)。
  3. 三层转发看 TTL:三层转发看 TTL:数据包每经过一次路由器(三层转发),IP 头的 TTL 值必然减 1。在单臂路由中,由于往返共用一根网线,我们能直观地在同条链路上抓到 TTL 从 128 变成 127 的轨迹。
Created by aka.g