【EVE-NG流量洞察】10、思科PVST/PVST+/Rapid-PVST+
本文详细分析了思科PVST/PVST+/Rapid-PVST+协议的BPF过滤表达式,包括:1)协议帧结构解析,重点说明目的MAC地址(01-00-0C-CC-CC-CD)和802.1Q标签特征;2)提供基础捕获表达式,涵盖各类PVST流量的过滤方法;3)分别针对PVST、PVST+和Rapid-PVST+给出专用过滤规则,包括版本区分、VLAN识别和状态检测;4)特别设计了VLAN相关故障的诊断
·
推荐阅读:
1、EVE-NG 2TB全网最新最全镜像下载地址(保持更新):
https://www.emulatedlab.com/thread-939-1-1.html
2、EVE-NG 2025全网最新最全资源大全(保持更新):
https://www.emulatedlab.com/thread-2262-1-1.html
3、EVE-NG 国代答疑频道(免费公开访问):
https://pd.qq.com/s/8d1hglslz
1 纯BPF过滤表达式分析思科PVST/PVST+/Rapid-PVST+常见网络故障
1.1 一、思科PVST/PVST+/Rapid-PVST+帧结构参考
1.1.1 关键特征:
- 目的MAC地址:
01-00-0C-CC-CC-CD(Cisco PVST组播地址) - 协议标识符:Cisco私有协议,通常使用SNAP封装
- VLAN标签:PVST+为每个VLAN发送单独的BPDU,带802.1Q标签
1.1.2 PVST+帧结构(BPF偏移计算):
0-5: 目的MAC (01:00:0C:CC:CC:CD)
6-11: 源MAC
12-13: Ethertype (0x8100 - 802.1Q标签)
14-15: VLAN标签 (TCI: 优先级+CFI+VLAN ID)
16-17: 内部协议类型 (0x010B - Cisco PVST)
18-...: PVST+ BPDU数据
1.1.3 Rapid-PVST+ BPDU结构:
PVST+头部(14字节以太网 + 4字节802.1Q + 2字节协议类型)
从字节20开始:标准RSTP BPDU结构
1.2 二、基础PVST/PVST+/Rapid-PVST+捕获表达式
# 1. 捕获所有思科生成树协议流量
ether dst 01:00:0C:CC:CC:CD
# 2. 捕获所有带Cisco PVST标记的流量
ether[12:2] == 0x8100 and ether[16:2] == 0x010B
# 3. 组合捕获:所有PVST/PVST+/Rapid-PVST+
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B
# 4. 捕获特定VLAN的PVST流量
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and (ether[14:2] & 0x0fff) == VLAN_ID
# 5. 捕获非802.1Q封装的PVST(罕见,但可能存在)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x010B
1.3 三、PVST(原始PVST)分析
1.3.1 PVST BPDU结构(偏移从以太网头部开始):
14: 协议版本 (STP=0x00, PVST可能有变种)
15: BPDU类型 (配置=0x00, TCN=0x80)
16: 标志位
17-24: 根桥ID
25-28: 根路径开销
29-36: 桥ID
37-38: 端口ID
39-...: 标准STP计时器
# 1. 捕获PVST配置BPDU
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x00
# 2. 捕获PVST TCN BPDU
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x80
# 3. 检查PVST标志位(字节20)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[21] & 0x01) == 0x01 # TC标志
# 4. 检查PVST根桥ID(字节17-24)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[17:8] == 预期根桥ID
1.4 四、PVST+(增强PVST)分析
1.4.1 PVST+与PVST的区别:
- 使用802.1Q标签
- 支持VLAN 1-4094
- 每个VLAN独立BPDU
# 1. 捕获特定VLAN的PVST+ BPDU
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == 0x0001 # VLAN 1
# 2. 捕获Native VLAN(VLAN 1)的PVST+
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == 0x0001
# 3. 捕获用户VLAN的PVST+
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) > 0x0001
# 4. 检查VLAN标签中的优先级(前3位)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0xe000) != 0x0000
1.5 五、Rapid-PVST+(快速PVST+)分析
1.5.1 Rapid-PVST+关键特征:
- 使用RSTP协议(802.1w)
- 版本号:0x02
- BPDU类型:0x02
# 1. 捕获Rapid-PVST+ BPDU
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02
# 2. 捕获Rapid-PVST+特定VLAN
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[14:2] & 0x0fff) == VLAN_ID
# 3. 检查Rapid-PVST+标志位(字节21)
# 端口角色:位2-3
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[21] & 0x0C) == 0x08 # 根端口
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[21] & 0x0C) == 0x0C # 指定端口
# 4. 检查Rapid-PVST+端口状态(位4-5)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[21] & 0x30) == 0x00 # 阻塞
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[21] & 0x30) == 0x30 # 转发
1.6 六、协议版本区分
# 1. 区分PVST(STP版本0x00)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x00
# 2. 区分Rapid-PVST+(RSTP版本0x02)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02
# 3. 捕获TCN BPDU(类型0x80)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x80
# 4. 捕获配置BPDU(类型0x00)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x00
1.7 七、VLAN相关故障分析
1.7.1 故障1: VLAN不一致
# 捕获VLAN ID超出有效范围(1-4094)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == 0x0000
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) > 0x0fff
# 捕获Native VLAN不匹配(两端不同)
# 需要比较两个方向的流量,BPF难以直接实现
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == 0x0001
1.7.2 故障2: VLAN修剪问题
# 捕获未配置VLAN的PVST+ BPDU
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == 未配置VLAN_ID
# 捕获VLAN列表中的缺失VLAN(需要持续监控)
# 以下捕获特定VLAN范围,检查是否存在
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) >= 0x0002 and (ether[14:2] & 0x0fff) <= 0x000a
1.7.3 故障3: VLAN跳数问题
# 检查VLAN内的根桥一致性(通过根桥ID)
# 需要比较同一VLAN内不同BPDU的根桥ID
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == VLAN_ID | \
比较根桥ID字段
1.8 八、根桥选举故障
1.8.1 PVST+根桥ID结构:
字节17-18: 优先级(2字节)
字节19-24: MAC地址(6字节)
# 1. 捕获特定根桥优先级
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[17:2] == 0x8000 # 默认32768
# 2. 捕获根桥优先级为0(可能配置错误)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[17:2] == 0x0000
# 3. 捕获根桥MAC地址
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[19:6] == 预期MAC
# 4. 检测多个VLAN有不同根桥(PVST+特性,正常)
# 但可检查特定VLAN的根桥ID是否一致
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == VLAN_ID
1.9 九、计时器问题
1.9.1 PVST+计时器字段(偏移从字节39开始):
39-40: 消息年龄
41-42: 最大年龄
43-44: Hello时间
45-46: 转发延迟
# 1. 检查Hello时间(默认2秒)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[43:2] != 0x0002
# 2. 检查Hello时间为0
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[43:2] == 0x0000
# 3. 检查消息年龄超过最大年龄
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[39:2] > ether[41:2]
# 4. 检查转发延迟(默认15秒)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[45:2] != 0x000f
# 5. 检查最大年龄(默认20秒)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[41:2] != 0x0014
1.10 十、端口状态和角色故障
1.10.1 PVST+端口ID字段(字节37-38):
高4位:端口优先级
低12位:端口号
# 1. 检查端口ID有效性
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[37:2] & 0x0fff) == 0x0000
# 2. 检查端口优先级(默认128)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[37:2] & 0xf000) == 0x8000
# 3. Rapid-PVST+端口角色检查(字节21的位2-3)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[21] & 0x0C) == 0x00 # 未知角色
# 4. Rapid-PVST+端口状态检查(字节21的位4-5)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[21] & 0x30) == 0x20 # 异常:转发但未学习
1.11 十一、拓扑变更相关故障
# 1. 捕获TCN BPDU
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x80
# 2. 捕获TC标志设置(位0)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[21] & 0x01) == 0x01
# 3. 捕获TCA标志(拓扑变更确认,位7)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[21] & 0x80) == 0x80
# 4. 捕获频繁的拓扑变更(需要时间分析)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[21] & 0x01) == 0x01 | \
按时间频率分析
1.12 十二、与其他协议的互操作问题
1.12.1 PVST+与标准STP/RSTP互操作:
# 1. 检测混合环境(PVST+和标准STP同时存在)
ether dst 01:00:0C:CC:CC:CD or ether dst 01:80:c2:00:00:00
# 2. 检测PVST+与802.1D STP互操作问题
ether dst 01:80:c2:00:00:00 and ether[19] == 0x00 and \
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B
# 3. 检测PVST+与802.1w RSTP互操作问题
ether dst 01:80:c2:00:00:00 and ether[19] == 0x02 and \
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02
1.12.2 PVST+与MSTP互操作:
# 检测PVST+与MSTP混合环境
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B or \
ether dst 01:80:c2:00:00:00 and ether[19] == 0x03
1.13 十三、思科特有扩展检查
1.13.1 BPDU过滤和防护:
# 1. 检测BPDU Guard应阻止的BPDU(来自主机端口)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and \
not ether[6:3] = 思科交换机OUI(如00:00:0C, 00:01:42等)
# 2. 检测Root Guard应阻止的更优BPDU
# 需要比较根桥优先级,BPF难以直接实现
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[17:2] < 当前根桥优先级
1.13.2 PortFast和BPDU Filter:
# 检测PortFast端口是否发送BPDU(不应发送)
ether src 主机端口MAC and ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B
# 检测BPDU Filter是否生效(端口不应接收/发送BPDU)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and \
ether[6:6] = 启用了BPDU Filter的端口MAC
1.14 十四、组合故障诊断表达式
1.14.1 综合PVST+健康检查:
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (
# 协议版本错误
ether[20] != 0x00 and ether[20] != 0x02 and ether[20] != 0x80 or
# VLAN ID无效
(ether[14:2] & 0x0fff) == 0x0000 or
(ether[14:2] & 0x0fff) > 0x0fff or
# 计时器异常
ether[43:2] == 0x0000 or # Hello时间为0
ether[39:2] > ether[41:2] or # 消息年龄超时
ether[45:2] == 0x0000 or # 转发延迟为0
# 根桥ID异常
ether[17:8] == 0x0000000000000000 or
ether[17:2] == 0x0000 or # 优先级为0
# 端口ID异常
(ether[37:2] & 0x0fff) == 0x0000 or
# Rapid-PVST+特定检查
(ether[20] == 0x02 and (
(ether[21] & 0x0C) == 0x00 or # 未知端口角色
(ether[21] & 0x30) == 0x20 # 异常状态
))
)
1.14.2 严重故障过滤器:
# 可能导致环路的严重故障
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (
# BPDU过期但端口仍在转发
ether[39:2] >= ether[41:2] and ether[20] == 0x02 and (ether[21] & 0x20) == 0x20 or
# 多个VLAN有不同的根桥但配置要求相同(需要具体配置信息)
# 这里检查根桥ID与桥ID相同但非根桥
ether[17:8] == ether[29:8] and ether[25:4] != 0x00000000 or
# Native VLAN不匹配(VLAN 1但另一端不是)
(ether[14:2] & 0x0fff) == 0x0001 and 需要检查对端
)
1.14.3 VLAN相关故障:
# VLAN配置问题
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (
# VLAN ID在允许范围外
(ether[14:2] & 0x0fff) < 0x0001 or
(ether[14:2] & 0x0fff) > 0x0ffe or
# 特定VLAN缺失(假设VLAN 10应存在)
not (ether[14:2] & 0x0fff) == 0x000a and 时间段内应有BPDU or
# VLAN优先级异常(非0)
(ether[14:2] & 0xe000) != 0x0000
)
1.14.4 性能问题过滤器:
# 可能影响网络性能的问题
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (
# 过多的VLAN导致BPDU泛滥
# 通过统计不同VLAN ID的数量来检测,BPF无法直接实现
# 频繁的拓扑变更
(ether[21] & 0x01) == 0x01 and ether[39:2] < 0x0002 or
# Hello时间过长
ether[43:2] > 0x0004 or
# Rapid-PVST+端口状态频繁变化
ether[20] == 0x02 and ether[39:2] < 0x0003 # 新BPDU
)
1.15 十五、特定VLAN根桥一致性检查
# 检查特定VLAN(如VLAN 10)的所有BPDU根桥ID是否一致
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[14:2] & 0x0fff) == 0x000a | \
比较ether[17:8]字段的一致性
# 检查不同VLAN是否有相同根桥(正常PVST+特性,但可验证)
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B | \
按VLAN分组比较根桥ID
1.16 十六、BPF表达式优化
# 1. 预编译PVST+过滤器
# 基本PVST+捕获
ether[0:6] = 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B
# 2. 特定VLAN的Rapid-PVST+
ether[0:6] = 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and ether[20] == 0x02 and (ether[14:2] & 0x0fff) == VLAN_ID
# 3. 使用掩码同时检查多个条件
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[21] & 0x81) != 0x00 # TC或TCA标志设置
# 4. 排除非PVST+流量
ether dst 01:00:0C:CC:CC:CD and not (ether[12:2] == 0x8100 and ether[16:2] == 0x010B)
# 5. 组合检查计时器
ether dst 01:00:0C:CC:CC:CD and ether[12:2] == 0x8100 and ether[16:2] == 0x010B and (ether[43:2] == 0x0000 or ether[45:2] == 0x0000)
1.17 十七、常见故障场景与BPF表达式
| 故障现象 | BPF表达式 | 可能原因 |
|---|---|---|
| VLAN间环路 | 检查不同VLAN根桥ID一致性 | PVST+配置错误 |
| 收敛缓慢 | ether[43:2]>0x0004 |
Hello时间过长 |
| 端口无法转发 | ether[20]==0x02 and (ether[21]&0x30)==0x00 |
Rapid-PVST+端口阻塞 |
| BPDU丢失 | 监控特定VLAN BPDU间隔 | VLAN修剪或过滤 |
| Native VLAN不匹配 | 比较两端VLAN 1的BPDU | 配置不一致 |
| 根桥震荡 | 监控根桥ID变化频率 | 链路不稳定或配置 |
1.18 十八、注意事项
- 思科设备特定:PVST/PVST+/Rapid-PVST+是Cisco私有协议
- VLAN标签:PVST+ BPDU通常带802.1Q标签,VLAN 1可能例外
- 目的MAC:固定为
01:00:0C:CC:CC:CD - 协议类型:
0x010B(Cisco PVST) - 兼容性:与标准STP/RSTP/MSTP不直接兼容
- 性能影响:每个VLAN独立BPDU可能产生大量流量
1.19 总结
纯BPF表达式分析思科PVST/PVST+/Rapid-PVST+故障的关键点:
- 识别协议:目的MAC=
01:00:0C:CC:CC:CD,协议类型=0x010B,802.1Q标签 - 区分版本:PVST(0x00)、Rapid-PVST+(0x02)、TCN(0x80)
- VLAN分析:每个VLAN独立BPDU,检查VLAN标签和一致性
- 根桥检查:每个VLAN可能有不同根桥,验证配置意图
- 计时器验证:Hello、MaxAge、Forward Delay
思科PVST+系列协议的主要优势是每个VLAN独立的生成树,但这也增加了故障排查的复杂性。这些BPF表达式可以帮助快速识别协议问题、VLAN配置错误和收敛问题。对于复杂故障,建议结合Cisco IOS命令如show spanning-tree vlan、debug spanning-tree等进行综合分析。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)