
交换机在网络中的角色是二层转发核心但当两台交换机之间同时存在两条或更多物理链路时网络里就会形成环路。环路会让广播帧不断复制放大最终把 CPU 和带宽耗尽导致整个二层网络瘫痪。为了解决这个问题STP生成树协议会出现并阻塞冗余链路但引入 VLAN 之后情况变得更复杂不同 VLAN 的广播域、Trunk 放行列表、Native VLAN、生成树实例之间都会互相影响。很多实际故障不是“冗余链路没配”而是“VLAN 没有跟随冗余链路一起规划”。下面围绕交换机的冗余链路 VLAN 配置从原理、拓扑、配置到验证和排错逐步展开。1. 先理解冗余链路为什么必须和 VLAN 一起设计1.1 冗余链路的意义不只是“多一根线”两台交换机之间连两条线表面上是为了“一条断了还有另一条”。但二层交换机不像三层路由器可以靠动态路由协议自动切换路径交换机默认会盲目转发广播帧和未知单播帧。如果不做任何控制两条链路同时工作就会形成二层环路。生成树协议STP解决的是“环路”和“冗余”之间的矛盾通过阻塞某一个冗余端口让网络逻辑上是一棵树物理上仍有备份链路。也就是说冗余链路必须依赖 STP 或链路聚合这类机制才能变成可用的备份方案。1.2 VLAN 改变了 STP 的决策范围VLAN 会把一台交换机切成多个广播域。一个 Trunk 端口承载多个 VLAN 时每个 VLAN 的广播域都需要独立看待。在 Cisco 设备上PVST/PVST 会为每个 VLAN 运行一个生成树实例在华为、华三设备上常用 MSTP 把多个 VLAN 映射到一个实例。不同厂商的做法不同但核心问题是一致的冗余链路上放行了哪些 VLAN。这些 VLAN 在 STP 计算中是否属于同一个实例。Native VLAN 配置是否一致。冗余链路切换之后VLAN 流量能否在备份链路上正常通过。实际项目中最常见的错误是只配了 Trunk没有检查“两个交换机上 VLAN 是否存在”和“生成树实例是否覆盖所有 VLAN”。结果就是主链路出现故障后备份链路没有变成转发状态或备份链路虽然在转发但 VLAN 报文带错标签导致业务中断。1.3 冗余链路的 VLAN 配置目标在一个典型的冗余链路场景中配置目标可以拆成三条主链路正常时VLAN 流量走主链路备份链路被 STP 阻塞。主链路故障时备份链路快速进入转发状态承载所有已规划 VLAN。如果用链路聚合替代 STP则两条物理链路合并为一条逻辑链路不再存在环路VLAN 流量由聚合组共同负载。后面的配置会围绕这三个目标展开。2. 网络拓扑与实验环境准备2.1 最小拓扑两台交换机两条 Trunk以两台三层交换机为例拓扑如下PC-A (VLAN 10) --- [Switch A] --- G0/0/1 --- [Switch B] --- PC-B (VLAN 10) | | ----------- G0/0/2 -----------------Switch A 和 Switch B 之间使用 G0/0/1、G0/0/2 两条物理链路作为冗余链路。两条链路都要配置为 Trunk。VLAN 10 用于业务终端VLAN 20 用于服务器或管理业务。PC-A 属于 VLAN 10PC-B 属于 VLAN 10。实际调试时会让 PC-A 持续 ping PC-B通过观察丢包和恢复时间判断冗余效果。这个拓扑同时适合 STP 和链路聚合两种方案。为了突出“冗余链路的 VLAN 配置方法”下面会先按 STP 思路配置再在第五节改成 Eth-Trunk / EtherChannel 思路。2.2 实验环境真机、eNSP 还是 GNS3如果手头有华为交换机可以用 eNSP 模拟器快速验证如果熟悉思科则可以用 Packet Tracer 或 GNS3。不同厂商命令不同但原理一致。下面配置示例会分别给出华为 VRP 和思科 IOS 的写法方便对照。实验环境建议如下项目建议值说明模拟器eNSP / GNS3 / Packet Tracer学习阶段用模拟器即可交换型号华为 S5700 或 思科 2960/3560两层交换机也能完成主要验证连接方式两条交叉线或直通线现代交换机端口自适应连接线序影响不大终端两台 PC分别测 VLAN 10 和 VLAN 20验证跨交换机同 VLAN 通信模拟器环境里要特别注意端口编号。eNSP 中常见 GE 0/0/1GNS3 中常见 GigabitEthernet0/1思科 IOS 交换机常见 GigabitEthernet0/1 或 FastEthernet0/1。下文使用 G0/0/1、G0/0/2 表示实际配置时替换为对应端口。3. 冗余链路中的 VLAN 与 Trunk 基础配置3.1 在两台交换机上创建一致的 VLAN无论在哪个厂商设备上冗余链路两端必须存在相同的 VLAN。如果 VLAN 只在 Switch A 上创建Switch B 上没有Trunk 即使放行该 VLAN也会因为接收端没有 VLAN 而默认丢弃。华为 VRP 创建 VLAN 的示例system-view vlan batch 10 20 quit思科 IOS 创建 VLAN 的示例configure terminal vlan 10 name business exit vlan 20 name server exit在两台交换机上都要执行。创建之后可以用display vlan brief或show vlan brief检查。很多工程师只检查 Trunk 配置忽略了 VLAN 必须全局存在这是第一个排查点。3.2 端口划入 VLAN终端侧端口需要划入指定 VLAN。假设 Switch A 的 G0/0/1 下联 PC-A但这里注意G0/0/1 在上图中是交换机之间链路因此不能把 G0/0/1 当作终端口。实际拓扑中交换机之间链路使用 G0/0/1 和 G0/0/2终端口可以另选端口例如 Switch A 的 GigabitEthernet0/0/10 接 PC-A。华为 VRPsystem-view interface GigabitEthernet0/0/10 port link-type access port default vlan 10 quit思科 IOSconfigure terminal interface GigabitEthernet0/10 switchport mode access switchport access vlan 10 exit这里要注意一个容易混淆的点华为交换机的port default vlan在 Access 模式下就是端口所属 VLAN而在 Trunk 模式下会变成 Native VLAN 的 PVID。思科中switchport access vlan只对 Access 端口生效Trunk 端口则使用switchport trunk native vlan和switchport trunk allowed vlan。3.3 两条冗余链路都配成 Trunk交换机之间链路承载多个 VLAN因此端口必须配置为 Trunk。华为 VRP 配置 G0/0/1 和 G0/0/2interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 quit interface GigabitEthernet0/0/2 port link-type trunk port trunk allow-pass vlan 10 20 quit华为 VRP 中Trunk 端口默认放行 VLAN 1其他 VLAN 需要用port trunk allow-pass vlan手动放行。默认 Native VLAN 是 VLAN 1可以通过port trunk pvid vlan修改。pvid表示端口缺省 VLANTrunk 收到不带 802.1Q 标签的帧时会打上这个 VLAN 的标签进入交换芯片。思科 IOS 配置两条链路的写法interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan 10,20 exit interface GigabitEthernet0/2 switchport mode trunk switchport trunk allowed vlan 10,20 exit思科 IOS 默认switchport mode trunk会放行所有 VLAN使用allowed vlan可以收紧放行范围。重点在于两条冗余链路上的 Trunk 配置必须完全一致否则 STP 切换后流量可能被备份链路拒绝。3.4 Native VLAN 的影响Native VLAN 是 Trunk 上不带标签的 VLAN。两端的 Native VLAN 必须一致否则会产生二层环路或 VLAN 泄漏。在实际网络中建议不要把业务 VLAN 设置为 Native VLAN默认保留 VLAN 1 或单独规划一个管理 VLAN。华为 VRP 修改 PVID 示例interface GigabitEthernet0/0/1 port link-type trunk port trunk pvid vlan 10思科 IOS 修改 Native VLAN 示例interface GigabitEthernet0/1 switchport trunk native vlan 10如果一台交换机把 Native VLAN 改成 10另一台保持默认 VLAN 1两边看到的不带标签帧就属于不同 VLAN。这个问题往往不会让链路立即断开而是表现为部分广播帧行为异常排查难度较高。4. 生成树协议下的冗余链路 VLAN 配置4.1 为什么冗余链路必须开 STP两条 Trunk 同时工作会让 VLAN 10 和 VLAN 20 在 Switch A、Switch B 之间形成环路。开启 STP 后交换机会通过桥 ID、端口优先级、端口开销计算出根桥和根端口并将其中一个冗余端口置为 Discarding/Blocking 状态从而打破环路。华为交换机默认可能没有开启 STP需要手动确认。思科交换机默认通常开启 PVST但具体版本不同。生产环境应统一规划生成树模式。4.2 华为交换机配置 RSTP 或 MSTP对于只有两个 VLAN 的最小拓扑使用 RSTP 即可。RSTP 收敛速度比 STP 快适合冗余链路切换。华为 VRPsystem-view stp mode rstp stp enable查看生成树状态display stp brief display stp interface GigabitEthernet0/0/1如果希望 VLAN 的路径规划更精细可以使用 MSTP。MSTP 可以把多个 VLAN 映射到同一个生成树实例减少实例数量。配置方式system-view stp mode mstp stp region-configuration region-name TEST instance 1 vlan 10 20 active region-configuration quit这里把 VLAN 10 和 VLAN 20 映射到实例 1。MSTP 域名称、修订号、实例映射必须在两台交换机上完全一致否则生成树实例无法协商。4.3 思科交换机配置 PVST 或 RSTP思科交换机默认使用 PVST。PVST 会为每个 VLAN 运行一个生成树实例灵活性高但交换机数量多时开销大。思科 IOSspanning-tree mode rapid-pvst spanning-tree vlan 10,20 root primary查看生成树状态show spanning-tree show spanning-tree vlan 10在 PVST 模式下STP 决策是基于每个 VLAN 的。VLAN 10 和 VLAN 20 可能有不同的根桥、不同的阻塞端口。如果两条冗余链路只放行了部分 VLAN就会出现“VLAN 10 走 G0/0/1VLAN 20 走 G0/0/2”的效果这种负载分担在冗余链路上也可以接受但前提是放行列表和端口状态都经过验证。4.4 让根桥和阻塞端口符合预期STP 阻塞哪个端口由桥 ID 和端口开销决定。为了让冗余行为可控通常把一台交换机设置为根桥另一台设置为备份根桥并且可以通过修改端口开销手工指定主链路。华为 VRP 设置根桥system-view stp root primary或指定优先级stp priority 4096设置备份根桥stp root secondary思科 IOS 设置根桥spanning-tree vlan 10 root primary spanning-tree vlan 20 root secondary如果希望 G0/0/1 为主链路、G0/0/2 为备份链路可以调大备份端口开销。华为interface GigabitEthernet0/0/2 stp cost 20000思科interface GigabitEthernet0/2 spanning-tree cost 20000端口开销越大端口被选为转发端口的可能性越低。这样 G0/0/2 通常会进入 Discarding 状态G0/0/1 负责转发。主链路断开后交换机重新计算G0/0/2 进入 ForwardingVLAN 流量切换到备份链路。4.5 生成树安全功能冗余链路端口建议开启根保护或环路保护。根保护可以防止新接入的交换机抢占根桥环路保护可以防止单向链路故障导致的转发异常。华为interface GigabitEthernet0/0/1 stp root-protection quit interface GigabitEthernet0/0/2 stp root-protection思科interface GigabitEthernet0/1 spanning-tree guard root如果端口频繁在 Discarding 和 Forwarding 之间抖动需要同时检查 BPDU 报文、端口双工模式和线缆质量。5. 用链路聚合替代 STP让两条链路同时工作5.1 链路聚合与 STP 的取舍STP 的缺点是备份链路在正常情况下是阻塞的主链路故障切换需要几百毫秒甚至几秒。如果既想冗余又希望两条链路都能转发流量可以考虑链路聚合EtherChannel / Eth-Trunk。链路聚合将多条物理链路合并为一条逻辑链路交换机把这个聚合端口当作一个生成树端口。这样不会形成环路不需要 STP 阻塞端口所有成员链路可以同时转发。VLAN 流量在成员链路之间基于哈希算法分担。冗余切换时如果聚合组内某条物理链路故障流量会重新哈希到剩余成员链路切换速度通常快于 STP。链路聚合适合两条链路都在同两台交换机之间、带宽需求较高的场景。5.2 华为 Eth-Trunk 配置华为交换机把链路聚合称为 Eth-Trunk。先把两个物理口加入一个 Eth-Trunksystem-view interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 10 20 quit interface GigabitEthernet0/0/1 eth-trunk 1 quit interface GigabitEthernet0/0/2 eth-trunk 1 quit推荐使用 LACP 模式便于检测成员链路状态。华为默认方式可能为静态负载均衡使用 LACP 时配置interface Eth-Trunk1 mode lacp-static查看状态display eth-trunk 1 display lacp statistics Eth-Trunk 1关键点Eth-Trunk 下配置 Trunk 和放行 VLAN而不是在物理口上单独配置。如果先在物理口上配置 Trunk再加入 Eth-Trunk会导致配置冲突。新增成员端口时物理口必须是二层口且不能单独携带 VLAN 配置。5.3 思科 EtherChannel 配置思科交换机支持 PAgP思科私有和 LACP公开标准。推荐 LACPinterface range GigabitEthernet0/1-2 channel-group 1 mode active exit interface Port-channel1 switchport mode trunk switchport trunk allowed vlan 10,20 exit注意思科要求 Port-channel 接口的 VLAN 配置和成员端口一致。实际项目中常见错误是先配置物理端口 Trunk 并放行 VLAN再创建 Port-channel导致两个成员口之间 VLAN 配置不一致链路聚合起不来。建议统一先在物理口上设置switchport再创建逻辑口。5.4 VLAN 负载分担与哈希算法链路聚合不是简单地把所有 VLAN 流量“平均”分配而是根据源 MAC、目的 MAC、IP 地址等参数计算哈希决定报文走哪条成员链路。每个厂商默认哈希键值不同。华为可以在 Eth-Trunk 下配置interface Eth-Trunk1 load-balance dst-ip思科可以配置port-channel load-balance src-dst-ip如果两个 VLAN 的流量较少哈希可能把多数报文分到同一条物理链路另一条链路空闲。这不影响冗余但会影响带宽利用率的判断。5.5 链路聚合与 VLAN 配置的注意事项链路聚合和 STP 最大的区别是STP 会主动阻塞冗余端口而链路聚合要求两端所有成员链路配置一致。不一致的典型现象是聚合组无法 Up成员端口停留在 Down 或 Suspend 状态。必须一致的项目包括配置项一致性要求不一致时的表现VLAN 放行列表两端 Eth-Trunk 必须一致聚合协商失败或部分 VLAN 不通Native VLAN / PVID两端必须一致聚合端口异常或广播风暴端口速率和双工成员端口尽量一致协商失败聚合不稳定二层/三层模式所有成员必须相同端口无法加入聚合组STP 模式两端建议一致生成树实例不一致BPDU 处理异常在华为设备上成员口需要先加入 Eth-Trunk再在 Eth-Trunk 上配置 Trunk。如果先配物理口会提示端口状态冲突。在思科设备上则要先switchport mode trunk再channel-group顺序不同结果也可能不同。6. 运行验证与故障切换测试6.1 验证 VLAN 和 Trunk 状态配置完成后先用最简单的命令确认“VLAN 是否存在、Trunk 是否放行”。华为display vlan brief display port trunk display interface Trunk思科show vlan brief show interfaces trunk show interfaces switchport预期结果VLAN 10、VLAN 20 位于display vlan brief列表中Trunk 端口状态为 Up允许通过的 VLAN 列表中包含 10 和 20Native VLAN / PVID 与配置一致。6.2 验证 STP 状态华为display stp brief预期结果G0/0/1 和 G0/0/2 中一个端口状态为 Forwarding另一个为 Discarding。如果两个都 Forwarding说明 STP 未生效或两个端口不在同一个生成树实例中。思科show spanning-tree预期结果每个 VLAN 实例中只有一个冗余端口处于 Blocking 状态。如果两个端口都 ForwardingVLAN 10 和 VLAN 20 可能出现环路。6.3 验证 Eth-Trunk 状态华为display eth-trunk 1预期结果Eth-Trunk1 状态为 Up两个成员端口都处于 Selected 状态。思科show etherchannel summary show port-channel 1 trunk预期结果Port-channel1 状态为 SULayer2 Up两个物理口都显示为 Pin port-channel。6.4 主备切换测试方法最直接的方法是让 PC-A ping PC-B然后拔掉主链路。观察丢包数和恢复时间。对于 STP 冗余链路RSTP 收敛通常在 1 到 2 秒以内实验中会看到少量丢包之后 ping 恢复。如果 ping 一直不通需要检查备份端口是否进入 Forwarding、备份 Trunk 的 VLAN 放行列表是否正确。对于 Eth-Trunk拔掉其中一条成员链路时PC 会看到极少丢包甚至不丢包因为剩余链路继续转发。如果拔掉的是全部成员链路流量自然中断。在交换机的控制台也可以直接 shutdown 主端口进行测试interface GigabitEthernet0/0/1 shutdown测试结束后重新打开端口观察 STP 是否让流量回到主链路。7. 冗余链路 VLAN 配置的常见错误与排查路径7.1 两端 VLAN 列表不一致现象主链路正常时业务没有异常拔掉主链路后备份链路不转发 VLAN 10 流量。原因备份 Trunk 的allowed vlan或allow-pass vlan列表没有包含 VLAN 10。排查命令华为display port trunk思科show interfaces trunk处理方式在备份链路上同样放行 VLAN 10 和 20并确保两台交换机都创建了对应 VLAN。预防方法是在项目交付前用脚本检查所有 Trunk 的放行列表。7.2 Native VLAN 不一致现象两台交换机之间出现不稳定的广播流量VLAN 10 偶尔可以与 VLAN 20 互通安全上存在 VLAN 跳转风险。原因一端 Trunk 的 Native VLAN 是 VLAN 1另一端是 VLAN 10。排查命令行华为display port trunk查看 PVID思科show interfaces trunk查看 Native mode处理方式把两端 Native VLAN 改为同一 VLAN ID最好避免使用业务 VLAN 作为 Native VLAN。7.3 STP 没有阻塞冗余端口现象两台交换机之间出现广播风暴CPU 升高。原因STP 全局关闭。两个端口属于不同生成树实例。MSTP 域配置不一致。收到大量 BPDU 过滤配置。排查命令行华为display stp enable,display stp brief,display stp region-configuration思科show spanning-tree summary,show spanning-tree detail处理方式开启 STP统一生成树模式检查 MSTP 域配置。7.4 Eth-Trunk 成员口配置不一致现象Eth-Trunk 状态 Down 或只有一个成员 Up流量只能走一条链路。原因成员口加入聚合组之前物理口上配置了不同 VLAN或者一个成员口为 Access、另一个为 Trunk。排查命令行华为display eth-trunk 1思科show etherchannel summary,show run interface port-channel1处理方式删除成员口的独立 VLAN 配置统一由 Eth-Trunk 逻辑口下发配置。重新创建聚合组时先清空端口配置。7.5 端口安全或 BPDU Guard 导致备份端口被 Error-Disable现象备份端口状态显示 Down 或 Err-Disabled链路无法恢复。原因交换机开启了 PortFastBPDU Guard端口收到 BPDU 后将端口关闭。Trunk 端口如果误开 BPDU Guard会触发保护机制。排查命令行思科show interfaces status华为display interface GigabitEthernet0/0/2处理方式Trunk 端口不要开启 BPDU Guard或明确知道端口不会收到 BPDU。恢复端口使用shutdown再undo shutdown。7.6 排错顺序建议面对“冗余链路 VLAN 不通”的问题建议按以下顺序排查先确认 PC 到交换机端口的 Access VLAN 配置正确。再确认两台交换机上 VLAN 存在。检查两条 Trunk 的放行 VLAN 列表。检查 Native VLAN / PVID 一致。检查 STP 端口状态备份端口是否进入 Forwarding。检查 Eth-Trunk 是否为 Up成员口是否 Selected。最后抓包确认 802.1Q 标签中的 VLAN ID 是否符合预期。如果前两步正常问题往往出在放行列表或 STP 状态上。8. 冗余链路 VLAN 配置的最佳实践8.1 学习环境和生产环境的差异在学习环境中用两台交换机直接连线就能验证。生产环境还要考虑更多因素项目学习环境生产环境STP 模式RSTP 已足够建议 MSTP 或 RPVSTTrunk 放行 VLAN尽量少便于验证按实际业务收紧Native VLAN默认 VLAN 1单独规划 Native VLAN配置备份无需必须提前备份变更窗口随时可操作需要变更窗口和回滚方案监控无监控 STP 状态、端口流量、日志安全低开启根保护、环路保护谨慎使用 PortFast8.2 配置模板建议华为交换机建议统一采用下面的模板作为冗余链路的基线。具体 VLAN、端口按项目调整vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 port trunk pvid vlan 1 stp root-protection quit interface GigabitEthernet0/0/2 port link-type trunk port trunk allow-pass vlan 10 20 port trunk pvid vlan 1 stp root-protection quit stp mode rstp stp priority 4096思科交换机建议采用spanning-tree mode rapid-pvst spanning-tree vlan 10,20 root primary interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan 10,20 switchport trunk native vlan 1 spanning-tree guard root exit interface GigabitEthernet0/2 switchport mode trunk switchport trunk allowed vlan 10,20 switchport trunk native vlan 1 spanning-tree guard root exit如果使用链路聚合则把两个物理口收进一个 Eth-Trunk 或 Port-channel不要保留两条独立 Trunk。8.3 推荐的项目检查清单项目交付或上线前可以按下面清单逐项确认两台交换机是否存在相同 VLAN ID。Trunk 放行 VLAN 列表是否一致。Native VLAN 是否一致。STP 是否开启模式是否一致。根桥和备份根桥是否符合预期。冗余端口是被 STP 阻塞还是在 Eth-Trunk 中正常转发。防火墙或端口安全策略是否影响 BPDU。配置文件是否下载备份。拔掉主链路后业务中断时间是否可接受。恢复主链路后流量是否回到原路径。8.4 进一步可以扩展的方向冗余链路的 VLAN 配置只是二层高可用的一部分。继续深入可以学习MSTP 多实例如何在不同 VLAN 之间做负载分担。VRRP 与二层冗余链路配合时网关如何切换。跨设备链路聚合M-LAG / vPC如何在两台设备间实现更平滑的冗余。基于 PVLAN、GVRP 等机制动态管理 VLAN 的适用场景和限制。网络自动化脚本批量下发 Trunk 和生成树配置减少人工配置不一致。从最小拓扑开始把 STP 和 Eth-Trunk 两条技术路线都亲手验证一遍再逐步扩大到三层网关和跨设备链路聚合对理解交换机的冗余链路工作原理会有明显帮助。