← 回到技术随笔
· 9953 字

H3C交换机二层环路排查与防护方法

以H3C S5570S和Comware V7为例,从端口灯、CPU、端口流量、STP、MAC漂移和环路检测逐步定位二层环路,并使用生成树、BPDU保护和环路检测降低故障再次发生的影响。

本文以 H3C S5570S 系列和 Comware V7 为主要示例,文中的 VLAN、接口和地址需要按现场实际信息替换。

一、二层环路可能出现的现象

办公区如果突然有多台电脑同时反映网络很慢,网关时通时不通,我会先到机柜查看交换机指示灯的状态。如果当时没有大流量业务,多个端口的指示灯却同步频繁闪烁,就应该怀疑出现了二层环路。二层环路通常会表现出以下现象:

  • 同一个 VLAN 内大量电脑同时变慢或断网;
  • 网关时通时不通,SSH 登录交换机也很卡;
  • 多个端口灯在业务量不大时仍然同时快速闪烁;
  • 交换机 CPU 使用率升高;
  • 一个或多个端口的广播、组播流量快速增加;
  • MAC 地址在两个端口之间反复移动;
  • STP 拓扑变化次数持续增加。

如果只有一台电脑不通,我会先按端口故障处理。二层环路更明显的特点,是同一个区域或 VLAN 内多台设备同时受到影响,而且交换机上的流量一直降不下来。

本文使用下面的示例:

项目 示例值
接入交换机 HQ-Access-01
业务 VLAN 10
VLAN 10 网关 192.168.10.1

二、先看端口灯,再保留管理入口

1. 先观察端口灯

到达机柜后,我先不登录交换机,直接看面板上的端口灯。哪几个端口一直快速闪烁、哪些端口闪烁节奏接近,这些现象只能先帮我判断是不是存在异常流量,还不能直接确定故障端口。

如果多个端口灯同时、高频闪烁,现场又没有大文件传输、备份或视频流量,就要怀疑广播报文正在大量转发。少数端口明显比其他端口闪得更快时,可以先记下端口号;如果所有端口都在闪,就必须通过全端口速率统计继续缩小范围。

正常的大流量业务同样会让端口灯快速闪烁,所以只看灯不能确定存在环路。端口灯的作用是帮助我找到可疑方向,后面还要结合 CPU、端口流量、STP、MAC 迁移和环路检测结果确认。

先把明显异常的端口号记下来,不要只看端口灯就拔线。后面还要结合端口用途和交换机状态进一步确认。

2. 保留管理入口

网络已经明显异常时,我不会先重启交换机。重启可能暂时让网络恢复,却会丢失部分现场信息,环路接线还在时也可能很快再次出现。

如果 Console 还能正常操作,就按后面的顺序检查。如果交换机已经严重卡顿,业务大面积中断,连基本命令也很难执行,可以根据刚才记录的端口号和现场接线,优先隔离已经确认用途的普通接入口。不能为了试错拔掉上联、服务器或管理网线。

通过 Console 口进入交换机后,先把设备时间、CPU 和端口状态记录下来:

# 确认设备当前时间,便于和日志对照。
<HQ-Access-01> display clock

# 查看CPU当前和历史使用情况。
<HQ-Access-01> display cpu-usage
<HQ-Access-01> display cpu-usage history

# 快速查看所有端口状态和说明。
<HQ-Access-01> display interface brief description

CPU 高只能说明交换机负载异常,不能单独证明存在环路。还要继续看端口流量和二层状态。

三、从所有端口中找出异常方向

刚开始还不知道故障在哪个端口,先查看所有在线端口最近一个统计周期的收发速率:

# 查看所有在线端口的入方向速率,包括广播和组播包速率。
<HQ-Access-01> display counters rate inbound interface

# 查看所有在线端口的出方向速率。
<HQ-Access-01> display counters rate outbound interface

先比较 Usage (%)Total (pps)Broadcast (pps)Multicast (pps)。环路发生时,几个相关端口的包速率和广播包速率通常会明显高于其他端口。

本文假设经过全端口对比后,GigabitEthernet1/0/23GigabitEthernet1/0/24 的流量最异常。从这一步开始,才把它们列为可疑端口,再查看详细统计:

# 查看23号端口的收发流量、广播、组播、丢包和错误统计。
<HQ-Access-01> display interface GigabitEthernet 1/0/23

# 查看24号端口的相同信息,便于对比。
<HQ-Access-01> display interface GigabitEthernet 1/0/24

重点观察:

  • 当前输入、输出速率是否接近端口带宽;
  • 广播和组播报文是否持续快速增加;
  • 是否出现大量丢包;
  • 接口是否频繁 UPDOWN
  • 端口说明是否与实际连接设备一致。

不要只凭累计计数判断。运行时间较长的端口本来就可能积累很多广播报文,应隔几秒再次执行命令,看计数和速率是否还在快速增加。

再看端口后面学习到了多少 MAC:

# 查看两个端口学到的动态MAC数量。
<HQ-Access-01> display mac-address dynamic interface GigabitEthernet 1/0/23 count
<HQ-Access-01> display mac-address dynamic interface GigabitEthernet 1/0/24 count

# 查看设备启动后的MAC迁移记录。
<HQ-Access-01> display mac-address mac-move

普通电脑端口突然学到大量 MAC,或者同一批 MAC 在两个端口之间持续移动,说明这两个端口后面可能存在重复的二层路径。

四、检查 STP 有没有发现异常

1. 查看端口角色和状态

# 查看生成树整体状态和端口角色。
<HQ-Access-01> display stp brief

# 查看两个可疑端口的详细生成树信息。
<HQ-Access-01> display stp interface GigabitEthernet 1/0/23
<HQ-Access-01> display stp interface GigabitEthernet 1/0/24

正常冗余链路中,STP 会根据拓扑阻塞一条重复路径。如果两条重复链路都处于转发状态,就要检查:

  • 端口是否关闭了 STP;
  • 下联设备是否支持并正常转发 BPDU;
  • 两根网线是否属于同一个 VLAN;
  • 上联是否应该配置为链路聚合;
  • 是否存在电脑网桥或非网管交换机形成的环路。

2. 查看拓扑变化

# 查看各端口收发的TC和TCN统计。
<HQ-Access-01> display stp tc

# 查看端口角色变化历史。
<HQ-Access-01> display stp history

# 查看被生成树保护功能阻塞过的异常端口。
<HQ-Access-01> display stp abnormal-port

TC 表示生成树拓扑发生变化。某个端口的接收计数持续增加,说明拓扑还在频繁变化,但端口正常上下线也会产生 TC,所以仍要结合时间、端口流量和现场接线判断。

五、使用环路检测定位端口

先查看设备是否已经开启环路检测,以及当前检测到了哪些端口:

# 查看环路检测配置和状态。
<HQ-Access-01> display loopback-detection

如果输出列出了接口和 VLAN,说明设备已经收到自己发出的环路检测报文。相比只看 CPU 或广播计数,这条信息更直接。

设备默认没有全局开启环路检测。现场没有配置时,可以先针对出现问题的业务 VLAN 开启检测,只生成日志,不设置自动关闭动作:

<HQ-Access-01> system-view

# 在业务VLAN 10中全局开启环路检测。
# 默认检测周期为30秒,发现环路时先记录日志,不自动关闭端口。
[HQ-Access-01] loopback-detection global enable vlan 10
[HQ-Access-01] return

# 再次查看检测结果。
<HQ-Access-01> display loopback-detection

不要为了省事直接写 vlan all。应先从发生问题的业务 VLAN 开始,确认检测结果和设备负载后再决定是否扩大范围。

这时开启的环路检测先不要保存。故障处理完成后,再根据测试结果决定保留还是撤销。

六、确认端口用途后再隔离

如果检测结果和端口流量都指向 GigabitEthernet1/0/24,我不会马上拔线或关闭端口,先检查它到底接了什么:

# 查看端口配置和对端LLDP信息。
<HQ-Access-01> display current-configuration interface GigabitEthernet 1/0/24
<HQ-Access-01> display lldp neighbor-information interface GigabitEthernet 1/0/24 verbose

# 如果它可能是聚合成员,先检查聚合关系。
<HQ-Access-01> display link-aggregation summary

# 假设汇总结果显示端口属于聚合组1,再查看该聚合组的详细信息。
<HQ-Access-01> display link-aggregation verbose bridge-aggregation 1

确认它是影响范围较小的普通接入口后,才临时关闭:

<HQ-Access-01> system-view
[HQ-Access-01] interface GigabitEthernet 1/0/24

# 临时关闭可疑的普通接入口。
[HQ-Access-01-GigabitEthernet1/0/24] shutdown
[HQ-Access-01-GigabitEthernet1/0/24] return

下面这些端口不能直接关闭:

  • 当前管理流量经过的端口;
  • 交换机上联口;
  • 聚合接口的成员端口;
  • 服务器、无线控制器和防火墙端口;
  • 用途尚未确认的端口。

关闭后马上复查:

# 查看CPU和全端口流量是否恢复。
<HQ-Access-01> display cpu-usage
<HQ-Access-01> display counters rate inbound interface
<HQ-Access-01> display counters rate outbound interface

# 继续查看另一个可疑端口的详细流量。
<HQ-Access-01> display interface GigabitEthernet 1/0/23

# 查看环路检测和MAC迁移是否停止。
<HQ-Access-01> display loopback-detection
<HQ-Access-01> display mac-address mac-move

# 查看STP拓扑变化是否趋于稳定。
<HQ-Access-01> display stp tc

# 测试交换机到网关的通信。
<HQ-Access-01> ping 192.168.10.1

如果网络没有改善,应恢复端口,再检查其他方向:

<HQ-Access-01> system-view
[HQ-Access-01] interface GigabitEthernet 1/0/24
[HQ-Access-01-GigabitEthernet1/0/24] undo shutdown
[HQ-Access-01-GigabitEthernet1/0/24] return

七、找到网线和设备上的真正原因

交换机只能帮助定位端口,最终还要沿着网线检查下联设备。常见情况包括:

1. 小交换机接了两根上联网线

普通小交换机没有配置链路聚合,两根网线同时接入公司网络后容易形成环路。保留规划中的一根上联,拔掉另一根。

2. 两台交换机之间的双链路没有聚合

如果确实需要两根上联,应在两端配置相同的动态聚合,并确认成员端口为 Selected。两根普通 Trunk 网线并行连接时,只有 STP 正常工作并阻塞其中一条链路才不会形成持续环路,不能在没有聚合、STP 又未生效的情况下直接并行连接。

3. 网线绕回本交换机

装修、跳线或临时调整时,可能把两个墙面信息点或配线架端口互相连通。按端口说明查不到时,需要现场逐根拔插确认。

4. 电脑或服务器开启了网桥

双网卡设备把两个有线接口桥接后,也可能把两个交换机端口连成二层路径。关闭不需要的系统网桥,只保留规划中的连接方式。

修正物理连接后,再恢复之前临时关闭的端口,并观察一段时间。

八、问题处理后的防范措施

环路接线已经修正、业务恢复正常后,我会从生成树和接入口保护两方面增加防范措施。生成树主要处理交换机之间的重复链路,环路检测则可以继续检查普通接入口后面的网线回接或小交换机环路,两者不能互相替代。

1. 先确认并启用生成树

# 查看生成树是否运行,以及各端口当前的角色和状态。
<HQ-Access-01> display stp brief

# 查看生成树的模式、根桥和拓扑变化等详细信息。
<HQ-Access-01> display stp

如果交换机之间存在多条二层链路,应该先规划生成树模式和根桥,再确认所有相关交换机都能正常收发 BPDU。本文只给出启用生成树的基础命令:

<HQ-Access-01> system-view

# 全局启用生成树。
[HQ-Access-01] stp global enable

在已有网络中首次启用生成树,端口状态和转发路径可能发生变化,短时间内也可能出现拓扑收敛。不能只在其中一台交换机上直接照搬,应先确认整条二层链路的现有配置和回退方法。

2. 保护确认过的终端接入口

下面以直接连接普通办公电脑的 GigabitEthernet1/0/1 为例:

# 全局启用BPDU保护。
# 被设置为边缘端口的接口如果收到BPDU,交换机会关闭该接口。
[HQ-Access-01] stp bpdu-protection

# 进入已经确认只连接普通电脑的接入口。
[HQ-Access-01] interface GigabitEthernet 1/0/1

# 将当前接口设置为边缘端口。
[HQ-Access-01-GigabitEthernet1/0/1] stp edged-port
[HQ-Access-01-GigabitEthernet1/0/1] quit

边缘端口只能配置在已经确认直接连接终端的接口上,不能配置在交换机上联、下联、聚合成员或用途不明的端口上。有人把小交换机接到受保护的终端口并形成新的交换路径时,接口收到 BPDU 后会被关闭,从而缩小故障影响。

3. 使用环路检测补充保护

第五章如果已经临时开启了 VLAN 10 的环路检测,这里不需要重复配置。确认检测结果正常后,可以保留全局检测;如果前面没有开启,则先执行下面的全局命令,再给经过测试的普通接入口增加自动关闭动作:

# 前面没有开启时,才执行这条全局命令。
[HQ-Access-01] loopback-detection global enable vlan 10

# 只给确认过的普通接入口设置自动关闭动作。
[HQ-Access-01] interface GigabitEthernet 1/0/1
[HQ-Access-01-GigabitEthernet1/0/1] loopback-detection action shutdown
[HQ-Access-01-GigabitEthernet1/0/1] quit

发现环路后,交换机会记录日志并关闭这个接入口。端口会按照设备的 shutdown-interval 定时恢复;如果环路仍在,恢复后可能再次被关闭。

边缘端口和 BPDU 保护不能直接用于交换机下联等需要收发 BPDU 的端口。环路检测自动关闭也应先选一个普通接入口测试,但一个端口学习到多个 MAC 并不会因此被判断为环路。

正式交换机之间的双链路如果用于增加带宽和可靠性,还要按规划配置链路聚合,不能用 STP 代替聚合。

九、验证和回退

1. 验证

# 确认没有端口处于环路状态。
<HQ-Access-01> display loopback-detection

# 确认STP状态稳定。
<HQ-Access-01> display stp brief
<HQ-Access-01> display stp tc

# 查看是否有端口被STP保护功能关闭。
<HQ-Access-01> display stp down-port

# 确认MAC不再频繁移动。
<HQ-Access-01> display mac-address mac-move

# 确认CPU和全端口流量恢复正常。
<HQ-Access-01> display cpu-usage

<HQ-Access-01> display counters rate inbound interface
<HQ-Access-01> display counters rate outbound interface

# 检查原来的两个可疑端口。
<HQ-Access-01> display interface GigabitEthernet 1/0/23
<HQ-Access-01> display interface GigabitEthernet 1/0/24

# 检查新增防护的测试端口。
<HQ-Access-01> display interface GigabitEthernet 1/0/1

还要从原来受影响的电脑连续测试网关、内网系统和实际业务。交换机状态恢复只能证明二层设备没有继续显示异常,不能代替终端测试。

2. 回退本次防护配置

如果测试发现业务受到影响,可以撤销本次新增的边缘端口、BPDU 保护和环路检测配置:

<HQ-Access-01> system-view
[HQ-Access-01] interface GigabitEthernet 1/0/1

# 撤销当前接口的边缘端口设置。
[HQ-Access-01-GigabitEthernet1/0/1] undo stp edged-port

# 恢复环路检测的默认处理方式,只记录日志,不自动关闭。
[HQ-Access-01-GigabitEthernet1/0/1] undo loopback-detection action
[HQ-Access-01-GigabitEthernet1/0/1] quit

# 只有BPDU保护确实是本次新增时,才撤销全局配置。
[HQ-Access-01] undo stp bpdu-protection

# 只有VLAN 10的全局环路检测确实是本次新增时,才撤销它。
[HQ-Access-01] undo loopback-detection global enable vlan 10
[HQ-Access-01] return

如果生成树原来已经启用,不能为了回退本次接入口保护而关闭它。如果确认生成树是本次启用,而且关闭后不会恢复原来的环路风险,才执行下面的命令:

<HQ-Access-01> system-view

# 仅在确认可以关闭生成树时执行。
[HQ-Access-01] undo stp global enable
[HQ-Access-01] return

验证和回退完成后,只有实际保留了配置变更才执行 save force

十、Comware V5 配置

H3C S5500 Comware V5 Release 2208 启用生成树和配置边缘端口的命令与 V7 不同:

<HQ-Access-01> system-view

# V5使用这条命令全局启用生成树。
[HQ-Access-01] stp enable

# 全局启用BPDU保护。
[HQ-Access-01] stp bpdu-protection

# 进入确认过的普通终端接入口。
[HQ-Access-01] interface GigabitEthernet 1/0/1

# V5配置边缘端口时需要加enable。
[HQ-Access-01-GigabitEthernet1/0/1] stp edged-port enable
[HQ-Access-01-GigabitEthernet1/0/1] quit

V5 的环路检测也与 V7 不同,需要在系统视图和指定端口视图分别开启:

<HQ-Access-01> system-view

# 全局开启端口环回检测。
[HQ-Access-01] loopback-detection enable

# 进入需要保护的普通接入口。
[HQ-Access-01] interface GigabitEthernet 1/0/1

# 在当前端口开启环回检测。
[HQ-Access-01-GigabitEthernet1/0/1] loopback-detection enable

# 检测到环回后关闭当前端口。
[HQ-Access-01-GigabitEthernet1/0/1] loopback-detection action shutdown
[HQ-Access-01-GigabitEthernet1/0/1] quit

如果 V5 设备的 Trunk 或 Hybrid 端口确实需要检测所有允许通过的 VLAN,还要使用对应的受控和逐 VLAN 检测命令:

[HQ-Access-01] interface GigabitEthernet 1/0/49

# 允许环回检测控制Trunk端口状态。
[HQ-Access-01-GigabitEthernet1/0/49] loopback-detection control enable

# 检测Trunk允许通过的所有VLAN。
[HQ-Access-01-GigabitEthernet1/0/49] loopback-detection per-vlan enable

Trunk 通常是上联或重要主干,不能直接照搬普通接入口的自动关闭策略。是否启用受控功能,应根据拓扑和回退条件单独决定。

十一、小结

二层环路通常影响一批设备,不是单台电脑故障。到达现场后先观察端口灯,用持续、高频、同步闪烁的端口寻找可疑方向,再保留 Console,检查 CPU、端口流量、STP、MAC 迁移和环路检测结果。

真正隔离端口前,要先确认它不是上联、聚合成员和管理路径。关闭后立即复查 CPU、广播流量、MAC 迁移和业务;没有改善就恢复端口,不能连续盲目关闭。

处理完故障后,还要根据网络拓扑正确启用 STP,只把确认过的终端接入口设置为边缘端口并启用 BPDU 保护,再用环路检测补充普通接入口的防护。链路聚合和规范接线仍然是避免二层环路的基础。

完整配置汇总

下面汇总 Comware V7 的基础防护配置。示例只保护 VLAN 10 中直接连接普通电脑的接入口,不能直接应用到上联、下联和聚合成员端口。启用生成树前,还要先检查现有拓扑、生成树模式和根桥规划。

# 先记录当前生成树状态。
<HQ-Access-01> display stp brief
<HQ-Access-01> display stp

<HQ-Access-01> system-view

# 全局启用生成树。
[HQ-Access-01] stp global enable

# 全局启用BPDU保护。
# 边缘端口收到BPDU后会被关闭。
[HQ-Access-01] stp bpdu-protection

# 在业务VLAN 10中全局开启环路检测。
# 使用默认30秒检测周期。
[HQ-Access-01] loopback-detection global enable vlan 10

# 进入确认过的普通办公电脑接入口。
[HQ-Access-01] interface GigabitEthernet 1/0/1

# 将接口设置为边缘端口。
[HQ-Access-01-GigabitEthernet1/0/1] stp edged-port

# 检测到接口后面的环路时,自动关闭该接口。
[HQ-Access-01-GigabitEthernet1/0/1] loopback-detection action shutdown
[HQ-Access-01-GigabitEthernet1/0/1] quit
[HQ-Access-01] return

# 检查环路、STP、MAC迁移、CPU和接口流量。
<HQ-Access-01> display loopback-detection
<HQ-Access-01> display stp brief
<HQ-Access-01> display stp tc
<HQ-Access-01> display stp down-port
<HQ-Access-01> display mac-address mac-move
<HQ-Access-01> display cpu-usage
<HQ-Access-01> display counters rate inbound interface
<HQ-Access-01> display counters rate outbound interface
<HQ-Access-01> display interface GigabitEthernet 1/0/23
<HQ-Access-01> display interface GigabitEthernet 1/0/24
<HQ-Access-01> display interface GigabitEthernet 1/0/1

# 终端业务验证通过后保存。
<HQ-Access-01> save force

参考资料