ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EVE-NG实战:Wireshark抓包深度解析STP与BPDU

EVE-NG实战:Wireshark抓包深度解析STP与BPDU 1. 为什么要在EVE-NG里研究STP流量搞网络的人都知道一句话交换网络最怕的不是没有带宽而是环没消掉。我早年在客户现场遇到过全网交换机疯狂刷MAC漂移告警整个办公网时断时续查了大半天才发现两台汇聚交换机之间被多接了一根跳线而STP因为端口保护配置问题没有及时阻塞导致广播风暴在环里打转生产业务被拖垮了十几分钟。从那以后我养成了个习惯凡是协议层面的疑难杂症先抓包看流量再下结论。STPSpanning Tree Protocol生成树协议也不例外它最真实的运行状态全部写在BPDU报文里。EVE-NGEmulated Virtual Environment Next Generation是我这几年用得最多的网络模拟平台。它最大的好处是跑真实厂商镜像交换机行为与物理设备几乎一致并且每个接口都能直接弹出Wireshark抓包不需要像真机那样去配置SPAN镜像口省了不少事。这一期“流量洞察”系列我们把焦点放在STP上看看这个协议平时是怎么在后台工作的BPDU长什么样根桥是怎么选出来的断了一条链路以后交换机会发什么报文阻塞端口要经过多长时间才敢转发数据。这篇文章适合正在学交换技术和准备认证的朋友更适合被公司二层环路坑过的兄弟。跟着操作一遍你不仅能搭出一个标准的STP实验拓扑还能在Wireshark里把BPDU的每个关键字段认个清清楚楚。后面的内容全部来自我实际在EVE-NG里敲过的命令和抓到的报文不是抄文档那套。2. 先把STP的原理掰开揉碎2.1 BPDUSTP的普通话STP的所有决策都靠一种叫做BPDU的报文来传递。BPDU的全称是Bridge Protocol Data Unit中文叫网桥协议数据单元。常见的BPDU有两种配置BPDUConfiguration BPDU和拓扑变更通知BPDUTCN BPDU。正常稳定状态下根桥每2秒向下发送一次配置BPDU目的MAC地址是0180.C200.0000这是IEEE专给生成树协议保留的组播地址。配置BPDU里携带的信息很浓缩关键字段包括协议ID、版本号、BPDU类型、标志位TC、TCA、根桥ID8字节、根路径开销、发送者桥ID、发送者端口ID、Message Age、Max Age、Hello Time、Forward Delay等。初学STP的人往往被这么多字段吓到其实只需要抓住两个核心变量一是根桥ID它决定了谁是全网的老大二是根路径开销它决定了去老大的路哪条更近。其他字段大多是用来描述BPDU在网络上衰老速度的后面排障时才会用到。可以这么理解BPDU就是交换机之间每隔几秒钟互相递的一张“名片”。名片上写清楚了“我眼里的根是谁”“我到根要花多少代价”“我是从哪个端口发出名片的”。全网所有交换机就靠这些名片不断比较、选举最终形成一棵稳定的无环树。2.2 根桥选举、端口角色与端口状态STP的目标很直接在一个有物理环路的二层网络中通过逻辑阻断某些端口把有环拓扑剪成一棵无环树。实现过程分为四步选举根桥Root Bridge全网唯一是所有生成树计算的基准点。在每个非根交换机上选举根端口Root Port这个端口是交换机到根桥最优路径的出入口。在每个网段上选举指定端口Designated Port它负责向所在网段发送BPDU和转发数据。剩下的端口被设置成阻塞端口Blocking阻塞口不转发业务帧只收BPDU继续监听网络状态。端口状态则是另一套体系包括Blocking、Listening、Learning、Forwarding四种。从Blocking到ForwardingSTP要经历两个Forward Delay每个默认15秒如果还需要先等待Max Age超时那一次完整收敛最坏要50秒左右。正因为慢后来才有了RSTP快速生成树和MSTP多实例生成树。但不管哪种改进BPDU的基本结构都是一样的这也是我们本期一定要把BPDU看透的原因。端口状态收BPDU发BPDU学习MAC转发数据持续时间Blocking是否否否20秒Max Age内Listening是是否否15秒Learning是是是否15秒Forwarding是是是是稳定运行3. 在EVE-NG里搭一个会“产生”BPDU的拓扑3.1 拓扑设计与设备选择要让STP发挥作用拓扑里必须存在物理环路。我这边使用三台Cisco IOS二层交换机镜像搭一个三角形结构SW1计划中的根桥管理地址192.168.10.1/24SW2接入交换机管理地址192.168.10.2/24SW3接入交换机管理地址192.168.10.3/24链路规划如下SW1的G0/0连接SW2的G0/0SW1的G0/1连接SW3的G0/1SW2的G0/2连接SW3的G0/2这样的三边环路可以完整展现根桥选举、根端口、指定端口和阻塞端口的关系。如果再加一台交换机角色会增多但原理不会改变抓包时却会多一倍的BPDU噪声。想练习拓扑收敛的同学可以后续在环上加链路改成多路径但本期先把最基础的场景吃透。EVE-NG里拖设备的时候注意选择支持二层功能的镜像比如IOL的L2版本或者vIOS-L2。部分老IOL镜像可能没有完整的STP时间参数可调但基础行为完全够用。启动节点后不要急着配东西先等所有接口从Down变成Up再看生成树因为设备刚启动时BPDU还没协商完直接抓包容易看到半成品状态。3.2 交换机的详细配置进入EVE-NG拓扑编辑界面后从左侧拖出三台交换机连好线再启动节点。启动时间根据不同镜像从几十秒到几分钟不等等接口状态稳定再做配置。先用SW1做配置SW1# configure terminal SW1(config)# hostname SW1 SW1(config)# vlan 10 SW1(config-vlan)# name TEST_VLAN SW1(config-vlan)# exit SW1(config)# interface gigabitethernet 0/0 SW1(config-if)# switchport mode access SW1(config-if)# switchport access vlan 10 SW1(config-if)# no shutdown SW1(config-if)# exit SW1(config)# interface gigabitethernet 0/1 SW1(config-if)# switchport mode access SW1(config-if)# switchport access vlan 10 SW1(config-if)# no shutdown SW1(config-if)# exit SW1(config)# interface vlan 10 SW1(config-if)# ip address 192.168.10.1 255.255.255.0 SW1(config-if)# no shutdownSW2和SW3做同样的配置但接口要按实际连线关系填。SW2除了G0/0连接SW1以外还要把G0/2配置为access并在VLAN 10里与SW3相连SW3则把G0/1连SW1、G0/2连SW2都配置进VLAN 10。这里有一个关键细节本期实验所有交换机互联接口全部使用access口并且都在同一个VLAN 10里。如果你改成Trunk口就要额外考虑native VLAN和BPDU VLAN匹配问题第6章我会专门讲这个坑。全部配置完成后在SW1上验证一下生成树状态SW1# show spanning-tree正常情况下会看到VLAN0010的Spanning tree enabled protocol ieee桥ID里的优先级默认32768并且某台交换机会被选举为根桥。如果看到两台交换机都在Root ID里显示自己是根说明它们之间BPDU没有互通重点排查链路类型和VLAN配置。3.3 没有STP会怎样关掉STP的对比实验为了让“STP为什么重要”有直观感受建议做一个对照实验先临时关闭某一台交换机上的STP然后在网络里制造一个广播帧。关闭命令如下具体命令会因镜像版本有差异SW1(config)# spanning-tree vlan 10 disable此时在SW2和SW3之间用PC去ping管理地址你会看到什么大概率是ping不稳定、时通时断交换机CPU占用率高居不下MAC地址表疯狂刷新。如果你抓包会看到大量重复的广播帧在环里循环这就是广播风暴的雏形。广播帧一个接一个转发从一个接口进来又从两个接口出去两个方向互相叠加流量指数级膨胀。这个实验做完后记得把STP重新打开SW1(config)# spanning-tree vlan 10对比做完你应该明白一件事STP每秒都在后台做大量看似无聊的“握手”但它其实是在保命。环路的危害不是理论推导出来的是实际一关STP就能立刻体验到的。4. 抓包看BPDU从Wireshark到协议细节4.1 开启EVE-NG的抓包工具回到EVE-NG拓扑界面右键点击任意一条交换机之间的连线选择Capture平台会自动调用Wireshark并开始实时抓包。相比真机需要手动配置端口镜像EVE-NG这个设计非常省心。抓BPDU之前建议先把显示过滤器调到STP协议上stp如果版本不同也可以输入spanning-treeWireshark会识别出生成树协议报文。BPDU每2秒一条过滤后你会在几秒钟内就收集一大堆帧非常耐看。我实际推荐在三条链路上同时抓包SW1-SW2链路看根桥发出的配置BPDUSW1-SW3链路看另一条路径上BPDU的传递情况SW2-SW3链路看非根交换机之间如何交互。三个窗口同步看等于把STP的拓扑决策过程全部摊开在面前。EVE-NG支持同时打开多个抓包窗口抓包时注意给窗口重命名不然容易搞混哪条链路对应哪个窗口。4.2 BPDU关键字段逐个看停止抓包后选中任意一条普通配置BPDUWireshark一般会自动识别为Spanning Tree Protocol。我把需要记牢的字段整理成一张速查表以后排障可以直接对照字段名典型值含义Protocol Identifier0表示生成树协议Protocol Version Identifier0/2/30代表STP2代表RSTP3代表MSTPBPDU Type0x00 / 0x800x00是配置BPDU0x80是TCN BPDURoot Identifier8字节前2字节优先级后6字节根桥MACRoot Path Cost0或累加值发送者到根桥的开销Bridge Identifier8字节发送这条BPDU的交换机自身桥IDPort Identifier2字节端口优先级加端口号Message Age0到20秒BPDU已被转发的存活时间Max Age20秒超时后重新计算生成树Hello Time2秒根桥发送配置BPDU的间隔Forward Delay15秒Listening到Forwarding的等待时间如果不知道字段含义我举个例子。在抓包里看到一条BPDURoot Identifier显示的是32768 / 5254.0012.3456Bridge Identifier也是32768 / 5254.0012.3456说明发送者就是根桥自己如果Root Identifier和Bridge Identifier不一致说明发送者是在转发它学到的、更优的根桥信息。4.3 从输出里怎么找根桥和各端口角色CLI里看生成树也是重要技能。在任意一台交换机上执行SW3# show spanning-tree vlan 10输出会分成Root ID和Bridge ID两个大段。Root ID里的优先级和MAC就是当前根桥Bridge ID则是本机。如果Root ID与Bridge ID一致说明这台交换机就是根桥。再看端口部分每个端口后面都标着Role和StsRoot代表根端口Desg代表指定端口Altn代表替代端口。通过这个输出你可以快速画出整个生成树的逻辑形状。SW2这种非根桥交换机上通常能看到一个Root端口负责向根桥方向收发BPDU在环路的另一端则很可能有一个端口处于Blocking状态。这台交换机收到的BPDU是从根桥方向传过来的转发给其他交换机的BPDU又经过它的指定端口传播。整个过程在Wireshark里就是一连串Root Identifier相同的BPDU报文。5. 弄断一条连线看STP的收敛与TCN5.1 手动断开链路触发拓扑变更现在进入实操最精彩的部分制造一次链路故障。我在SW2上把连接SW3的G0/2接口shutdown掉SW2(config)# interface gigabitethernet 0/2 SW2(config-if)# shutdown此时SW2和SW3之间那条链路立刻黑掉STP马上会行动起来。如果你同时在SW1-SW2链路上抓包你会看到BPDU流量出现明显变化SW2开始主动发送TCN BPDU告诉根桥“拓扑发生变化”。别的交换机收到这条TCN后会沿着根路径向上转发同时回一个带TCA标志的确认帧。之后根桥开始在后续配置BPDU里设置TC标志让全网交换机刷新MAC地址表。如果你嫌这个流程太快看不清楚可以把Wireshark的Time列打开观察这几个事件之间的时间差。往往在几十毫秒量级但MAC表刷新和端口收敛的持续时间会持续好几秒抓包时能明显看到一批带TC标志的BPDU刷屏。5.2 阻塞端口变转发时间线拆解断掉链路后环路中原本阻塞的端口需要变成转发端口来维持全网连通。经典STP的收敛时间线一般是这样0秒链路down对端交换机在相应接口上没有收到BPDU。约20秒内如果该接口本身就处于Blocking且有替代路径就要等待Max Age超时确认根路径已经不可用。超时后进入Listening状态等待15秒这个阶段只学习BPDU不学习MAC不转发数据。然后进入Learning状态等待15秒开始学习MAC地址表项但仍不转发业务数据。最后进入Forwarding状态才能真正转发业务流量。整个过程加起来非常接近50秒。我在实验里断掉SW2-SW3链路后实际用ping工具测过跨交换机连通性恢复时间测出来的结果就在50秒上下和理论值吻合。这也是STP最被吐槽的地方太慢。正是这种慢催生了网管员对RSTP的刚需但如果不明白经典STP的等待过程RSTP的秒级收敛速度来自哪里也很难理解。5.3 TCN报文怎么传递TCNTopology Change Notification是STP拓扑变更通知的关键报文。它的产生条件是非根桥检测到自己与根桥之间的连通路径发生变化或者某个指定端口/根端口进入了转发状态。TCN一出现网络就进入“重新认识拓扑”的节奏。TCN的实际传递路径很有意思它不一定走全网广播而是沿着根路径一步步向上。每台收到TCN的交换机先向下游回一个带TCA标志的BPDU表示“我知道了你别刷屏”然后把TCN继续向上游传。等根桥收到完整的TCN信息后会在接下来发出的配置BPDU里打上TC标志。全网所有交换机收到带TC的BPDU后会把自己的MAC地址表老化时间从默认的300秒临时缩短到Forward Delay默认15秒让老表项快速过期重新学习最新的端口映射。在Wireshark里怎么分辨这些动作看到BPDU Type为0x80的就是TCN报文看到标志位里TCA位置1的是TCN确认。看到配置BPDU里Flags的Topology Change位为1说明根桥在通知全网清MAC表。排障时如果频繁看到TCN出现说明网络中的端口在反复上下翻动一定要结合端口日志一起看而不是只去看MAC表。6. 那些年在STP上踩过的坑6.1 native VLAN不一致导致BPDU分离这个问题非常经典也最容易被忽略。两台交换机用Trunk互联时native VLAN是未打标签的VLAN默认是VLAN 1。如果一边把native VLAN改成20另一边保持默认1BPDU就带着不同的VLAN信息收发导致生成树视图被割裂两台交换机会分别把自己当成对应VLAN的根桥网络中暗藏环路。我在EVE-NG里复现过这个场景先把一边的Trunk口配置成switchport trunk native vlan 20另外一边维持默认然后看生成树输出两台交换机各自认为自己是根桥Wireshark里也确实能看到两边在互相发送配置BPDU但BPDU的Root Identifier各不相同根本形成共识。最终解决办法是把native VLAN统一或者在设计网络时规划好native VLAN的使用规范别让它在VLAN间乱穿。6.2 边缘端口没配PortFast接入层PC、打印机、IP话机这些设备开机后并不会先等20秒再发DHCP请求。如果交换机接入端口没有开PortFast端口要先经过Listening和Learning的等待很多终端就会因为拿不到IP而报错。这个坑在新装网络里特别常见。解决方式很直接给终端接入接口加上PortFast并建议开启BPDU GuardSW1(config)# interface gigabitethernet 0/0 SW1(config-if)# spanning-tree portfast SW1(config-if)# spanning-tree bpduguard enable注意PortFast绝对不能用于交换机互联接口。因为互联口需要立即参与生成树计算如果强行开PortFast在环路形成瞬间该端口直接转发可能造成广播风暴。生产环境里因配置不当引发的环路故障多数都和这个问题有关。6.3 根桥被低端设备抢走默认情况下所有交换机的桥优先级都是32768根桥由MAC地址最小者胜出。实验室里设备少没感觉到生产环境里一些老旧的接入交换机或小路由器桥ID中的MAC地址可能比核心交换机还小它就会成为根桥。根桥所在的交换机会吸引全网流量如果它性能弱或上行带宽不够整个网络的转发路径都跟着一起变差。正确的做法是在规划阶段就确定根桥角色并且把优先级写死。通常核心设备配置成优先级4096备核心设置成8192其他设备保持默认或调更高。命令很简单SW1(config)# spanning-tree vlan 10 priority 4096在EVE-NG里做实验也提醒一下每次重启拓扑镜像的MAC地址会变根桥很可能就不一样了。所以实验之前务必先看一眼show spanning-tree root确认当前根桥是哪台设备别被默认选举结果误导。6.4 EVE-NG抓BPDU的几个小坑抓BPDU时我踩过几个比较隐蔽的坑这里一起分享。一是Wireshark如果没开启混杂模式只能看到发给本机的帧BPDU的组播地址可能被系统过滤掉导致抓包里一片空白解决办法是确认抓包接口配置正确必要时在Wireshark里把相应接口设置为混杂模式。二是EVE-NG多链路同时抓包时容易混淆窗口建议先修改EVE-NG的链路名称或者在Wireshark上把每条链路的窗口标题改成对应链路名字否则事后翻包会崩溃。三是不要在桥接到物理网卡的链路上抓BPDU很多物理交换机默认不会转发组播BPDU这样抓不到什么有价值的报文尽量保持在模拟拓扑内部抓包。6.5 一个快速定位STP问题的检查清单根据我平时处理故障的经验遇到STP相关的问题可以按下面顺序排查检查项命令/工具判断标准当前根桥是谁show spanning-tree root确认根桥是否符合规划端口角色是否正常show spanning-treeRoot和Desg在预期接口上BPDU是否互通Wireshark抓包能看到对端发来的BPDUnative VLAN是否一致show interfaces trunk两端Trunk native VLAN相同端口状态是否频繁切换show log有没有大量link up/down记录终端接口是否开PortFastshow spanning-tree interface g0/0接入端口应该显示Portfast enabled这个流程我用了很多年基本能在几分钟内把STP问题定位到链路层、配置层或者VLAN层。7. 收个尾我的一些实验体会这期内容偏交换底层但每次带人入门我都坚持让他们先玩通STP抓包实验。因为生成树协议虽然每天都在跑却几乎没有工程师愿意去抓一条BPDU看看里面写的到底是什么。只有看到Wireshark里一帧帧BPDU交替出现你才会真正理解根桥ID和端口开销到底代表什么含义也才能在下一次遇到网络环路时快速定位问题出在哪个方向。最后分享一个实用小技巧排障时如果看到Wireshark里大量重复BPDU先别急着喊环路。先看Root Identifier是否在变不变说明根桥稳定再看Bridge Identifier是否在变如果切换频繁多半是链路在up/down抖动。如果你发现两个交换机同时认为自己才是根那优先查它们之间BPDU是否被VLAN隔离或丢弃而不是反复修改优先级。按照这个思路多数STP疑难杂症都能在一杯咖啡的时间内理出头绪。我个人的体会是研究协议不能只看配置结果一定要结合报文交互去理解设计初衷。EVE-NG给了我们一个零成本、可反复折腾的环境正好可以把STP这类平时不敢在生产网络上乱动的协议抓个底朝天。下期如果有时间我想继续聊聊RSTP和MSTP的收敛差异把快速生成树底层的提议/同意机制也用抓包的方式拆一遍。
返回列表