BFD从本质上讲是一种高速独立的Hello协议,目的是在两个的3层节点之间进行链路之间的高速动态检测,值得注意的是这里的三层链路既可以是物理三层链路(物理直连,物理专线等),由于现有网络的速度已经发展的很快,BFD可以做到毫秒级别的相应,与传统的检测方式(如动态协议的Hello包等等)相比通过BFD可以大大减少网络的收敛时间,保证网络可以告诉动态的在备用链路之间进行切换,这样的好处不言而喻。



BFD技术要点:

  • 三层之间的通信,这里既可以指物理直连(专线),也可以指代逻辑直连(如2层MPLS ***(VPLS),各种隧道技术(IPsec、GRE、DM***)等)

  • 本质是一个不可路由的快速Hello包,采用UDP进行封装。

  • BFD的故障检测时间远小于1秒,可以更快地加速网络收敛,减少上层应用中断的时间,提高网络的可靠性和服务质量。

  • BFD的可以为很多上层协议联动,如各种动态路由协议,静态路由等等。

  • 需要在两端都要进行配置

由于静态路由的实现,比动态路由协议更为复杂,我们这里就利用静态路由来给大家讲解BFD


实验:

情景一:

R1和R2之间有两条链路,一条是专线。另外一条是虚拟链路,是基于Internet的GRE隧道。R1的tunnel0口ip为10.10.10.1/24,R2的隧道口IP为10.10.10.2/24。


配置命令:

router(config-if)#bfd interval {50-9999 in milliseconds} min_rx {50-9999 in millicseconds} multiplier {3-50}

router(config)#ip route static bfd {interface type}  {Interface number}  {gateway address}

router(config)#ip route {network address} {network mask} {interface(which bfd enabled)} {next-hop address}


要求R1、R2的172.16.x.x流量平时走专用链路,如果检测到发生故障那么需要走GRE隧道。

spacer.gif双向链路检测(BFD)之静态路由篇_第1张图片



实验配置:

R1:

R1(config-if)#int e0/0

R1(config-if)#bfd interval 500 min_rx 500 multiplier 3            #在需要开启BFD的接口下输入间隔、最小接收时间、和几倍的间隔的holddown时间等参数

R1(config)#ip route static bfd e0/0 10.1.1.2            #建立BFD邻居关系,后面的是对端直连三层地址

R1(config)#int tunnel 0                                            

R1(config-if)#tunnel mode gre ip

R1(config-if)#tunnel source Ethernet0/1

R1(config-if)#tunnel destination 25.1.1.2

R1(config)#ip route 172.16.2.0 255.255.255.0 tunnel 0 10.10.10.2 10         #设置备用GRE隧道的备用静态路由,修改AD值为10,使其正常不走这条链路。


类似的配置R2

R2:

R2(config-if)#int e0/0

R2(config-if)#bfd interval 500 min_rx 500 multiplier 3

R2(config)#ip route static bfd e0/0 10.1.1.1

R2(config)#int tunnel 0

R2(config-if)#tunnel mode gre ip

R2(config-if)#tunnel source Ethernet0/1

R2(config-if)#tunnel destination 25.1.1.1

R2(config)#ip route 172.16.1.0 255.255.255.0 tunnel 0 10.10.10.1 10


我们来看一下路由表,通过观察可以看到,分别有R1和R2分别有去往对端172.16.x.0/24网络的静态路由。

spacer.gif图片.png


通过show ip static route进一步查看分别可以看到:通过专线的网络处于Active状态,并且有BFD检测。spacer.gif图片.png


现在我们可以将两个交换机中间的某个接口shutdown掉,模拟链路故障,几乎与shutdown接口的同时,R1和R2上跳出了这条日志信息。显示BFD检测失败,表示专线之间链路存在问题

图片.pngspacer.gif


我们再来查看一下R1和R2的路由表,可以观察到原来的专线链路中的路由信息已经被转化成了Non-active状态,GRE隧道的备用路径已经开启。

spacer.gif图片.png


从R1上ping对端地址172.16.2.1,验证可达

spacer.gif图片.png


我们再来开启之前shutdown的接口,经过一会的等待时间,R1和R2弹出下面的日志

spacer.gif图片.png


再开查看路由发现原有路由恢复正常spacer.gif图片.png


通过traceroute发现,的确走了所需路由。

spacer.gif图片.png



情景2:

在公司Internet网关设备上有多条上行链路链路从不通的运营商接入时,也可以利用这个进行切换。

spacer.gif双向链路检测(BFD)之静态路由篇_第2张图片

环境说明:

R1作为公司的出口设备,分别具有两条互联网的上行链路来自两个不通的运营商。平时NAT进行负载均衡,当一条链路断掉的时候进行自动切换(这里的自动切换利用BFD达到)。实验中我们利用8.8.8.8测试互联网的连通性。


实验中,关于NAT部分已经预配好,这里不是我们讨论的话题,因此不再过多的进行描述。后面会专门做一篇文档讲解如何做到双上行网络的负载。


配置:

R1

R2(config)int e0/1

R2(config-if)bfd interval 500 min_rx 500 multiplier 3

R2(config-if)int e0/2

R2(config-if)bfd interval 500 min_rx 500 multiplier 3

R2(config-if)ip route static bfd e0/1 12.1.1.1

R2(config)ip route static bfd e0/2 13.1.1.1

R2(config)ip route 0.0.0.0 0.0.0.0 e0/1 12.1.1.1

R2(config)ip route 0.0.0.0 0.0.0.0 e0/2 13.1.1.1


R2

R2(config)int e0/0

R2(config-if)bfd interval 500 min_rx 500 multiplier 3

R2(config)ip route static bfd e0/1 12.1.1.2 unassociate    #这里说明一下unassociate这个参数,在正常情况下需要有一条静态路由的关联到接口上时才能生效,但是有了这个参数就可以在没有任何路由的情况下生效。这里只做了互联网连接运营商无法知道也不能知道任何内部的路由,因此需要做这条参数


R3

R3(config)int e0/0

R3(config-if)bfd interval 500 min_rx 500 multiplier 3

R3(config)ip route static bfd e0/1 12.1.1.2 unassociate


这样就配置好了。在双上行链路没有故障的时候可以看到有两条默认路由指向不同的运营商并负载均衡。并且都进行了BFD检测。

spacer.gif双向链路检测(BFD)之静态路由篇_第3张图片

spacer.gif双向链路检测(BFD)之静态路由篇_第4张图片


我们可以验证一下,选择任意一台user进行测试。    #这里的user用路由器模拟

spacer.gif图片.png

通过Traceroute可以发现,这时用户走的是ISP1的线路。

spacer.gif双向链路检测(BFD)之静态路由篇_第5张图片


我们去R2上关闭掉这个E0/0接口,模拟线路故障。R1产生这条日志信息

spacer.gif图片.png

再次查看路由表发现,由于BFD检测失败,ISP1的默认路由被改为了Non-active

spacer.gif双向链路检测(BFD)之静态路由篇_第6张图片

再从用户的角度去traceroute一下,发现这里走了运营商2的线路。

spacer.gif双向链路检测(BFD)之静态路由篇_第7张图片


当然,如果有需要的话,可以修改某条上行链路的默认路由的AD,做线路热备,并不一定要负载。


本篇文档就介绍到这里,希望能帮助到你。需要实验拓扑的小伙伴可以关注一下我,给我私信或者加我的QQ,我可以将我的实验环境分享给你。谢谢