1. AS间防环(AS_Path的属性1和属性2)
AS间运行的是EBGP,为了防止AS间产生的环路,当BGP设备接收EBGP对等体发来的路由时,会将路由信息AS_path列表中带有本地AS号的路由丢弃。
AS属性4种类型
1)AS_SET,一个无序的AS号列表。
2)AS_SEQUENCE,一个有序的AS号列表。
3)AS_CONFED_SET,BGP联盟中特有的AS_PATH类型,类似AS_SET,其列表中含有的AS号均属于BGP联盟中的AS号。
4)AS_CONFED_SEQUENCE,BGP联盟中特有的AS_PATH类型,类似AS_SEQUENCE,其列表中含有的AS号均属于BGP联盟中的AS号。
在这里主要讨论属性1和属性2,属性3和属性4在联盟内防环再讨论,接下来首先讨论属性2。
属性2,AS_SEQUENCE
如上图所示,各AS之间运行EBGP协议,在R1创建四个环回口,并采用Network命令发布,在R4查看BGP路由协议。
不难发现,AS_Path指示出该路由更新信息经过了哪些AS路径,主要作用是保证AS之间无环路。AS_Path属性按照一定次序记录了某条路由从本地到目的地所经过的所有AS号。当BGP将一条路由通告到其他AS时,便会把本地AS号添加在AS_Path列表的最前面。收到此路由的BGP路由器根据AS_Path属性就可以知道去目的邗所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。如上图所示,路由先经过AS 100,记录为100i,路由再经过AS 200,记录为200 100i。
使用AS路径属性的目的是保证无路由环路。通常情况下,当一个路由更新到达一个AS的边界路由时,如果边界路由器发现这个AS号码在路由的AS路径属性中已经存在,边界路由器会丢弃这个路由。
在R1上查看BGP路由,很明显没有从R2与R3学到本AS发布的路由。
属性1,AS_SET
在R2对学到的4条路由进行聚合,并抑制明细路由,具体配置如下所示:
#
bgp 200
aggregate 172.16.0.0 255.255.0.0 detail-suppressed
#
在R4查看BGP路由
不难发现在AS_Path里,只有AS 200,没有原来的AS 100了,也就说在路由聚合的场景下,会丢失明细路由的AS_Path,导致环路产生。采用属性2防环已经不起作用了,因为AS 100对于这条路由,它会分别AS 200与AS 300接收的,因为该路由AS_Path列表没有与AS 100的号码。
注:
BGP路由聚合分为手动聚合和自动聚合两种,aggregate命令用来实现手动聚合。该命令可以对BGP本地路由表中的路由进行聚合。手动聚合后的路由的优先级高于自动聚合。聚合路由在本地的出接口为NULL0,当其他交换机收到聚合路由后会自动加上出接口。
为了防止环路产生,需要对聚合路由AS_Path进行处理下,让它带上明细路由的AS_Path,只作为防止路由环路的作用。
这里需要修改聚合路由命令,具体配置如下示:
#
bgp 200
aggregate 172.16.0.0 255.255.0.0 as-set detail-suppressed
#
再次查看R4与R1的BGP路由表
很明显,增加这条命令后,BGP路由就增加了明细路由的AS_Path号,增加了AS号100,这样R1就不会再从R2及R3学习到聚合路由了,这样就避免了路由环路了。
注:
这里的AS_Path的100与属性2的AS_Path是不一样的,因为属性2的是有序,这里的是无序的,为了更好地查看效果,增加R5,并在R5上创建4个环回口,采用Network发布。
在R4上查看BGP路由表
很明显AS_Path变200{500 100}i,在这里200是有序的,而500与100是无序的。
注:
当在R2进行路由聚合时,当抑制明细路由时,会发现R2与R5上彼此学习不到对方的路由条目,所以做BGP的路由聚合时,一定合理配置。
2. AS内防环(IBGP的水平分割原则)
从IBGP邻居所收到的路由信息,不会传递给其它的IBGP邻居,但可以传递给EBGP邻居,即IBGP的防环机制。
注:
若无此机制,那么当三个路由器两两相连,并建立了IBGP邻居之时,那么此时其中一个路由器发送的更新将在三个路由器之间无限循环。
水平分割的原理是在RIP那里的提到的,一个接口收到的路由不会从这个接口再次发送出去,但是这里的BGP水平分割,我认为不是RIP那种,只是类似的叫法。
搞清几个小问题:
同步问题:
同步是在IBGP和IGP路由表之间起限制的,也就是说,从IBGP与IBGP之间学习路由受同步限制,这个问题是为了防止路由黑洞,虽然同步防止了路由黑洞,但是没有解决这个问题,MPLS解决了路由黑洞。
黑洞的后果:
导致丢弃所有没有路由的数据包。
前因后果:
为了防止AS内部环路,才有了水平分割原则;
有了水平分割原则,才导致从IBGP邻居收到的路由不能传递给IBGP邻居,所以IBGP路由学习存在问题(造成路由黑洞);
因为IBGP路由学习存在问题,所以需要全互联、反射与联盟;
所以说到底,全互联、反射与联盟都是为了解决水平分割原则造成的问题。
同样,全互联、反射、联盟与MPLS也是为了解决路由黑洞的。
注:
全互联,包括物理全互联与逻辑全互联。
3. 联盟防环(AS_Path的属性3、属性4及水平分割原则)
当然也可以把联盟防环分为成员AS间防环(采用AS_Path的属性3与属性4),与成员AS内防环(采用水平分割原则)。
讨论完AS间的属性1和属性2,再来讨论下联盟内的属性3和属性4,具体拓扑如下:
属性4,AS_CONFED_SEQUENCE:
在R2关闭e1/0/0接口,并且关掉路由聚合功能,分别在R3与R4查看BGP路由表。
R3的BGP路由表
R4的BGP路由表
注:
属性1:采用{}表示;
属性2:没有采用任何括号表示;
属性3:采用[]表示;
属性4:采用()表示。
在自治系统之间传递路由信息,成员AS号不会出现,而是以联盟的形式出现的,在成员自治系统之间传递路由信息时,联盟AS号不会出现,而是以成员AS号出现的。
我们知道,原本AS间采用IBGP互联,并采用水平分割原则的,现采用了联盟打破了水平分割原则,即各个成员自治系统之间可以进行相互传递路由信息。如AS 100可以传递给AS 200,AS 200可以把从AS 100收到的路由传递给成员AS 300、AS 500及外部AS 400,AS 300收到AS 200传来路由,如果R1与R3再建立联盟内EBGP关系,R1会把从R1发出去的路由信息,再次发给R1。这样就形成了路由环路。
这时,采用AS_PATH属性4,即AS_CONFED_SEQUENCE,类似AS_PATH的属性2进行防环。当AS 100从AS 300收到路由时,发现AS_CONFED_SEQUENCE列表包含AS 100号,就拒绝引入,这样就避免了路由环路。
属性3,AS_CONFED_SET:
在R2进行路由聚合,具体配置如下:
#
bgp 200
aggregate 172.16.0.0 255.255.0.0 detail-suppressed
#
与属性1进行对比,不难发现,在R1肯定可以学习到这条路由,这样也就·
#
bgp 200
aggregate 172.16.0.0 255.255.0.0 as-set detail-suppressed
#
配置完后,在R1与R3查看BGP路由表如下示:
R1的BGP路由表
R3的BGP路由表
此时,R1学习不到聚合路由了,路由环路问题解决了,但是,在R3出现了(200 100)i,注意,这里的100是无序的,而200是有序的。在这里建立R2与R5之间的EBGP邻居,再次查看R3的BGP路由表,就比较清楚了。
此时,AS_PATH为(200)[500 100]i,200表示有序,而500,100是无序的。同时,也会像上文提到的那样,这时R1与R5之间的路由无法相互传递,所以在配置路由聚合时,一定要合理配置。
水平分割原则:
在各个成员AS内,建立了依然是IBGP关系,这时依然遵循的是BGP的水平分割原则,即从IBGP邻居收到的路由信息,不会再转发给IBGP邻居。所以各个成员AS内,仍然需要建立全互联或采用反射。
4. 反射防环(采用Cluster_List和Originator_ID)
当然也可以把反射防环,分为集群间防环(采用Cluster_List)与集群内防环(采用Originator_ID)
在讲反射防内环之前,首先明白几个概念:
1)路由反射器RR(Router Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
2)客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
3)非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部所有非客户机与所有RR之间仍然必须建立全连接关系。
4)始发者(Originator):在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。
5)集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。
RR向IBGP邻居发布路由规则如下:
1)从非客户机学到的路由,发布给所有客户机。
2)从客户机学到的路由,发布给所有非客户机(发起此路由的客户机除外)
3)从EBGP对等体学到的路由,发布给所有非客户和客户机。
几个小问题:
1)集群内,客户机之间可以建立IBGP关系吗?
在路由反射器技术中规定,同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立IBGP连接,不需要与其他客户机建立IBGP连接,从而减少了IBGP连接数量。
2)集群间,客户机之间可以建立IBGP关系吗?
这个也不需要建立IBGP连接。
3)一个客户机,可以同时属于2个集群吗?
一个客户机可以同时属于多个Cluster。
一个Cluster也可以包括一个或多个的RR。
4)一个RR可以是其它RR的Client吗?
一个AS中可以存在多个集群,各个集群的RR之间可以建立IBGP对等体。当RR所处的网络层不同时,可以将较低网络层次的RR配成客户机,形成分级RR。当RR所处的网络层次相同时,可以将不同集群的RR全连接,形成同级RR。在实际的RR部署中,常用的是分级RR的场景。
5)备份路由RR,是怎么分工的?
为增加网络的可靠性,防止单点故障对网络造成影响,有时需要在一个集群中配置一个以上的RR。由于RR打破了从IBGP对等体收到的路由不能传递给其他IBGP对等体的限制,所以如果同一个集群内存在多个RR,则它们之间中又可能存在环路,因此这里又规定,同一集群中的所有RR必须使用相同的Cluster_ID,以避免RR之间的路由环路。
两个的配置没有什么不同,也没有主备之分,可理解为互为备份。
采用Originator_ID:
如上图所示,在AS 100里建立OSPF协议,IGP内路由可达,把R1设置为RR1,Cluster_ID为1,R2设置为RR2,Cluster_ID为2,而R3同时为RR1与RR2的Client。同时,在R1上配置首先值项,把从R2收到的路由首选值设为100,从R3收到的路由首选值设为10,这样,当同时从R2与R3收到相同目的地址的路由时,R1会优先选择从R2接收的路由。
在R3发布3.3.3.3/32的路由,R2收到R3路由后,也会发布给R1,R1会收到R2与R3发来路由,收到R2与R3的路由后,首先检测Cluster_List列表是否存在Cluster_ID为1的路由,如果都不存在,(路由都可达)再比较首选值大小,优先选择首选值较大的路由。这时R1把从R2收到3.3.3.3/32的路由设为最优。
又由于Cluster_List里没有本地Cluster_ID,所以,RR1对该条路由进行反射,发送至R3,如果R3接收该路由就会形成路由环路了。
R2发给R1的BGP路由更新
R1发给R3的BGP路由更新
在这种情况下,采用Originator_ID防环,因为很明显在Originator_ID属性里显示的是3.3.3.3,正是该路由发出去的路由,所以R3就拒绝接收这条路由,避免了环路的产生。
采用Cluster_List:
针对以上图实例,也可以把RR1与RR2的Cluster_ID都修改为1,这样,R1不仅不会接收从R2发来的BGP路由,更不会为该路由做反射。
另外,还有一种情况,也是采用Cluster_ID防环的,具体如下图所示:
上图是一个分级反射器的案例,具体组网情况如下:
1)R1分别是RR1与RR2的Client, RR1与RR2的Cluster_ID均为1;
2)RR1、RR2与R5均为RR3的Client,RR3的Cluster_ID为2;
3)所有路由器均属于AS 100,且运行OSPF协议,路由可达;
4)在R1采用BGP发布1.1.1.1/32。
查看R4上BGP路由表,如下图所示:
在R3与R4之间抓包,查看R4发送给R3的BGP路由更新,如下图所示,不难发现,R4又把1.1.1.1/32的路由更新给R3,这时,如果R3没有采用Cluster_ID进行防环,R3会接收R4发来的路由,这样就会造成路由环路。
查看R3的路由表,如下图所示:
很明显,R3并没有接收R4发来的BGP路由,原因是Cluster_List列里已经包含了本地Cluster_ID(即1),所以就会拒绝接收该条路由,这样就避免了路由环路。