别再死记硬背BGP选路了!用Wireshark抓包实战,带你拆解华为/思科13条原则背后的报文真相
用Wireshark拆解BGP选路:从报文视角透视华为/思科13条原则
当你第一次面对BGP的13条选路原则时,是否感觉像在背诵天书?Local_Pref、MED、AS_Path这些抽象概念在实际网络中如何体现?今天我们将用Wireshark抓包,带你直击BGP Update报文的真实战场,把教科书上的规则变成可视化的网络语言。
1. 为什么需要从报文层面理解BGP?
网络工程师常陷入一个误区:能熟练配置BGP,却不清楚每个参数如何影响最终的路由决策。传统学习方式让我们死记硬背选路规则,却忽略了这些规则在协议报文中的具体表现。
BGP的本质是报文对话 。两台BGP路由器建立邻居后,通过Update报文交换路由信息。每个选路参数都对应着Update报文中的特定字段:
- Local_Pref体现在Path Attributes的Type Code 5
- MED对应Type Code 4
- AS_Path则是Type Code 2
通过Wireshark抓包,我们可以直观看到:
- 不同选路参数在报文中的存储位置
- 参数值如何影响路由优选
- 华为与思科设备在实现细节上的差异
提示:实验环境建议使用eNSP或EVE-NG搭建拓扑,至少包含两台路由器建立EBGP邻居
2. 搭建BGP抓包实验环境
2.1 基础拓扑配置
# 华为设备基础配置示例
sysname R1
interface GigabitEthernet0/0/0
ip address 10.1.1.1 255.255.255.0
bgp 65001
router-id 1.1.1.1
peer 10.1.1.2 as-number 65002
network 192.168.1.0 255.255.255.0
# 思科设备对应配置
hostname R2
interface GigabitEthernet0/0
ip address 10.1.1.2 255.255.255.0
router bgp 65002
bgp router-id 2.2.2.2
neighbor 10.1.1.1 remote-as 65001
network 192.168.2.0 mask 255.255.255.0
2.2 Wireshark抓包要点
在链路中间节点部署抓包时,注意以下关键过滤器:
tcp.port == 179 && bgp.type == 2 # 只捕获BGP Update报文
典型BGP Update报文结构:
| 字段 | 长度 | 说明 |
|---|---|---|
| Withdrawn Routes Length | 2字节 | 撤销路由字段长度 |
| Path Attributes Length | 2字节 | 路径属性字段长度 |
| Path Attributes | 变长 | 包含所有选路参数 |
| NLRI | 变长 | 网络层可达信息 |
3. 关键选路参数的报文解析
3.1 LOCAL_PREF的报文实现
当我们在华为设备上配置:
route-policy SET_LOCAL_PREF permit node 10
apply local-preference 200
peer 10.1.1.2 route-policy SET_LOCAL_PREF import
对应的Update报文中会出现:
Path Attribute - Flags: 0x40 (Well-known, Transitive)
Type Code: LOCAL_PREF (5)
Length: 4
Value: 0x000000c8 (200)
对比思科实现 : 思科使用Weight属性(Cisco私有)作为第一选路原则,该属性不会出现在标准BGP报文中,这是华为与思科在选路策略上的首要区别。
3.2 AS_Path长度比较的真相
在报文层面,AS_Path属性存储为:
Path Attribute - Flags: 0x40 (Well-known, Transitive)
Type Code: AS_PATH (2)
Length: 6
Segment Type: AS_SEQUENCE (2)
Segment Length: 2
AS Numbers: 65002, 65001
选路时所谓的"AS_Path短者优先"实际上是计算Segment Value中的AS号数量。特别注意:
- AS_SET类型(聚合路由场景)计为1
- 联盟(Confederation)内的AS不计入长度
- 私有AS号(如果未过滤)也会参与计数
3.3 MED的跨厂商差异
华为设备默认MED值为0,而思科默认不发送MED。观察以下两种场景:
场景1:华为向思科发送路由
# 华为配置MED
apply cost 50
报文中显示:
Path Attribute - Flags: 0x80 (Optional, Non-transitive)
Type Code: MULTI_EXIT_DISC (4)
Length: 4
Value: 50
场景2:思科向华为发送路由 思科需要显式配置才会发送MED:
route-map SET_MED permit 10
set metric 100
注意:华为默认会比较不同AS路径的MED,而思科需要
bgp always-compare-med命令启用此行为
4. 厂商特定选路规则的报文证据
4.1 华为的Preferred-Value
华为私有属性Preferred-Value不会出现在标准BGP报文中,它只在本机路由表中生效:
display bgp routing-table 192.168.2.0
Prefix: 192.168.2.0/24
Path/Ogn: 65002
Preferred-Value: 0 # 可通过route-policy修改
4.2 思科的Weight属性
类似地,思科的Weight属性也是本地有效:
show bgp 192.168.1.0
BGP routing table entry for 192.168.1.0/24
Weight: 0 # 可通过neighbor weight命令修改
4.3 Cluster List与Originator_ID
在路由反射场景中,这两个防环属性会出现在报文中:
Path Attribute - Flags: 0x80 (Optional, Non-transitive)
Type Code: CLUSTER_LIST (10)
Length: 4
Cluster IDs: 3.3.3.3
Path Attribute - Flags: 0x80 (Optional, Non-transitive)
Type Code: ORIGINATOR_ID (9)
Length: 4
Value: 1.1.1.1
5. 实战:通过报文分析选路过程
让我们通过一个具体案例,观察报文如何影响路由选择:
拓扑 : R1(华为) - R2(思科) - R3(华为),AS分别为65001、65002、65003
抓包分析步骤 :
- 在R1-R2链路捕获Update报文
- 观察R1发送给R2的路由属性
- 在R2-R3链路捕获转发的Update报文
- 比较属性变化
关键发现 :
- 华为默认会修改下一跳(NEXT_HOP属性)
- 思科默认保留MED属性(如果收到)
- AS_PATH属性在每经过一个AS时会前置新的AS号
# 典型Update报文片段示例
Path Attribute: ORIGIN (1)
Flags: 0x40, Type: ORIGIN (1), Length: 1, Value: IGP (0)
Path Attribute: AS_PATH (2)
Flags: 0x40, Type: AS_PATH (2), Length: 6
Path Segment: 65002 65001
Path Attribute: NEXT_HOP (3)
Flags: 0x40, Type: NEXT_HOP (3), Length: 4, Value: 10.1.1.2
通过这种对比分析,可以直观理解为什么某些路由会被优选,以及如何通过修改特定属性来影响选路决策。
6. 排错技巧:从报文发现问题
当BGP路由不符合预期时,Wireshark能帮助我们:
- 检查属性是否完整 :确认必要的属性(如NEXT_HOP)存在
- 验证属性值 :比较实际发送值与配置值是否一致
- 识别厂商差异 :发现华为和思科默认行为的不同
- 诊断路由过滤 :确认是否因属性缺失导致路由被过滤
例如,如果路由没有传播,可以检查:
- UPDATE报文中是否包含该路由
- 是否因AS_PATH包含私有AS号被过滤
- 是否因MED值不符合对端策略
掌握这些报文分析技能,你就能真正理解BGP选路的底层逻辑,而不再需要死记硬背那些抽象的规则。下次当有人问起"为什么这条路由更优"时,你可以直接打开Wireshark,指着具体的报文字段给出答案。
更多推荐


所有评论(0)