深入理解BPDU Filtering 过滤BPDU报文

理解 BPDU Filtering 的意义( BPDU Filtering 在全局配置 与接口配置上的区别)

理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)

本文截自于博主CCNP交换技术稿件内容

BPDU Filtering 也叫 BPDU 过滤,它的意义是在某个端口上过滤 BPDU 的发送和接收,在这里需先要来理解一个前提:任何一个加入到生成树的交换机端口,都会发送并接收到相应的 BPDU报文,其中包括被规划为 portfast 的端口,它也会连续的( 秒间隔)向交换网络中发送 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 端口上,仍然不断的以 秒为一个间隔发送 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 过滤状态。