两条上行链路一条常年闲着?华为交换机MSTP双实例流量分开走
园区网为了可靠,接入交换机到两台核心通常都拉双链路,一条主用一条备份。防环靠生成树把备份链路阻塞掉——代价是那条线常年空转,带宽白白铺在那儿;真到上网高峰,主链路挤得满满的,备链一眼不眨地看着。想把两条链路都跑起来,靠的是 MSTP(多生成树协议):把 VLAN 分到多个生成树实例里,每个实例各算各的树、各堵各的口,VLAN 2~10 的流量走这边、VLAN 11~20 的流量走那边,两条链路一齐干活,还互为备份。华为官方文档有一套完整的四台设备组网示例,本篇按这套示例把双实例负载分担从头配到尾,命令逐段给出,四台设备的配置脚本一并附上。
本文的组网需求、配置思路与命令步骤,整理自华为官方发布的典型配置案例,参数可直接参考使用。
组网需求
在一个复杂的网络中,由于冗余备份的需要,网络规划者一般都倾向于在设备之间部署多条物理链路,其中一条作为主用链路,其他作为备份链路。这样就难免会形成环路,若网络中存在环路,可能会引起广播风暴和MAC表项被破坏。为此,可以在网络中部署MSTP协议预防环路。MSTP可阻塞二层网络中的冗余链路,将网络修剪成树状,达到消除环路的目的。
SwitchA、SwitchB、SwitchC和SwitchD都运行MSTP。为实现VLAN2~VLAN10和VLAN11~VLAN20的流量负载分担,MSTP引入了多实例。MSTP可设置VLAN映射表,把VLAN和生成树实例相关联。
翻译成白话:SwitchA 和 SwitchB 是两台核心,中间用 Eth-Trunk 捆绑互联;SwitchC、SwitchD 是接入交换机,各有一条链路接到 SwitchA、一条接到 SwitchB,天然成环。VLAN 2~10 映射进实例 1、VLAN 11~20 映射进实例 2;实例 1 以 SwitchA 为根桥,实例 2 以 SwitchB 为根桥——于是实例 1 里 SwitchC 走 SwitchA 那条上行,实例 2 里走 SwitchB 那条上行,两条链路都有流量,环也破掉了。
配置思路
- 在处于环形网络中的交换设备上配置MSTP基本功能。
- 配置保护功能,实现对设备或链路的保护。例如:在各实例的根桥设备指定端口配置根保护功能。
- 配置设备的二层转发功能。
关键设计有三处。其一,四台设备配同一个 MST 域(域名 RG1、相同的 VLAN 映射、相同的修订级别),域内才能按实例分别计算生成树;其二,根桥交叉设置——SwitchA 当实例 1 的根桥、SwitchB 当实例 2 的根桥,互为对方的备份根桥,两棵树的转发路径天然分开;其三,把接入交换机将被阻塞端口的路径开销值调大(20000),让阻塞点落在预期的端口上。
设备配置根保护功能后,如果根桥和备份根桥之间的链路down了,则配置根保护的端口状态会因为根保护功能生效直接变成discarding状态。为了提高可靠性,官方建议根桥和备份根桥之间的链路绑定Eth-Trunk——所以示例里两台核心之间的互联用了 Eth-Trunk1。
操作步骤
一、配置MSTP基本功能
先在四台设备上配置 MST 域。当两台交换设备的以下配置都相同时,这两台交换设备属于同一个MST域:MST域的域名、多生成树实例和VLAN的映射关系、MST域的修订级别。
配置实例1的根桥SwitchA的MST域:
<HUAWEI> system-view
[HUAWEI] sysname SwitchA
[SwitchA] stp region-configuration
[SwitchA-mst-region] region-name RG1 //配置域名为RG1。
[SwitchA-mst-region] instance 1 vlan 2 to 10 //将VLAN 2至VLAN 10映射到实例1上。
[SwitchA-mst-region] instance 2 vlan 11 to 20 //将VLAN 11至VLAN 20映射到实例2上。
[SwitchA-mst-region] active region-configuration //激活MST域的配置。
[SwitchA-mst-region] quit
配置实例2的根桥SwitchB的MST域:
<HUAWEI> system-view
[HUAWEI] sysname SwitchB
[SwitchB] stp region-configuration
[SwitchB-mst-region] region-name RG1 //配置域名为RG1。
[SwitchB-mst-region] instance 1 vlan 2 to 10 //将VLAN 2至VLAN 10映射到实例1上。
[SwitchB-mst-region] instance 2 vlan 11 to 20 //将VLAN 11至VLAN 20映射到实例2上。
[SwitchB-mst-region] active region-configuration //激活MST域的配置。
[SwitchB-mst-region] quit
配置接入交换机SwitchC的MST域:
<HUAWEI> system-view
[HUAWEI] sysname SwitchC
[SwitchC] stp region-configuration
[SwitchC-mst-region] region-name RG1 //配置域名为RG1。
[SwitchC-mst-region] instance 1 vlan 2 to 10 //将VLAN 2至VLAN 10映射到实例1上。
[SwitchC-mst-region] instance 2 vlan 11 to 20 //将VLAN 11至VLAN 20映射到实例2上。
[SwitchC-mst-region] active region-configuration //激活MST域的配置。
[SwitchC-mst-region] quit
配置接入交换机SwitchD的MST域:
<HUAWEI> system-view
[HUAWEI] sysname SwitchD
[SwitchD] stp region-configuration
[SwitchD-mst-region] region-name RG1 //配置域名为RG1。
[SwitchD-mst-region] instance 1 vlan 2 to 10 //将VLAN 2至VLAN 10映射到实例1上。
[SwitchD-mst-region] instance 2 vlan 11 to 20 //将VLAN 11至VLAN 20映射到实例2上。
[SwitchD-mst-region] active region-configuration //激活MST域的配置。
[SwitchD-mst-region] quit
四台的域名、映射、激活三条缺一不可,改完映射记得 active 激活,不激活配置不生效。
二、在域RG1内,配置MSTI1与MSTI2的根桥与备份根桥
配置MSTI1的根桥与备份根桥。配置SwitchA为MSTI1的根桥:
[SwitchA] stp instance 1 root primary
配置SwitchB为MSTI1的备份根桥:
[SwitchB] stp instance 1 root secondary
配置MSTI2的根桥与备份根桥。配置SwitchB为MSTI2的根桥:
[SwitchB] stp instance 2 root primary
配置SwitchA为MSTI2的备份根桥:
[SwitchA] stp instance 2 root secondary
根桥交叉着配,两棵树的重心分别压在两台核心上——这就是双实例负载分担的根子。
三、配置实例MSTI1和MSTI2中将要被阻塞端口的路径开销值大于缺省值
端口路径开销值取值范围由路径开销计算方法决定,这里选择使用华为计算方法为例,配置实例MSTI1和MSTI2中将被阻塞端口的路径开销值为20000。同一网络内所有交换设备的端口路径开销应使用相同的计算方法。
配置实例1的根桥SwitchA的端口路径开销值的计算方法为华为计算方法:
[SwitchA] stp pathcost-standard legacy
配置实例2的根桥SwitchB的端口路径开销计算方法为华为计算方法:
[SwitchB] stp pathcost-standard legacy
配置接入交换机SwitchC的端口路径开销计算方法为华为计算方法,将端口GE1/0/2在实例MSTI2中的路径开销值配置为20000:
[SwitchC] stp pathcost-standard legacy
[SwitchC] interface gigabitethernet 1/0/2
[SwitchC-GigabitEthernet1/0/2] stp instance 2 cost 20000
[SwitchC-GigabitEthernet1/0/2] quit
配置接入交换机SwitchD的端口路径开销计算方法为华为计算方法,将端口GE1/0/2在实例MSTI1中的路径开销值配置为20000:
[SwitchD] stp pathcost-standard legacy
[SwitchD] interface gigabitethernet 1/0/2
[SwitchD-GigabitEthernet1/0/2] stp instance 1 cost 20000
[SwitchD-GigabitEthernet1/0/2] quit
注意方向是错开的:SwitchC 抬的是实例 2 的开销(实例 2 里它改走 SwitchB),SwitchD 抬的是实例 1 的开销(实例 1 里它改走 SwitchA),两台接入的阻塞点落在线路两端不同侧,流量才真正分开。
四、使能MSTP,实现破除环路
设备全局使能MSTP。在实例1的根桥SwitchA上启动MSTP:
[SwitchA] stp enable
在实例2的根桥SwitchB上启动MSTP:
[SwitchB] stp enable
在接入交换机SwitchC上启动MSTP:
[SwitchC] stp enable
在接入交换机SwitchD上启动MSTP:
[SwitchD] stp enable
五、将与终端相连的端口设置为边缘端口
与终端相连的端口不用参与MSTP计算,建议将其设置为边缘端口或去使能STP。配置SwitchC端口GE1/0/1设置为边缘端口:
[SwitchC] interface gigabitethernet 1/0/1
[SwitchC-GigabitEthernet1/0/1] stp edged-port enable
[SwitchC-GigabitEthernet1/0/1] quit
(可选)配置SwitchC的BPDU保护功能:
[SwitchC] stp bpdu-protection
配置SwitchD端口GE1/0/1设置为边缘端口:
[SwitchD] interface gigabitethernet 1/0/1
[SwitchD-GigabitEthernet1/0/1] stp edged-port enable
[SwitchD-GigabitEthernet1/0/1] quit
(可选)配置SwitchD的BPDU保护功能:
[SwitchD] stp bpdu-protection
如果与边缘端口相连的是使能了STP功能的网络设备,配置BPDU保护功能后,如果边缘端口收到BPDU报文,边缘端口将会被shutdown,边缘端口属性不变——所以下挂交换机的口不要配成边缘口。
六、配置保护功能,如在各实例的根桥设备的指定端口配置根保护功能
在实例1根桥SwitchA端口GE1/0/1上启动根保护:
[SwitchA] interface gigabitethernet 1/0/1
[SwitchA-GigabitEthernet1/0/1] stp root-protection
[SwitchA-GigabitEthernet1/0/1] quit
在实例2根桥SwitchB端口GE1/0/1上启动根保护:
[SwitchB] interface gigabitethernet 1/0/1
[SwitchB-GigabitEthernet1/0/1] stp root-protection
[SwitchB-GigabitEthernet1/0/1] quit
根保护防的是"外来说服力更强的 BPDU 抢根桥"——接入侧有人私接交换机且优先级更低时,指定端口直接转 discarding,根桥地位保得住。
七、配置处于环网中的设备的二层转发功能
先在四台设备上创建VLAN2~20。在实例1的根桥SwitchA上创建VLAN2~20:
[SwitchA] vlan batch 2 to 20
在实例2的根桥SwitchB上创建VLAN2~20:
[SwitchB] vlan batch 2 to 20
在接入交换机SwitchC上创建VLAN2~20:
[SwitchC] vlan batch 2 to 20
在接入交换机SwitchD上创建VLAN2~20:
[SwitchD] vlan batch 2 to 20
再把接入环路中的端口加入VLAN。将实例1的根桥SwitchA端口GE1/0/1加入VLAN:
[SwitchA] interface gigabitethernet 1/0/1
[SwitchA-GigabitEthernet1/0/1] port link-type trunk
[SwitchA-GigabitEthernet1/0/1] port trunk allow-pass vlan 2 to 20
[SwitchA-GigabitEthernet1/0/1] quit
将实例1的根桥SwitchA端口Eth-Trunk1加入VLAN:
[SwitchA] interface Eth-Trunk 1
[SwitchA-Eth-Trunk1] trunkport gigabitethernet 1/0/2
[SwitchA-Eth-Trunk1] trunkport gigabitethernet 1/0/3
[SwitchA-Eth-Trunk1] port link-type trunk
[SwitchA-Eth-Trunk1] port trunk allow-pass vlan 2 to 20
[SwitchA-Eth-Trunk1] quit
将实例2的根桥SwitchB端口GE1/0/1加入VLAN:
[SwitchB] interface gigabitethernet 1/0/1
[SwitchB-GigabitEthernet1/0/1] port link-type trunk
[SwitchB-GigabitEthernet1/0/1] port trunk allow-pass vlan 2 to 20
[SwitchB-GigabitEthernet1/0/1] quit
将实例2的根桥SwitchB端口Eth-Trunk1加入VLAN:
[SwitchB] interface Eth-Trunk 1
[SwitchB-Eth-Trunk1] trunkport gigabitethernet 1/0/2
[SwitchB-Eth-Trunk1] trunkport gigabitethernet 1/0/3
[SwitchB-Eth-Trunk1] port link-type trunk
[SwitchB-Eth-Trunk1] port trunk allow-pass vlan 2 to 20
[SwitchB-Eth-Trunk1] quit
将接入交换机SwitchC端口GE1/0/1加入VLAN:
[SwitchC] interface gigabitethernet 1/0/1
[SwitchC-GigabitEthernet1/0/1] port link-type access
[SwitchC-GigabitEthernet1/0/1] port default vlan 2
[SwitchC-GigabitEthernet1/0/1] quit
将接入交换机SwitchC端口GE1/0/2加入VLAN:
[SwitchC] interface gigabitethernet 1/0/2
[SwitchC-GigabitEthernet1/0/2] port link-type trunk
[SwitchC-GigabitEthernet1/0/2] port trunk allow-pass vlan 2 to 20
[SwitchC-GigabitEthernet1/0/2] quit
将接入交换机SwitchC端口GE1/0/3加入VLAN:
[SwitchC] interface gigabitethernet 1/0/3
[SwitchC-GigabitEthernet1/0/3] port link-type trunk
[SwitchC-GigabitEthernet1/0/3] port trunk allow-pass vlan 2 to 20
[SwitchC-GigabitEthernet1/0/3] quit
将接入交换机SwitchD端口GE1/0/1加入VLAN:
[SwitchD] interface gigabitethernet 1/0/1
[SwitchD-GigabitEthernet1/0/1] port link-type access
[SwitchD-GigabitEthernet1/0/1] port default vlan 11
[SwitchD-GigabitEthernet1/0/1] quit
将接入交换机SwitchD端口GE1/0/2加入VLAN:
[SwitchD] interface gigabitethernet 1/0/2
[SwitchD-GigabitEthernet1/0/2] port link-type trunk
[SwitchD-GigabitEthernet1/0/2] port trunk allow-pass vlan 2 to 20
[SwitchD-GigabitEthernet1/0/2] quit
将接入交换机SwitchD端口GE1/0/3加入VLAN:
[SwitchD] interface gigabitethernet 1/0/3
[SwitchD-GigabitEthernet1/0/3] port link-type trunk
[SwitchD-GigabitEthernet1/0/3] port trunk allow-pass vlan 2 to 20
[SwitchD-GigabitEthernet1/0/3] quit
两台接入交换机的 GE1/0/1 是接终端的 access 口(SwitchC 归 VLAN 2、SwitchD 归 VLAN 11,正好分属两个实例),GE1/0/2、GE1/0/3 分别上联两台核心,全部放行 VLAN 2~20。
结果验证
经过以上配置,在网络计算稳定后,执行以下操作验证配置结果。本配置举例以实例1和实例2为例,因此不用关注实例0中端口的状态。
在实例1的根桥SwitchA上执行display stp brief命令,查看端口状态和端口的保护类型:
[SwitchA] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI FORWARDING ROOT
0 Eth-Trunk1 DESI FORWARDING NONE
1 GigabitEthernet1/0/1 DESI FORWARDING ROOT
1 Eth-Trunk1 DESI FORWARDING NONE
2 GigabitEthernet1/0/1 DESI FORWARDING ROOT
2 Eth-Trunk1 ROOT FORWARDING NONE
在MSTI1中,由于SwitchA是根桥,SwitchA的端口Eth-Trunk1和GE1/0/1成为指定端口。在MSTI2中,SwitchA的端口GE1/0/1成为指定端口,端口Eth-Trunk1成为根端口。
在实例2的根桥SwitchB上执行display stp brief命令:
[SwitchB] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI FORWARDING ROOT
0 Eth-Trunk1 ROOT FORWARDING NONE
1 GigabitEthernet1/0/1 DESI FORWARDING ROOT
1 Eth-Trunk1 ROOT FORWARDING NONE
2 GigabitEthernet1/0/1 DESI FORWARDING ROOT
2 Eth-Trunk1 DESI FORWARDING NONE
在MSTI2中,由于SwitchB是根桥,端口GE1/0/1和Eth-Trunk1在MSTI2中成为指定端口。在MSTI1中,SwitchB的端口GE1/0/1成为指定端口,端口Eth-Trunk1成为根端口。
在接入交换机SwitchC上执行display stp interface brief命令:
[SwitchC] display stp interface gigabitethernet 1/0/3 brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/3 ROOT FORWARDING NONE
1 GigabitEthernet1/0/3 ROOT FORWARDING NONE
2 GigabitEthernet1/0/3 ROOT FORWARDING NONE
[SwitchC] display stp interface gigabitethernet 1/0/2 brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
1 GigabitEthernet1/0/2 DESI FORWARDING NONE
2 GigabitEthernet1/0/2 ALTE DISCARDING NONE
SwitchC的端口GE1/0/3在MSTI1和MSTI2中为根端口。SwitchC的另一个端口GE1/0/2,在MSTI2中被阻塞,在MSTI1中被计算为指定端口。
在接入交换机SwitchD上执行display stp interface brief命令:
[SwitchD] display stp interface gigabitethernet 1/0/3 brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/3 ROOT FORWARDING NONE
1 GigabitEthernet1/0/3 ROOT FORWARDING NONE
2 GigabitEthernet1/0/3 ROOT FORWARDING NONE
[SwitchD] display stp interface gigabitethernet 1/0/2 brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/2 ALTE DISCARDING NONE
1 GigabitEthernet1/0/2 ALTE DISCARDING NONE
2 GigabitEthernet1/0/2 DESI FORWARDING NONE
SwitchD的端口GE1/0/3在MSTI1和MSTI2中为根端口。SwitchD的另一个端口GE1/0/2,在MSTI1中被阻塞,在MSTI2中被计算为指定端口。
判读要点就在两张接入交换机的表上:SwitchC 的 GE1/0/2 只在实例 2 里是 ALTE/DISCARDING,SwitchD 的 GE1/0/2 只在实例 1 里是 ALTE/DISCARDING——阻塞点一东一西,实例 1 的 VLAN 2~10 流量与实例 2 的 VLAN 11~20 流量各走一条上行,负载分担落地;哪台核心故障,对应实例重新收敛,流量自动切到另一条链路,备份关系也在。
配置脚本
实例1的根桥SwitchA的配置文件:
#
sysname SwitchA
#
vlan batch 2 to 20
#
stp instance 1 root primary
stp instance 2 root secondary
stp pathcost-standard legacy
#
stp region-configuration
region-name RG1
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface Eth-Trunk1
port link-type trunk
port trunk allow-pass vlan 2 to 20
#
interface GigabitEthernet1/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 20
stp root-protection
#
interface GigabitEthernet1/0/2
eth-trunk 1
#
interface GigabitEthernet1/0/3
eth-trunk 1
#
return
实例2的根桥SwitchB的配置文件:
#
sysname SwitchB
#
vlan batch 2 to 20
#
stp instance 1 root secondary
stp instance 2 root primary
stp pathcost-standard legacy
#
stp region-configuration
region-name RG1
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface Eth-Trunk1
port link-type trunk
port trunk allow-pass vlan 2 to 20
#
interface GigabitEthernet1/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 20
stp root-protection
#
interface GigabitEthernet1/0/2
eth-trunk 1
#
interface GigabitEthernet1/0/3
eth-trunk 1
#
return
接入交换机SwitchC的配置文件:
#
sysname SwitchC
#
vlan batch 2 to 20
#
stp bpdu-protection
stp pathcost-standard legacy
#
stp region-configuration
region-name RG1
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface GigabitEthernet1/0/1
port link-type access
port default vlan 2
stp edged-port enable
#
interface GigabitEthernet1/0/2
port link-type trunk
port trunk allow-pass vlan 2 to 20
stp instance 2 cost 20000
#
interface GigabitEthernet1/0/3
port link-type trunk
port trunk allow-pass vlan 2 to 20
#
return
接入交换机SwitchD的配置文件:
#
sysname SwitchD
#
vlan batch 2 to 20
#
stp bpdu-protection
stp pathcost-standard legacy
#
stp region-configuration
region-name RG1
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface GigabitEthernet1/0/1
port link-type access
port default vlan 11
stp edged-port enable
#
interface GigabitEthernet1/0/2
port link-type trunk
port trunk allow-pass vlan 2 to 20
stp instance 1 cost 20000
#
interface GigabitEthernet1/0/3
port link-type trunk
port trunk allow-pass vlan 2 to 20
#
return
注意事项
- 域三要素全网一致:域名、VLAN 与实例的映射关系、修订级别,四台设备任何一项不同就不在一个 MST 域里,实例间负载分担直接失效;映射改动后必须 active region-configuration 激活。
- 本举例适用于S系列交换机各版本。与终端相连的端口不用参与MSTP计算,建议将其设置为边缘端口或去使能STP;在MSTP模式下,实例0重新收敛之后会影响非0实例的收敛,排障时留意实例 0 的动静。
- 路径开销计算方法全网统一用一种(示例用华为计算方法 legacy),混用不同算法的开销值没有可比性,阻塞点会算错地方。
- 开销 20000 的方向别配反:SwitchC 抬实例 2、SwitchD 抬实例 1,两台接入的阻塞口错开,流量才分成两股;配反了两股都挤同一边。
- 边缘端口配 BPDU 保护后,一旦收到 BPDU 就 shutdown,下挂的是交换机就不能把这类口设成边缘口。
- 根桥与备份根桥之间的链路建议绑定 Eth-Trunk(示例已按此配),单链路 down 掉会触发根保护端口转 discarding,捆起来可靠性更高。
- 改动顺序建议:先配域与根桥、开 stp enable,网络稳定后再逐台核对 display stp brief 的端口角色,与规划一致再把业务 VLAN 往里迁。
双核心双上行的结构想两条线都跑起来,VLAN 归实例、根桥归属这些对应关系,建议请诚鑫致达科技先写成一张小表,四台设备对着同一张表配,配完逐台核角色,比凭记忆一台台敲稳当。各厂商设备的命令与默认参数存在差异,本文步骤与命令均出自华为官方文档,操作前请核对你的设备型号与软件版本。
源:华为S系列交换机官方文档