1. 项目概述为什么MSTP配置是网络工程师的必修课在园区网、数据中心或者任何规模稍大一点的二层网络里你肯定遇到过这样的场景为了冗余你部署了两台甚至多台核心交换机然后用多条链路把它们连接起来形成一个环路。心里想着这下高枕无忧了结果一接上电广播风暴瞬间让整个网络瘫痪或者生成树协议STP阻塞了不该阻塞的端口导致流量路径不是最优。传统的STPIEEE 802.1D或者它的快速版本RSTPIEEE 802.1w虽然能防环但有个硬伤整个交换网络只有一个生成树实例。这意味着所有VLAN都走同一条“逻辑上的”无环路径你精心规划的VLAN间负载分担成了空谈而且拓扑变化会影响所有VLAN收敛慢影响面大。MSTPMultiple Spanning Tree Protocol IEEE 802.1s就是为了解决这个问题而生的。它不再是“一个网络一棵树”而是允许你将多个VLAN映射到同一个生成树实例MST Instance中。这样一个物理网络里可以运行多个生成树实例每个实例有自己独立的根桥、端口角色和状态。你可以让VLAN 10的流量走左边链路VLAN 20的流量走右边链路实现流量的负载均衡。同时拓扑变化的影响被限制在单个MST实例内收敛更快网络更稳定。所以“MSTP实例配置”绝不仅仅是敲几条命令行。它背后是一套完整的网络逻辑设计如何划分实例Instance如何将VLAN归类到实例如何为每个实例选举根桥如何规划路径。配置本身是技术的落地而设计思路才是价值的核心。这篇文章我就从一个踩过坑的过来人角度带你从零理解MSTP的设计思想并手把手完成一套典型的、可用于生产环境的配置。我们会用主流的华为Huawei或华三H3C的Comware V7平台CLI作为示例因为其语法清晰应用广泛。思科Cisco的配置逻辑类似命令不同但原理完全相通。2. MSTP的核心概念与区域设计打破沙盘问到底在动手敲命令之前我们必须把几个关键概念吃透否则配置就是空中楼阁出了问题根本无从排查。2.1 MST域MST Region一群说“黑话”的交换机你可以把MST域理解为一个“自治团体”。域内的所有交换机必须配置相同的三要素才能彼此识别协同计算生成树。这三要素是域名Region Name 给这个区域起个名字比如“Core_Region”。修订级别Revision Level 一个数字通常从0开始。当你修改了VLAN与实例的映射关系后应该提高这个级别以通知域内其他交换机配置已变更。VLAN与实例映射表VLAN-to-Instance Mapping Table 这是MSTP的灵魂。它定义了哪些VLAN属于哪个MST实例。为什么需要域想象一下如果网络很大你希望楼宇A和楼宇B各自做自己的负载均衡互不干扰。那么你就可以把楼宇A的交换机划入MST_Region_A楼宇B的划入MST_Region_B。两个域之间只会通过一个实例默认的IST进行交互简化了大型网络的复杂度。注意域内所有交换机的这三项配置必须一字不差否则它们会被认为属于不同的域。不同域之间的MSTP协商会退化成类似标准STP的交互可能导致次优路径甚至环路。这是配置MSTP时最容易出错的地方之一。2.2 MST实例MSTI多条逻辑高速公路MSTP允许创建多个生成树实例MSTI编号为1到4094。此外还有一个特殊的实例——实例0也称为内部生成树IST Internal Spanning Tree。IST是始终存在且无法删除的所有未明确映射到其他MSTI的VLAN默认都属于IST。实例的作用 每个MSTI独立运行生成树算法。你可以为实例1指定一台交换机为根桥为实例2指定另一台交换机为根桥。这样实例1的流量就会优选通往其根桥的路径实例2的流量则优选另一条路径从而实现基于实例的流量负载分担。2.3 CIST与总根域间的“外交官”虽然各个MST域内部自己玩自己的但整个交换网络可能包含多个MST域和运行普通STP/RSTP的设备仍然需要一个全局的、统一的无环拓扑。这个全局的树称为公共和内部生成树CIST Common and Internal Spanning Tree。CIST总根CIST Root 整个网络中优先级最优数值最小的交换机会被选举为CIST总根。这个角色非常重要因为它影响了所有MST域与外部网络互联的路径。CIST域根CIST Regional Root 在每个MST域内部需要选出一个“代表”去参与CIST的选举这个代表就是该域的CIST域根。默认情况下一个MST域中在实例0IST上优先级最优的交换机会成为该域的CIST域根。设计心得 在规划时我们通常会手动指定网络中性能最强、位置最核心的交换机作为CIST总根并为其配置一个可靠的备份。同时在每个MST域内也手动指定该域的CIST域根即实例0的根桥。这样做是为了让生成树的拓扑稳定、可预测避免因为自动选举导致根桥飘移到不合适的设备上。2.4 VLAN映射设计如何归类流量这是最具策略性的部分。如何将几十个甚至上百个VLAN归类到几个MST实例中没有固定答案但有几个通用原则业务隔离 将不同业务系统的VLAN放入不同实例。例如办公VLAN10-19映射到实例1生产VLAN20-29映射到实例2。这样生产网络的拓扑变化不会影响办公网络。路径优化 根据流量的主要流向。如果VLAN 10的用户服务器主要集中在机房A而VLAN 20的服务器在机房B那么可以将VLAN 10映射到以机房A交换机为根桥的实例VLAN 20映射到以机房B交换机为根桥的实例使得访问路径最优。简化管理 实例不是越多越好。每增加一个实例就会增加一份协议报文MSTP BPDU的复杂度和计算开销。通常对于中小型网络2-4个实例已经足够。一个典型的起点是两个实例用于负载分担一个实例IST/实例0用于承载管理VLAN、语音VLAN等零星流量或作为默认容器。3. 实战配置从零搭建一个双核心MSTP网络假设我们有一个简单的双核心园区网拓扑两台核心交换机Core-1和Core-2。四台接入交换机Access-1到Access-4分别上联到两台核心。规划VLANVLAN 10办公、VLAN 20生产、VLAN 100管理。目标实现VLAN 10的流量主要走Core-1VLAN 20的流量主要走Core-2实现负载均衡。管理VLAN 100走默认路径。3.1 第一步基础网络与VLAN配置在开始MSTP之前确保基本的IP地址、VLAN创建和Trunk链路配置已经完成。这里以华为/华三设备为例# 在每台交换机上创建VLAN并配置Trunk口 sysname Core-1 vlan batch 10 20 100 interface GigabitEthernet1/0/1 # 连接Core-2的链路 port link-type trunk port trunk allow-pass vlan all # 临时允许所有VLAN后续MSTP会控制 interface GigabitEthernet1/0/2 # 连接Access-1的链路 port link-type trunk port trunk allow-pass vlan all interface GigabitEthernet1/0/3 # 连接Access-2的链路 port link-type trunk port trunk allow-pass vlan all interface Vlanif100 ip address 192.168.100.1 24Core-2、Access-1等交换机做类似配置注意IP地址不要冲突。3.2 第二步全局启用MSTP并进入MST域视图默认情况下交换机可能运行STPMSTP模式。我们需要全局启用MSTP并进入域配置模式。# 在所有交换机上执行 stp enable # 全局开启生成树协议默认模式可能是MSTP stp mode mstp # 将生成树模式设置为MSTP stp region-configuration # 进入MST域配置视图3.3 第三步配置MST域三要素这是最关键的一步所有交换机必须配置一致。# 在所有交换机上执行在MST域配置视图下 region-name Campus_Network # 配置域名 revision-level 1 # 配置修订级别初始为1 instance 1 vlan 10 # 将VLAN 10映射到MST实例1 instance 2 vlan 20 # 将VLAN 20映射到MST实例2 # VLAN 100没有映射它将自动归属于实例0IST active region-configuration # 激活域配置必须执行此命令踩坑实录active region-configuration这个命令至关重要它就像commit一样使配置生效。很多新手配置完前面几条就退出了结果发现配置没生效交换机之间无法识别为同一个域。务必检查每台交换机的配置是否已激活。3.4 第四步为每个MST实例指定根桥和备份根桥我们希望VLAN 10实例1的流量优先走Core-1VLAN 20实例2的流量优先走Core-2。因此我们将Core-1设置为实例1的根桥Core-2设置为实例2的根桥。同时互为备份。# 在 Core-1 上配置 stp instance 1 root primary # 将自己设置为实例1的主根桥优先级自动设为0 stp instance 2 root secondary # 将自己设置为实例2的备份根桥优先级自动设为4096 # 在 Core-2 上配置 stp instance 2 root primary # 将自己设置为实例2的主根桥 stp instance 1 root secondary # 将自己设置为实例1的备份根桥为什么这样设计root primary命令会自动将设备的优先级设置为0最优而root secondary设置为4096。当Core-1故障时Core-2在实例1上的优先级4096会成为最优从而接管实例1的根桥角色。这样就实现了每个实例的根桥冗余。3.5 第五步可选配置边缘端口与BPDU保护对于直接连接PC、服务器等终端设备的端口它们不应该收到BPDU报文也不会形成环路。我们可以将这些端口配置为“边缘端口”Edge Port使其立即进入转发状态加速终端接入。# 在接入交换机如Access-1连接PC的端口上配置 interface GigabitEthernet1/0/10 stp edged-port enable同时在边缘端口上启用BPDU保护BPDU Protection是一个非常好的安全实践。一旦该端口收到BPDU交换机就会认为有非法设备接入试图扰乱生成树从而立即关闭该端口。# 在接入交换机上全局启用BPDU保护 stp bpdu-protection实操心得务必在接入层交换机上配置stp bpdu-protection。我经历过一次故障一个不懂网络的同事在办公室私接了一个小交换机形成了环路但因为接了BPDU保护端口自动Error-Down只影响了他一个人整个办公网的广播风暴被扼杀在摇篮里。这是性价比最高的生成树安全配置之一。3.6 第六步验证与检查配置完成后不要以为就万事大吉了。必须进行全面的验证。# 查看MSTP的全局状态和域信息 display stp display stp region-configuration # 查看每个MST实例的详细信息重点关注根桥、端口角色和状态 display stp instance 1 brief display stp instance 2 brief display stp instance 0 brief # 查看具体端口的生成树状态 display stp interface GigabitEthernet 1/0/1你需要重点检查以下几点所有交换机是否都显示在同一个MST Region下display stp实例1的根桥是否是Core-1实例2的根桥是否是Core-2display stp instance X brief各条Trunk链路上端口角色是否符合预期例如在实例1中Core-1连接Core-2的链路在Core-2一侧的端口应该是“替代端口Alternate”并被阻塞Discarding而在实例2中情况应该相反。边缘端口是否处于转发Forwarding状态且没有收到BPDU4. 高级调优与故障排查思路基础配置能跑通但要让网络更健壮还需要一些调优。4.1 路径开销Path Cost与端口优先级Port Priority生成树选举根端口和指定端口时在比较完根路径开销后会比较对端桥ID、对端端口ID等。其中根路径开销是累计值。现代网络都是千兆、万兆默认的802.1t标准开销值可能无法精确反映你的设计意图。例如你希望某条万兆链路在某个实例中绝对优先。除了让它离根桥更近还可以直接调小这条链路在该实例上的路径开销。# 在指定端口上修改特定实例的路径开销值越小越优先 interface GigabitEthernet1/0/1 stp instance 1 cost 2000同理stp instance 1 port priority命令可以调整端口优先级用于在根路径开销相同时决定哪个端口被选中。4.2 收敛参数调优Hello Time, Forward DelayMSTP的收敛速度比STP快得多因为它继承了RSTP的快速收敛机制。在大多数情况下不需要调整默认的Hello Time2秒、Forward Delay15秒等计时器。随意修改这些全局计时器是危险的可能导致网络不稳定。除非你有非常特殊的网络拓扑和严格的收敛要求并且完全理解其影响否则不要动它们。4.3 常见故障排查链路当网络出现环路或部分VLAN不通时可以按照以下思路排查MSTP检查域配置一致性 这是第一位的。用display stp region-configuration在所有交换机上对比确保域名、修订号、VLAN映射表完全一致。一个字符的差异就会导致分属不同域。检查根桥选举 用display stp instance X brief查看有问题的VLAN所属的实例其根桥是否是你期望的那台设备是不是有意外接入的、优先级更高的交换机“抢”走了根桥检查端口角色与状态 在关键链路上用display stp interface查看端口在各个实例中的角色和状态。是否该阻塞的端口没阻塞可能是单向链路故障导致BPDU丢失是否该转发的端口被阻塞了检查物理链路与BPDU 使用display interface检查端口是否有错包、丢包。可以开启调试信息谨慎使用生产环境需在维护窗口debugging stp packet interface GigabitEthernet x/x/x查看BPDU是否正常收发。收不到BPDU的端口会认为自己是根端口从而可能导致环路。检查边缘端口与BPDU保护 确认连接终端的端口是否配置了stp edged-port。检查是否有端口因为触发了BPDU保护而Error-Downdisplay interface brief查看状态为ADM或Err-Down。5. MSTP与其他生成树协议的对比与选型思考最后我们来聊聊为什么选MSTP而不是PVST思科私有或其他协议。MSTP vs. STP/RSTP 如前所述MSTP支持多实例实现了负载均衡和故障域隔离而STP/RSTP是单实例。这是质的飞跃。MSTP vs. PVST PVST是思科的私有协议它为每个VLAN都运行一个独立的生成树实例。这提供了极致的灵活性但代价是巨大的如果有100个VLAN交换机就要计算和维护100棵生成树消耗大量的CPU和内存资源并且会泛洪大量的BPDU报文。MSTP是IEEE标准通过将VLAN分组到实例在灵活性和资源消耗之间取得了完美平衡是多厂商环境下的首选。何时使用MSTP当你需要在一个物理网络尤其是多台核心设备、存在环路的网络中为不同业务或流量规划不同路径以实现负载分担和故障隔离时MSTP是不二之选。它适用于几乎所有中型及以上的企业网络和数据中心二层网络。我个人在项目中的体会是MSTP的配置难点不在于命令本身而在于前期的规划设计。花足够的时间去规划VLAN与实例的映射规划每个实例的根桥和备份根桥并在文档中清晰地记录下来这比后期排错要省力十倍。配置时像念咒一样反复核对“域名、修订号、映射表”这三要素的一致性能避免80%的奇怪问题。最后永远不要忘记在接入层开启BPDU保护这是为你自己省去半夜被叫起来处理全网瘫痪的麻烦。