在包含成百上千的BGP路由设备的大型自治系统中,路由管理问题无疑是对网络管理员的严峻挑战。而在大型的BGP AS内,因为BGP的规则规定,一台IBGP路由器不得把从第2台IBGP PEER学到的路由通告给第三台IBGP PEER。因此,这就得要求我们在设计AS内的IBGP组网拓扑时以全互连(FULL-MESH)的方式搭建IBGP物理拓扑,如果不这样,AS内的各IBGP路由器因遵循上述规则,可能会导致该AS内(局部)出现路由黑洞问题。如果我们在AS内采用Full-mesh全互联的组网拓扑结构,又会导致出现大量的IBGP会话网(在现代ISP网络中,IBGP会话网的规模会日益庞大,每台BGP路由器可能有超过100条IBGP会话)。如下图所示:
别说管理了,笔者看着都眼晕>
这真是一个两难的“尴尬”局面。如此,人们非常期盼一种新型的能解决大型AS内IBGP会话网规模过于庞大复杂这一根本问题的IBGP对等技术的出现。基于此,路由反射器(Route Reflector)的概念便应运而生。
那什么是路由反射器(Route Reflector,可以简称为RR)?笔者在此给它作个概述上的描述——路由反射器是执行路由反射功能的IBGP路由器。
路由反射器解决“大型AS内IBGP会话网规模过于庞大”问题的基本思路是将一台HUB路由器明确(人为)指定为IBGP会话的焦点路由器,而其它的常规BGP路由器(路由反射器的客户端)可与这台HUB路由器(路由反射器)建立IBGP邻居关系,然后路由反射器之间再彼此相互对等。尽管BGP的规则定义了从一台IBGP路由器学到的路由不能被通告给另一台IBGP路由器。但在部署了路由反射器的组网环境中,BGP路由反射器的路由反射机制却允许路由反射服务器遵循既定的反射规则“反射”路由,从而放宽了对IBGP全互连的限制。
当然啦,在大型的AS内存在大量IBGP会话,针对这种组网环境我们才建议部署路由反射器。小规模的自治系统内因IBGP会话的数量少,你去部署路由反射器反而会给路由反射服务器带来额外的处理开销,而且,一旦配置不当还容易引起路由环路并造成路由的震荡。不是有句话嘛——没有绝对的好的技术,只有更适合于某个环境的解决方案。事物都有其双面性,诚然,技术也一样,因此,路由反射器也不是说它就适合于所有网络。
举个栗子说明一下吧:
如上图所示,R1、R2与R3在逻辑上建立了IBGP全互连关系。每台BGP路由器都是另外2台路由器的BGP PEER。R1与R2以及R2与R3之间都是物理直连,R1与R3之间没有物理连接链路。
ASN 123一旦收到来自外部AS的BGP PEER的路由更新(UPDATE),R1便会将此路由更新通告转发给自己的2个IBGP PEER(R2和R3)。R2和R3随之再将路由更新传递给各自的eBGP PEER。
因为R3是R2的IBGP PEER,且R2收到的这条路由更新来自于另一个IBGP PEER(R1),所以R2将遵循IBGP路由通告规则,它不会将从R1收到的UPDATE消息通告给R3。如果我们不在R1与R3之间建立IBGP会话,那R3就麻烦了,它将收不到路由更新。
基于此,我们在BGP的AS内就必须得建立全互连的IBGP会话。
我们将R2配置为RR那情况就不一样了,如下图:
R1与R3之间不建立IBGP会话,因R2为RR,所以它(RR)会反射从IBGP邻居R1接收到的路由更新给自己的另外一个IBGP邻居R3,这样R3就能很愉快地学习到相应的路由。
作了前面的一些铺垫性文字,接下来笔者要介绍在引入了路由反射器的组网拓扑中所出现的几个相关术语以及基础概念。
(1)Route Reflector Server路由反射服务器:即路由反射器,可以简称为RR,执行路由反射功能的BGP路由器。允许把从iBGP对等体学到的路由反射到其它iBGP对等体,该角色就像一面镜子一样,将从一处收到的光线折射到另外一处,RR主要用来反射路由给其相应的客户端。
(2)RR-Client路由反射器客户端:与RR形成反射邻居关系的iBGP设备,在AS内部Client只需要与RR直连,被RR指定用来反射路由的BGP设备,由RR来(人为)决定哪台设备作为Client。Client是不知道(也不需要知道)自己是Client的。
(3)Non-Client非客户端:既不是RR也不是Client的iBGP设备。在AS内部Non-Client与RR之间以及所有的Non-Client之间仍然必须建立全互连的iBGP邻居关系。
(4)Cluster集群:RR和RR-Client的一组集合。其所对应的Cluster_list属性用于防止集群间产生路由环路。
(5)Originator始发者:在AS内部始发路由的BGP设备。其所对应的Originator_ID属性用于防止集群内产生路由环路。
任何RR收到通往相同目标网络的多条BGP路由,同样也是按照标准的BGP决策过程,依据“路径择优算法”从中选择最优(best)路由。并且,会根据如下“操作原则”在AS内部进行路由传递。
【规则一】RR对于接收自Non-Client的最优路由,仅反射给其RR-Client;
【规则二】RR对于接收自Client的最优路由,既反射给其所有其它RR-Client,同时也会通告给与其相连的Non-Client;
【规则三】RR对于接收自eBGP邻居路由器的路由,反射给其所有的RR-Client以及Non-Client。
在了解了一些路由反射器的基础知识之后,笔者也不打算继续往下聊更深入的原理,因为摆在我们面前的还有一个非常重要且关键的问题,那就是,在BGP设备上如何配置呢?是的,那接下来笔者就引入一个包含BGP路由反射器的组网配置示例吧,如下:
那好,就先附上BGP的基础邻居底层配置
上述配置都是些基础配置,把底层拓扑构建起来,各区域的IGP协议(笔者用的是OSPF协议,通过不同进程隔离路由,通过路由引入的方式相互传递IGP路由)再加上一堆的BGP邻居关系基础配置命令,其它也就没什么了,因为目前还不涉及到策略部署,所以笔者将BGP的PEER-GROUP都拿掉了,后面的案例中再加上。另外需要说明一下的就是,R10笔者用的是一台华为下一代防火墙,听过笔者的网络安全课程看懂这个配置没有一点问题。
按照上述的脚本,配置好设备之后,整个拓扑中的BGP设备间的邻居关系建立起来就没有问题了。
但是路由学习这块会有问题,在没有部署RR的这个拓扑中,一定会存在路由黑洞(受BGP规则所限制:从IBGP PEER学来的路由不会再被通告给另外一个IBGP PEER)。
为了使整个AS 3003中的通信没有问题,接下来笔者就把相关的路由反射器配置命令加上,按照如下拓扑进行RR的配置:
3台RR(R4、R5和R10)的配置
解释一下几条关键命令的作用:
本配置示例中,仅用到上述2条RR有关的命令,还有其它命令在后续配置案例中再进行说明>
做好RR的相关配置之后,此时,笔者带各位去设备上看一下路由的学习情况,如下:
R9和R6上的BGP路由学习都很完整,但是R8上为什么172.16.60.0/24和172.16.90.0/24这2条路由没学到呢?笔者带各位再看一下拓扑图中R8的位置就明白了.......
R8能学到R3通告过来的172.16.30.0/24和8.0.0.0/5是因为这2条路由一条是30本地引入的路由另一条是R3的EBGP邻居R1通告过来的INTERNET路由,因此,R8接收这2条BGP路由就是最普通的BGP邻居路由通告吧;而另外2条路由:一条是R6本地始发的另一条是R9本地始发的,这2条路由被R4反射给了它(R4)的Client(R3),但是,R3它又不是RR,因此它没有将这2条路由继续反射给R8的义务,当然,R3即使有这份心也没这个力,因为它得遵循IBGP路由通告规则,笔者又想重复一下这条规则了,哈哈,那就是——BGP路由器从IBGP邻居学到的BGP路由不会再通告给自己另外的所有IBGP邻居,其实这条规则也很好理解,我们知道,BGP协议是运行在AS之间的大型的路径矢量EGP协议,在AS与AS间,BGP靠AS_PATH路径属性防环,那么在AS内呢,AS内BGP路由器又不CHECK这个AS_PATH PA,如果不定义这么一条规则,那路由是很容易成环的。当然,我们前面讲过一句话“部署了路由反射器的组网环境中,BGP路由反射器的路由反射机制却允许路由反射服务器遵循既定的反射规则“反射”路由,从而放宽了对IBGP全互连的限制”,那为什么RR可以反射路由(打破这个规则)而不用担心在AS内出现路由环路呢?你看呀,笔者说的这句话中还带有一个关键词——“遵循既定规则”,这里面讲的遵循既定规则指的就是笔者前面讲的那三条RR路由反射规则,所以说,虽然RR能够从它的IBGP邻居那接收路由并反射给自己的其它IBGP邻居,但是也是会遵循规则的而不是随意乱反射的,这里面还有一个更重要的防环关键因素就是接下来笔者要给各位小伙伴们看的2个BGP属性,且看下面的输出信息:
我们在R9上查看172.16.30.0/24这条BGP路由的详细信息,被笔者标绿的有2个东西:
Originator: 3.3.3.3
Cluster list: 0.0.0.3, 0.0.0.1
“Originator”
可选非过渡属性,该属性由RR产生,封装在UPDATE消息中,使用的ROUTER_ID的值标识路由的始发者,用于防止集群内产生路由环路。
表明172.16.30.0/24路由是由哪台BGP路由器始发的,即路由的始发者,后面的3.3.3.3为该路由的始发BGP Speaker的ROUTER_ID。
“Cluster_List”
集群列表,与“ORIGINATOR”一样,同样也是可选非过渡属性,是Cluster_id的列表(集合),AS内的每个集群都由唯一的Cluster_ID来标识(默认为BGP路由器的ROUTER_ID,可以手工通过命令指定,我们的这个配置示意中笔者使用的就是手工方式指定的Cluster_id)。
路由反射器使用Cluster_List属性记录路由所经过的每个集群的Cluster_ID(类似AS_PATH属性),用来在集群间避免环路。当一条路由第一次被RR反射的时候,RR会把本地Cluster_ID添加到Cluster_List的前面。如果没有Cluster_List属性,RR就创建一个。当RR接收到一条更新路由时,RR会检查Cluster_List。如果Cluster_List中己经有本地Cluster_ID,则丢弃该路由;如果没有本地Cluster_ID,则将其加入Cluster_List,然后反射该路由。
从R9上的172.16.30.0/24路由所携带的“Cluster_list”列表字段可以看出来,该路由沿路走来,其间经过了Cluster 1与Cluster 3。
通过这些文字的说明,笔者觉得各位小伙伴应该明白了Originator和Cluster list的含义了吧,为了加深对这2个属性的理解,我们再到另外一台路由器上去看另外一条路由所携带的这2个PA吧,挑R3上的90路由吧,如下:
R9本地始发的90路由,其间经过了集群3和集群1,对吧。
参照笔者的这篇小文字,各位小伙伴可以做几个实验加深一下有关路由反射器的基础概念的理解,特别是RR的路由反射规则,仔细去各路由器上详细查看一下路由的相关信息。
好了,关于RR的基础知识就聊到这吧,下篇文字我们就可以在此基础上聊聊关于路由反射器的更深入的话题了,比如RR冗余、RR设计方案等。
时间过得真快,弹指间又到周末了,笔者在此顺祝各位周末愉快哈~
在码字的过程中,难免会有一些小的笔误,如有,欢迎小伙伴们及时地提出来,便于笔者重新校对,纠正,感谢!
如果有什么学习上的疑问,可以在笔者的公众号中留言
也可以加笔者的个人WX帐号( jacky_luojun)
-------------------------
ONE NETWORKS
开放 | 创新 | 协作 | 分享
领取专属 10元无门槛券
私享最新 技术干货