用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抓包,我们可以直观看到:

  1. 不同选路参数在报文中的存储位置
  2. 参数值如何影响路由优选
  3. 华为与思科设备在实现细节上的差异

提示:实验环境建议使用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

抓包分析步骤

  1. 在R1-R2链路捕获Update报文
  2. 观察R1发送给R2的路由属性
  3. 在R2-R3链路捕获转发的Update报文
  4. 比较属性变化

关键发现

  • 华为默认会修改下一跳(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能帮助我们:

  1. 检查属性是否完整 :确认必要的属性(如NEXT_HOP)存在
  2. 验证属性值 :比较实际发送值与配置值是否一致
  3. 识别厂商差异 :发现华为和思科默认行为的不同
  4. 诊断路由过滤 :确认是否因属性缺失导致路由被过滤

例如,如果路由没有传播,可以检查:

  • UPDATE报文中是否包含该路由
  • 是否因AS_PATH包含私有AS号被过滤
  • 是否因MED值不符合对端策略

掌握这些报文分析技能,你就能真正理解BGP选路的底层逻辑,而不再需要死记硬背那些抽象的规则。下次当有人问起"为什么这条路由更优"时,你可以直接打开Wireshark,指着具体的报文字段给出答案。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐