简介
本文档介绍有关桥接运行Cisco IOS®软件的Cisco Catalyst交换机的安全网络实施建议。
先决条件
要求
本文档没有任何特定的要求。
使用的组件
本文档不限于特定的软件和硬件版本。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
本文档讨论生成树协议 (STP) 可能失效的一些常见原因以及为查明问题来源而要寻找的信息。它还显示了可最大限度地减少与生成树相关问题并易于故障排除的设计。
本文档不讨论 STP 的基本运行。要了解 STP 的工作方式,请参考此文档:
本文档不讨论 IEEE 802.1w 中定义的快速 STP (RSTP)。此外,本文档也不讨论 IEEE 802.1s 中定义的多生成树 (MST) 协议。有关 RSTP 和 MST 的详细信息,请参阅以下文档:
有关适用于运行Cisco IOS软件的Catalyst交换机的更具体的STP故障排除文档,请参考文档排除Catalyst交换机上的STP问题。
生成树协议失效
生成树算法 (STA) 的主要功能是减少在桥接网络中冗余链路所产生的环路。STP 运行在开放式系统互联 (OSI) 模型的第二层。通过在网桥之间交换的网桥协议数据单元 (BPDU),STP 选择最终转发或阻止数据流的端口。此协议在某些特定情况下可能会失败,并且根据网络的设计,对可能非常困难的情况进行故障排除。在此特定区域中,您应在问题发生之前执行故障排除过程中最重要的部分。
STA 失效一般会导致桥接环路。致电 Cisco 技术支持询问生成树问题的大多数客户都怀疑有 Bug,但原因从来都不是 Bug。即使软件是问题所在,STP环境中的桥接环路仍然来自可以阻塞(而是转发流量)的端口。
生成树收敛
请参阅生成树视频 中的举例说明,了解生成树最初如何收敛。该示例还解释为何由于丢失 BPDU 过多,受阻端口会进入转发模式,从而造成 STA 失效。
本文档的其余部分列出了导致 STA 失效的不同情况。这些失效中的大多数都与丢失 BPDU 过多有关。此项丢失将导致受阻端口过渡到转发模式。
双工不匹配
点对点链路上双工不匹配是很常见的配置错误。如果手动将链路一端的双工模式设置为全双工,而另一端保持自动协商模式,则链路最终以半双工模式运行。(双工模式设置为全双工的端口不再进行协商。)
最坏的局面是发送 BPDU 的网桥中某个端口的双工模式设置为半双工,而链路另一端对等端口的双工模式设置为全双工。在前面的示例中,网桥A和网桥B之间的链路上的双工不匹配很容易导致桥接环路。由于网桥 B 的配置为全双工,因此它在访问该链路之前不执行载波侦听。即使网桥A已使用该链路,网桥B也会开始发送帧。这种情况对A而言是一个问题;网桥A检测到冲突并在网桥尝试再次传输帧之前运行回退算法。如果从 B 到 A 有足够的流量,则 A 发送的每个数据包(包含 BPDU)都会遭遇延迟或冲突,并最终被丢弃。从 STP 的角度来看,由于网桥 B 不再从 A 接收 BPDU,因此网桥 B 已丢失根网桥。这种情况使 B 取消阻止与网桥 C 相连的端口,而这会产生环路。
当出现双工不匹配时,在运行Cisco IOS软件的Catalyst交换机的控制台上可以看到以下错误消息:
Cisco IOS 软件
%CDP-4-DUPLEX_MISMATCH: duplex mismatch discovered on FastEthernet5/1 (not half duplex), with TBA05071417(Cat6K-B) 4/1 (half duplex).
请检查双工设置,如果双工配置不匹配,请设置适当的配置。
有关如何排除双工不匹配故障的详细信息,请参考文档配置和验证以太网10/100/1000Mb半双工/全双工自动协商。
单向链路
单向链路是桥接环路的常见原因。在光纤链路上,检测不到的故障常常会导致单向链路。另一个原因是收发器有问题。可导致链路保持 up 状态和提供单向通信的任何情况对 STP 都非常危险。此示例可解释清楚:
此处,假设 A 与 B 之间的链路是单向的。链路会丢弃从 A 到 B 的流量,同时链路会传输从 B 到 A 的流量。假设网桥 B 处于阻塞状态,然后链路成为单向链路。但是,只有从优先级更高的网桥接收 BPDU 的端口才能阻止。由于在这种情况下丢失了来自 A 的所有 BPDU,因此网桥 B 最终将其面向 A 的端口过渡到转发状态并转发流量。这会产生一个环路。如果启动时就有这种失效情况,则 STP 无法正确收敛。在双工不匹配的情况下,重新引导暂时有效;但在这种情况下,重新引导网桥绝对无效。
为了在产生转发环路之前检测到单向链路,Cisco 设计并实现了单向链路检测 (UDLD) 协议。此功能可检测不正确的接线或第二层的单向链路,并且通过禁用某些端口自动切断产生的环路。在桥接环境中,只要有可能,就请运行 UDLD。
有关使用UDLD的详细信息,请参阅文档配置UDLD协议功能。
数据包损坏
数据包损坏也会导致同类失效。如果链路的物理错误率很高,则可能会丢失一定量的连续 BPDU。此项丢失可能会导致阻塞端口过渡到转发状态。由于 STP 默认参数非常保守,因此不会经常看到这种情况。阻塞端口需要保持丢失 BPDU 的状态 50 秒,然后才会过渡到转发。成功传输一个 BPDU 即可切断环路。草率地调整 STP 参数时通常会发生这种情况。减小 max-age 就是调整的一个示例。
双工不匹配、电缆有缺陷或电缆长度不正确可能会导致数据包损坏。请参考文档排除交换机端口和接口问题,其中解释了Cisco IOS软件错误计数器输出。
资源错误
STP 以软件方式实现,即使是在以含有专门的应用专用集成电路 (ASIC) 的硬件执行大部分交换功能的高端交换机上也是如此。如果由于任何原因,网桥的CPU使用率过高,则资源可能不足以传输BPDU。STA 一般不大量占用处理器,并且优先级高于其他进程。本文档的查找资源错误部分中罗列了某个特定平台可处理的 STP 实例数。
Portfast 配置错误
PortFast 是通常只为连接到主机的端口或接口启用的一种功能。此端口上链路变为 up 状态后,网桥会跳过 STA 的第一个阶段,直接过渡到转发模式。
注意:请勿在连接其他交换机、集线器或路由器的交换机端口或接口上使用PortFast功能。否则,可能会形成网络环路。
在本示例中,设备 A 是端口 p1 已成为转发模式的网桥。端口 p2 具有 PortFast 配置。设备 B 是集线器。将第二根电缆插入 A 后,端口 p2 就会变为转发模式,从而在 p1 与 p2 之间产生一个环路。p1 或 p2 收到将其中一个端口置于阻塞模式的 BPDU 后,此环路就会终止。但是,这种临时环路存在一个问题。如果循环的流量非常密集,则网桥可能难以成功地传输终止环路的 BPDU。此问题可能会显著推迟收敛过程,在极端情况下甚至会使网络瘫痪。
有关如何在运行Cisco IOS软件的交换机上正确使用PortFast的详细信息,请参考文档使用PortFast和其他命令解决工作站启动连接延迟问题。
即使配置了 PortFast,端口或接口仍可参与 STP。如果网桥优先级低于当前活动根桥优先级的交换机连接到配置了 PortFast 的端口或接口,则可以将该交换机选为根桥。由于根桥发生改变,活动 STP 拓扑也会受到影响,致使网络性能下降。为防止出现这种情况,大多数运行Cisco IOS软件的Catalyst交换机都具有名为BPDU防护的功能。BPDU 防护可在配置了 PortFast 的端口或接口接收 BPDU 时将其禁用。
有关在运行Cisco IOS软件的交换机上使用BPDU防护功能的详细信息,请参考文档了解生成树PortFast BPDU防护增强功能。
不适当的 STP 参数调整和直径问题
max-age 参数的值过于积极和转发延迟可能会导致 STP 拓扑很不稳定。在此类情况下,丢失某些 BPDU 可能会产生环路。另一个不太为人所知的问题与桥接网络的直径有关。STP 计时器的默认值将最大网络直径保守的限制为 7。这个最大网络直径限制了网络中网桥相互之间可以相距多远。这种情况下,二个不同的网桥彼此相距不得超过 7 跳。造成此限制的部分原因来源于 BPDU 所具有的 age 字段。
当 BPDU 从根桥向树叶传播时,BPDU 每经过一个网桥,age 字段都会递增。最后,当 age 字段超过最大 age 值时,网桥即丢弃该 BPDU。如果根与网络的某些网桥距离过远,则可能出现此问题。此问题影响生成树的收敛。
如果要将 STP 计时器从默认值更改为其他值,请格外谨慎。如果您尝试通过这种方式快速实现重新收敛,则可能会面临风险。STP 计时器变动会影响网络的直径以及 STP 的稳定性。可以更改网桥优先级以选择根桥,还可以更改端口开销或优先级参数以控制冗余性和负载平衡。
Cisco Catalyst 软件为您提供可精细调整最重要的 STP 参数的各种宏:
- spanning-tree vlan number root { primary | secondary }命令降低网桥的优先级,以使该网桥成为根(或备用根)。此命令还有另一个选项,可通过指定网络直径调整 STP 计时器。即使正确完成后,调整计时器也不会显著改善收敛时间,反而会在网络中引入某些不稳定性的风险。此外,每当向网络中添加设备时,都必须更新这种调整。保留保守的默认值,网络工程师熟知这些值。
-
Cisco IOS软件的spanning-tree uplinkfast命令将提高交换机的优先级,以使该交换机不能成为根。在上行链路发生失效的情况下,该命令将增加 STP 收敛时间。请在与某些核心交换机具有双重连接的分发层交换机上使用此命令。请参考文档了解和配置 Cisco UplinkFast 功能。
-
Cisco IOS软件的spanning-tree backbonefast命令可以在间接链路故障的情况下增加交换机的STP聚合时间。BackboneFast 是 Cisco 的专有功能。请参考文档了解和配置Catalyst交换机上的Backbone Fast。
有关STP计时器和在确实必要时调整这些计数器的规则的详细信息,请参考文档了解和调整生成树协议计时器。
软件错误
正如简介中所提及,STP 是思科产品中实现的首批功能之一。此功能可望非常稳定。只有与较新功能(如 EtherChannel)的交互会导致 STP 在某些非常特殊的情况下失效,现已解决这些情况下失效的问题。多种不同的因素会导致软件 Bug,并且会造成多种不同的影响。无法详细介绍 Bug 可能会引入的问题。如果忽略某些BPDU,或者将阻塞端口转换为转发状态,则会出现软件错误导致的最危险情况。
排除故障
遗憾的是,没有系统化的过程可用于解决 STP 问题。但是,本部分总结了一些可供您使用的操作。本部分中的大多数步骤一般都适用于排除桥接环路故障。对于导致丢失连接的 STP 的其他故障,可使用更为常规的方法进行排查。例如,可以探查遇到问题的流量所采用的路径。
注意:这些故障排除步骤中的大多数假定要连接到网桥网络的不同设备。这种连接意味着您可以进行控制台访问。例如,在桥接环路期间,您可能无法建立远程连接。
如果您有思科设备的 show tech-support 命令输出,可以使用思科CLI分析器。
注意:只有思科注册用户才能访问思科内部工具和信息。
使用网络图
在排除桥接环路故障之前,您至少需要了解以下各项:
-
桥接网络的拓扑
-
根桥的位置
-
受阻端口和冗余链路的位置
至少有以下两个原因决定必须了解上述内容:
-
要了解网络中需要修复什么,必须了解网络正常工作时的情况。
-
大多数故障排除步骤都仅仅使用 show 命令尝试找出错误情况。对网络的了解有助于重点专注关键设备的重要端口。
识别桥接环路
过去,广播风暴可能会对网络造成灾难性影响。如今,有了高速链路和在硬件级别提供交换的设备,一台主机(如服务器)不太可能通过广播使网络瘫痪。识别桥接环路的最佳方法是在已饱和的链路上捕获流量,并检查是否多次发现相似的数据包。但实际上,如果某个网桥域中的所有用户同时遇到连接问题,则可以怀疑出现了桥接环路。
检查设备上的端口使用率,并查找异常值。请参考本文档的检查端口使用率部分。
快速恢复连接并为下次做好准备
禁用端口以断开环路
桥接环路会对网桥网络造成极为严重的后果。管理员一般没有时间寻找产生环路的原因,因此更愿意尽快恢复连接。这种情况下解决问题的简单方法是手动禁用在网络中提供冗余的每个端口。如果能确定网络中受影响最大的部分,则请开始禁用该区域中的端口。或者,如果可能,首先禁用可以阻塞的端口。每次禁用端口时,都请检查是否已恢复了网络中的连接。 通过识别哪个被禁用的端口终止了环路,还可以识别此端口所处的冗余路径。如果此端口被阻塞,您可能已经找到了出现故障的链路。
在托管受阻端口的设备上记录 STP 事件
如果无法准确地查明问题的来源,或如果问题只是暂时现象,则请在出现故障的网络的网桥和交换机上启用 STP 事件的日志记录。如果要限制要配置的设备数量,至少要在托管阻塞端口的设备上启用此日志记录;阻塞端口的转换会导致环路。
-
Cisco IOS软件—发出exec命令 debug spanning-tree events 以启用STP调试信息。发出常规配置模式命令 logging buffered 以在设备缓冲区中捕获该调试信息。
也可尝试将调试输出发送到 syslog 设备。遗憾的是,出现桥接环路时,很难与 syslog 服务器保持连接。
检查端口
首先调查的重要端口是阻塞端口。本部分列出了在不同端口上查找的内容,并快速介绍了为运行Cisco IOS软件的交换机发出的命令。
检查受阻端口是否收到 BPDU
尤其是对受阻端口和根端口,检查是否能定期收到 BPDU。有多种问题会导致端口故障,从而无法接收数据包或 BPDU。
-
Cisco IOS软件-在Cisco IOS软件版本12.0或更高版本中, show spanning-tree vlan <vlan-id> detail 命令的输出有BPDU字段。该字段向您显示每个接口收到的 BPDU 数。再发出一两次该命令,确定设备能否收到 BPDU。另一个选项是使用debug spanning-tree bpdu 命令启用STP调试以确认收到BPDU。
检查是否有双工不匹配的情况
要查找双工不匹配的情况,必须检查点对点链路的每一端。
-
Cisco IOS软件—发出 show interfaces [interface-number] status 命令,检查特定端口的速度和双工状态。
检查端口使用率
流量过载的接口可能无法传输重要的 BPDU。链路过载也表示可能有桥接环路。
-
Cisco IOS软件—使用命令 show interfaces 确定接口的使用率。有几个字段可帮助您做出判断,例如 load 和 packets input 或 packets output。请参考文档排除交换机端口和接口问题,以获得 show interfaces 命令输出的解释。
检查数据包损坏
-
Cisco IOS软件—查找 show interfaces 命令的input errors计数器中的错误增量。错误计数器包括 runts、giants、no buffer、CRC、frame、overrun 和 ignored 数量。
请参考文档排除交换机端口和接口问题,以获得 show interfaces command output.
查找资源错误
CPU 使用率过高对运行 STA 的系统可能很危险。请使用下面这个方法检查设备的 CPU 资源是否充足:
-
Cisco IOS 软件 - 发出 show processes cpu 命令。检查 CPU 使用率是否不太高。
Supervisor 引擎能处理的各种 STP 实例的数量有一定限制。确保不同 VLAN 的所有 STP 实例中逻辑端口的总数不超过每个 Supervisor 引擎类型和内存配置支持的最大数量。
对交换机发出show spanning-tree summary totals 命令,此命令在STP Active列中显示每个VLAN的逻辑端口或接口的数量。此列的底部显示总数。总数表示不同 VLAN 的所有 STP 实例中所有逻辑端口之和。请确保此数字不超出对每种 Supervisor 引擎支持的最大数量。
注意:计算交换机上逻辑端口总和的公式为:
(number of non-ATM trunks * number of active Vlans on that trunk) + 2*(number of ATM trunks * number of active Vlans on that trunk) + number of non-trunking ports
有关适用于 Catalyst 交换机的 STP 限制的汇总,请参考以下这些文档:
禁用不必要的功能
在排除故障时,您会尝试确定网络中当前存在哪些错误。请禁用尽可能多的功能。禁用有助于简化网络结构,并且便于发现问题。例如,EtherChannel功能要求STP将多个不同链路逻辑捆绑为单个链路;在故障排除过程中禁用此功能很有意义。通常,使配置尽可能简单会使问题的故障排除过程更加轻松。
有用的命令
Cisco IOS 软件命令
-
show interfaces
-
show spanning-tree
-
show bridge
-
show processes cpu
-
debug spanning-tree
-
logging buffered
设计 STP 以避免出现问题
了解根桥的位置
排除故障时经常会不了解根桥的位置。不要让 STP 决定哪个网桥是根桥。对于每个 VLAN,您通常都可以确定哪台交换机最适合作为根桥。这取决于网络的设计。一般情况下,选择位于网络中央位置、而且功能较强的网桥。如果将根桥放在网络中央,直接连接到服务器和路由器,通常能缩短客户端到服务器和路由器的平均距离。
此图显示:
-
如果网桥B是根桥,则网桥A或网桥C上的链路A到C会被阻塞。在这种情况下,连接到交换机B的主机可以分两跳访问服务器和路由器。连接到网桥 C 的主机通过 3 跳可以访问服务器和路由器。因此平均距离是两跳半。
-
如果网桥 A 是根桥,则 B 和 C 上连接的两台主机通过 2 跳即可到达路由器和服务器。现在的平均距离为两跳。
这个简单例子所揭示的逻辑同样适用于更为复杂的拓扑。
注意:对于每个VLAN,对根网桥和备用根网桥进行硬编码,同时减小STP priority参数的值。或者,可以使用 set spantree root 宏。
了解冗余的位置
规划冗余链路的组织结构。请忘记 STP 的即插即用功能。调整 STP cost 参数以决定哪些端口进行阻止。如果采用分层设计而且根桥所在的位置恰当,那么一般不需要调整该参数。
注意:对于每个VLAN,了解稳定网络中哪些端口可能阻塞。绘制网络图,清楚地显示网络中阻止了哪些端口形成环路的每个物理环路。
了解冗余链路的位置有助于发现偶然产生的桥接环路及其原因。此外,了解受阻端口的位置可确定错误的位置。
将阻塞端口的数量减到最小
STP 采取的唯一一项重要举措就是阻塞端口。只要有一个阻塞端口错误地过渡到转发状态,就可能使大部分网络瘫痪。避免产生使用 STP 的内在风险的一个好办法就是尽量减少受阻端口的数量。
修剪不使用的 VLAN
在桥接网络中,两个节点之间不需要二条以上的冗余链路。但是,此类配置很常见:
每台分发层交换机分别连接到两台核心层交换机。分发层交换机上连接的用户都只位于网络中可用 VLAN 的子集中。在本示例中,在Dist 2上连接的用户都在VLAN 2中;Dist 3仅连接VLAN 3中的用户。默认情况下,中继传输在VLAN中继协议(VTP)域中定义的所有VLAN。只有 Dist2 接收 VLAN3 中不必要的广播和多播流量,但是 Dist2 也正在阻止其用于 VLAN3 的端口之一。结果是 Core A 与 Core B 之间有三条冗余路径。这种冗余设置会导致许多端口被阻塞,形成环路的机率也更高。
注意:从中继修剪掉任何不需要的VLAN。
VTP 修剪可起到一定作用,但在网络的核心层中没有必要使用此类即插即用功能。
在本示例中,只使用了一个接入层 VLAN 将分发层交换机连接到核心层:
在此设计中,每个 VLAN 只阻塞了一个端口。此外,对于此设计,如果关闭 Core A 或 Core B,那么只需一步即可消除所有冗余链路。
使用第 3 层交换
第 3 层交换表示以接近交换的速度进行路由。路由器执行两项基本工作:
-
路由器构建转发表。路由器一般通过路由协议与对等点交换信息。
-
路由器接收数据包,并根据目标地址将其转发到正确的接口。
高端Cisco第3层交换机能够执行第3层功能,速度与第2层交换功能相同。如果引入路由跳跃,并创建网络的另一个分段,则不会损失速度。此图使用修剪不使用的 VLAN 部分中的示例作为基础:
Core A 和 Core B 现在是第 3 层交换机。Core A 和 Core B 之间不再桥接 VLAN 2 和 VLAN 3,因此不可能形成 STP 环路。
-
冗余仍然存在,但现在依靠第 3 层路由协议。该设计可确保实现比STP更快的重新收敛。
-
STP 不会再阻塞任何单个端口。因此,不可能再产生桥接环路。
-
速度没有损失,因为通过第3层交换离开VLAN的速度与VLAN内的桥接一样快。
此设计只有一个缺点。迁移到此类设计一般表示要重新制作寻址方案。
即使不必要也保留 STP
即使成功地从网络消除了所有受阻端口,并且没有任何物理冗余,也不要禁用 STP。STP通常不是非常占用处理器;在大多数Cisco交换机中,分组交换不涉及CPU。此外,每条链路发送的 BPDU 极少,不会显著降低可用带宽。但是,例如如果操作员在配线面板上操作错误,没有 STP 的桥接网络在几分之一秒内就可能瘫痪。通常,不值得冒此风险禁用桥接网络中的 STP。
使流量远离管理 VLAN,不要用单个 VLAN 覆盖整个网络
Cisco 交换机通常有一个 VLAN 绑定有 IP 地址,此 VLAN 即是管理 VLAN。在此 VLAN 中,交换机像普通的 IP 主机一样运行。具体而言,即每个广播或多播数据包都会转发到 CPU。管理 VLAN 中广播或多播流量的速率太高会对 CPU 造成不利影响,从而削弱 CPU 处理重要的 BPDU 的能力。因此,用户流量不应在管理 VLAN 上传输。
在较早的版本中,在Cisco实施中无法从TRUNK删除VLAN 1。VLAN 1 一般用作管理 VLAN,其中在同一 IP 子网内可以访问所有交换机。尽管此设置很有用,但也非常危险,因为 VLAN 1 上的桥接环路会影响所有中继,从而可能导致整个网络瘫痪。当然,无论您使用哪个 VLAN 都存在同样的问题。请尝试使用高速第 3 层交换机将桥接域分段。
从Cisco IOS软件版本12.1(11b)E起,您可以将VLAN 1从TRUNK中删除。VLAN 1 依然存在,但它会阻塞流量,以免形成环路。
相关信息