AS_Path属性可以防止BGP路由在EBGP对等体之间传递时发生环路,然而当路由在IBGP对等体之间传递时,AS_Path属性的值是不会发生改变的,也就是说当BGP路由在一个AS内传递时,是无法依赖AS_Path提供的防环能力的,那么此时路由环路就有可能发生,IBGP水平分割规则就是用于解决这个问题的。
图1所示的网络中,R1与R2和R3分别建立EBGP对等体关系,而AS 64513内的三台路由器则两两建立IBGP对等体关系。现在R1将AS 64512内的10.1.1.0/24路由发布到BGP。
R1将这条路由通过BGP通告给自己的EBGP对等体R2,当然,我们并不担心这条路由在AS 64512及AS 64513之间传递时会发生环路,因为AS_Path能够起到防环的作用。
但是在AS内部的路由防环呢?当R2收到R1通告的10.1.1.0/24路由后,它将这条路由通告给自己的IBGP对等体R3及R4,R4会将该路由通告给IBGP对等体R3,而R3又会将该路由通告给R2,这就极有可能引发路由环路。
图1 IBGP水平分割规则
BGP规定,当路由器从一个IBGP对等体学习到某条BGP路由时,它将不能再把这条路由通告给任何IBGP对等体,这就是IBGP水平分割规则。在本例中,R4从IBGP对等体R2学习到的路由将不能再通告给R3,因为R3也是它的IBGP对等体。同理,R3从R2学习到的BGP路由也不能通告给R4。
IBGP水平分割规则是一个非常重要的设计,它可以在极大程度上规避AS内BGP路由传递时可能引发的路由环路问题。然而在某些场景中,它也会带来一些新的问题。
图2展示了一个示例,在这个网络中,R4增加了一个IBGP对等体R5。由于IBGP水平分割规则的限制,R4是无法将学习自IBGP对等体R2的10.1.1.0/24路由再通告给另一个IBGP对等体R5的,因此这将造成R5无法学习到去往AS 64512的路由。实际上我们不可能放弃IBGP水平分割规则,因为它确实非常重要,但是在许多场景下又必须解决IBGP路由传递的问题。这个问题有多种解决办法,例如可以在AS内部建立IBGP对等体关系的全互联模型。
图2 IBGP水平分割带来的问题
以AS 64513为例,需在该AS中所有的BGP路由器两两之间建立IBGP对等体关系,如图3所示。
图3 AS内的IBGP对等体全互联模型
在一个AS内部实现IBGP对等体全互联是一种常规的解决方案。在本例中,R2与R5、R3与R5可能并非直连的路由器,但是正如前文所说,它们无需直连,实际上AS 64513内的所有路由器可能已经运行了一个IGP协议,例如OSPF,使得该AS内的路由器能够学习到去往本AS内所有网段的路由。如此一来,R2与R5,R3与R5即可建立TCP连接并进一步建立IBGP对等体关系。
虽然R2与R5之间直接建立起了IBGP对等体关系,但是其实两者交互的BGP协议报文依然需要通过物理路径来转发,例如可能需要经过R4,只不过对于R4而言,它只是简单地转发这些报文,而不会对报文的内容感兴趣,因为报文的目的IP地址并非自己拥有的IP地址,而是R2或者R5的地址。
在一个AS内建立IBGP对等体全互联模型在许多场景中是可行的,但是在另一些场景中,却会带来问题,如果AS内的BGP路由器数量特别大时,所有的路由器两两之间建立IBGP对等体关系显然可能给网络及设备带来较大的负担,而且也降低了网络的可扩展性。好在BGP还有另外两种解决方案,它们是路由反射器及联邦。