理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)
本文截自于博主CCNP交换技术稿件内容
BPDU Filtering也叫BPDU过滤,它的意义是在某个端口上过滤BPDU的发送和接收,在这里需先要来理解一个前提:任何一个加入到生成树的交换机端口,都会发送并接收到相应的BPDU报文,其中包括被规划为portfast的端口,它也会连续的(2秒间隔)向交换网络中发送BPDU报文。但是在Portfast端口上发送BPDU有必要吗?没有,为什么呢?因为portfast连接都是主机,主机是不可能与交换机形成环路的,所以portfast是没必要向主机去发送BPDU报文。反过来讲portfast端口也没必要接收BPDU报文,为什么呢?桌面主机发送BPDU报文是没有意义的,但是BPDU Filtering对portfast端口收到BPDU报文时的处理方式就没有BPDU Guard那么极端,BPDUGurad是直接关闭端口。而BPDU filtering将由于不同位置的配置,产生不同的处理行为,BPDU Filtering的配置也分为全局配置和在接口上的配置,不同位置的配置将产生不同的效果。
BPDU Filtering在全局配置
在全局模式下使用spanning-tree portfast bpdufilter default指令来启动BPDU Filtering,通过指令可以看出,BPDU Filtering在全局模式下是需要依赖于portfast端口为基础来实现的,这一点和BPDU Gruad在全局模式下的配置前提是相同的。但如果用户在全局模式下启动的是BPDU Filtering,在这个时候portfast端口就不会发送BPDU报文了。如果此时当portfast端口收到BPDU报文时该端口会立即回退到常规的生成树端口,并参与生成树的选举及计算过程。关于这一点请参看演示:BPDU Filtering在全局与接口上的配置。
BPDU Filtering在接口上的配置:
用户可以在接口模式下使用spanning-tree bpdufilter enable指令来启动BPDUFiltering,注意在接口模式下启动BPDU Filtering功能时可以不依赖于portfast端口,然后在该接口上将不再发送和接收BPDU。这里的这个“该接口上将不再发送和接收BPDU”说明,就一般而言,不发送BPDU,一般都比较好理解,而这里所谓的不接收BPDU(not receive BPDUs),不如说成是忽略(ignore),又或者表达为不处理接收到的BPDU,将更为精确的表达接口级BPDU Filtering的功能,为什么这样讲?
如图所示,交换机S1的E1/0接口,可能正收到交换机S3的E1/0接口所发送的BPDU报文,该报文也能成功的到达S1的E1/0接口,为什么能到达?因为交换机S3发送BPDU报文时目标的MAC地址是一个众所周知的组播MAC(0180.c200.0000),就是众所周知的组播MAC表示所有开启STP功能的设备都能接收到相关的BPDU报文,因为该目标MAC也叫生成树的多播MAC。只是说当S3发来的BPDU报文到达S1的E1/0接口时,S1由于在接口上启动了BPDU的filtering功能,它(S1)将忽略S3发来的BPDU。或者叫接收而不处理。关于这一点请参看演示:BPDU Filtering在全局与接口上的配置。
注意:在接口上配置BPDU Filtering与在全局配置BPDU Filtering的意义是有很大区别的,在全局配置的BPDU Filtering首先要依赖于portfast端口,当收到BPDU时,全局的BPDU Filtering是采取回退为正常生成树端口的处理方式;而接口上的BPDU不需要依赖于portfast端口,并忽略(ignore)收到的BPDU报文,此时相当于在具体的某个接口上禁用了生成树功能,如果管理员没有对二层网络进行合理的设计,可能就会存在潜在的环路,所以思科强烈建议并推荐用户在全局模式上启动BPDU Filtering功能。
演示:BPDU Filtering在全局与接口上的配置
演示目标:
ü 测试BPDU Filtering在全局模式下的配置效果
ü 测试BPDU Filtering在接口模式下的配置效果
ü 一个有趣的现象:全局启动BPUD过滤,有某个时候会有少量的BPDU报文被发送。
演示环境:如图所示
演示背景:首先还是在S2和S3的交换机接口上将相应接口的交换机功能关闭( no switchport),这样就可以暂时禁止S2和S3向交换机S1发送BPDU,为测试BPDU Filtering功能做好准备工作,然后将交换机S1的E0/0-3的接口范围配置为接入模式,并在这些端口上全局的启动Portfast功能,然后通过协议分析器来取证portfast是否会发送BPDU报文,然后再在portfast端口之上启动BPDU Filtering,再来取证portfast端口是否会继续发送BPDU报文,然后在交换机S2的E0/0端口上开启交换功能(switchport),使其发送BPDU报文给S1,再观察S1的E0/0在启动BPDUFiltering的情况下,是否会将portfast端口回退到常规的生成树端口状态。最后来测试接口BPDU Filtering的配置效果,确定它是否需要依赖于portfast端口而存在,并确定接口上的BPDU过滤与全局的BPDU过滤的差异。
演示步骤:
第一步:首先将交换机S1的e0/0-3和e1/0-3的接口全部配置为交换机的接入模式端口,然后将交换机S1的所有接入模式的端口规划为portfast端口,具体配置如下,为了测试方便,建议现在就将S2和S3连接交换机S1的端×××换功能关闭(no switchport),相当于暂时禁止S2和S3向S1发送BPDU报文。
配置交换机S1的所有端口到接入模式端:
S1(config)#interfacerange e0/0-3
S1(config-if-range)#switchportmode access
S1(config-if-range)#noshutdown
S1(config-if-range)#exit
S1(config)#interfacerange e1/0-3
S1(config-if-range)#switchportmode access
S1(config-if-range)#noshutdown
S1(config-if-range)#exit
配置交换机S1的所有接入端口为portfast端口:
S1(config)#spanning-treeportfast default * 规划所有接入模式端口为portfast端口
%Warning: this command enables portfast by default onall interfaces. You *交换机系统提示一些配置portfast后的注意事项
should nowdisable portfast explicitly on switched ports leading to hubs,
switches andbridges as they may create temporary bridging loops.
完成上述配置后,可以通过在交换机S1上执行show spanning-tree来查看当前所有的接入模式端口是否成为portfast端口(也叫边缘端口),如图所示,所有接入模式的端口已经成为边缘端口。
此时,用户可以通过协议分析器,去捕获分析S1任意一个被启动了portfast端口上的数据帧,如图所示,可以清晰的看出在Portfast端口上,仍然不断的以2秒为一个间隔发送BPDU报文,这将为测试BPDU Filitering功能做好准备。
接下来在全局模式下,启动BPDUFiltering功能,具体配置如下,当完成BPDU过滤功能后,可以通过showspanning-tree summary来查看BPDU的过滤功能是否被启动,如图所示,明显可看出BPDU过滤功能已经被启动。
在全局模式下启动BPDU Filtering功能:
S1(config)#spanning-treeportfast bpdufilter default
在完成上面的配置后,再次使有协议分析器软件捕获交换机S1的E0/0所产生的数据帧,可发现S1的E0/0接口不再发送任何BPDU报文,证明BPDU Filtering生效,至少证明了BPDU过滤功能将禁止portfast端口再发送BPDU报文。
接下来,需要来取证BPDU过滤功能在收到BPDU报文时的处理行为,现在到交换机S2上的 E0/0接口启动交换机功能(switchport),相当于是让S2的E0/0向S1的E0/0发送BPDU报文。然后使用协议分析器去捕获S1的E0/0接口的数据帧。会如图所示,可以看到S1收到 S2(aa:bb:cc:00:02:00)发来的BDPU报文,并开始发送自己(S1)的BPDU报文。
然后可以在S1上通过执行show spanning-tree指令来查看当前生成树几个端口的状态,如图所示,交换机S1的E0/0由于收到了BPDU报文,BPDU过滤功能将其边缘端口(portfast)的角色回退到常规的生成树端口角色。但是它并不会像BPDU Gruad那样极端的半闭端口,如图所示,S1的E0/0端口仍然处于Up状态。
第二步:现在来检测BPDUFiltering在接口模式下的效果,首先请将S1的E1/0从portfast端口的配置中脱离出来,然后再到该端口下启动接口级别的BPDU过滤功能,这两项具体的配置任务如下所示:
将交换机S1的E1/0接口从portfast中脱离:
S1(config)#interfacee1/0
S1(config-if)#spanning-treeportfast disable * 禁用该端口的portfast功能
S1(config-if)#noshutdown
S1(config-if)#exit
在交换机S1的E1/0接口上启动BPDU的过滤功能:
S1(config)#interfacee1/0
S1(config-if)#spanning-treebpdufilter enable * 启动BPDU的过滤功能
S1(config-if)#exit
如果此时使用协议分析器捕获交换机S1的E1/0的数据帧,不难发现,在S1的E1/0上不会有任何BPDU数据帧被发送。其实这一点在接口级别的配置和在全局模式的配置的最终效果是一样的,只是说接口级别可以不再依赖于portfast端口而存在。要反在接口级别的BPDU过滤与全局模式的BPDU过滤在收到BPDU报文时的处理方式则完全不一样了,全局模式采取的是回退端口到常规生成树端口,而接口级别则是完全忽略收到的BPDU,将不做任何处理。具体取证过程如下:
在交换机S3的E1/0 端口上启动交换功能(switchport),相当于使其向S1的E1/0接口发送BPDU报文,此时会发现如图所示的情况,S1的E1/0接口上会不断的收到S3发来的BPDU报文,但是S1不会对这些报文做任何理采,也就是忽略(ignore)收到的BPDU报文,而且是无声无息的将其ignore掉。由于这种悄无声息的ignore,这个时候在网络可能会出现“一国两公”的局面,也就是一个整体的生成树网络可能存在多个根桥。
第三步:一个有趣的现象:就是用户在全局模式下已经启动了BPDU过滤功能后,就即便是此时某个具体的接口没有收到任何BPDU的报文,然后当这个端口在正式连接进入网络并且BPDU出站过滤开始之前,会有少量的BPDU被发送(Theinterfaces still send a few BPDUs at link-up before the switch begins to filteroutbound BPDUs)。但几秒中后就将进入BPDU过滤状态。