通告原则
- BGP通过network、import-route等方式生成BGP路由后,通过Update报文将BGP路由传递给对等体
- BGP通告遵循以下原则
-
- 只发布最优且有效路由
-
- 从EBGP对等体获取的路由,会发布给所有对等体
-
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体
-
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBPG路由),它将不能使用该路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF,静态路由等)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题
原则一 只发布最优且有效路由
通过display bgp routing-table命令查看BGP路由表,同时存在以下两个标志的路由为最优、有效:
- “*”:代表有效
- “>”:代表最优
原则二 从EBGP对等体获取的路由,会发布给所有对等体
R2从EBGP对等体获取的BGP路由,会发布给所有EBGP、IBGP对等体
原则三 IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体
如图,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体——R2将路由传递给R3,R3传递给R1,R1又传递给R2,会形成环路
原则四
如图:
- BGP路由器R4上存在一条路由BGP10.0.4.0/24,R4将其传递给R2
- R2将路由传递给非直连IBGP对等体R3
- R3将路由传递给R5
- 之后R5向10.0.4.4发起访问
- R5查找路由表,将报文发送给R3
- R3收到报文后查找路由表,匹配到一条BGP路由,下一跳为R2,但是R2为非直连下一跳,需要进行迭代查询,通过IGP学习到的R2的路由下一跳为R1,R3将此报文发送给R1
- R1收到报文后查找路由表,因为R1并非BGP路由器,未与R2建立IBGP对等体关系,因此R1上并无BGP路由10.0.4.0/24,路由查找失败,R1将报文丢弃
解决水平分割的问题,可以用IBGP全互联和反射器
IBGP全互联缺点是:
- 路由器需维护大量的TCP及BGP连接,尤其在路由器数量较多时
- AS内BGP网络的可扩展性较差
反射器
- 引入路由反射器之后存在两种角色:
-
- RR(Route Reflector):路由反射器
-
- Client:RR客户端
- RR会将学习的路由反射出去,从而使得IBGP路由在AS内部传递无需建立IBGP全互联
- 将一台BGP路由器指定为RR的同时,还需要指定其Client。至于Client本身,无需做任何配置,它并不知晓网络中存在RR
路由反射规则
如果路由反射器从自己的非客户对等体学习到一条IBGP路由,则它会将该路由反射给所有客户
如果路由反射器从自己的客户学习到一条IBGP路由,则它会将该路由反射给所有非客户,以及除了该客户之外的其他所有客户
如果路由学习自EBGP对等体,则发送给所有客户、非客户IBGP对等体
发送和反射的区别:发送指传统情况下(相当于RR不存在的场景下)的BGP路由传递行为,而反射指遵循路由反射规则的情况下,RR执行的路由传递动作,被反射出去的路由会被RR插入特殊的路径属性;路由器收到反射的路由的下一跳还是指向始发路由的路由器
RR场景下的路由防环
- RR的设定使得IBGP水平分割原则失效,就可能导致环路产生,为此RR会为BGP路由添加两个特殊的路径属性来避免出现环路:
-
- Originator_ID
-
- Cluster_List
- 这两个属性都属于可选过渡类型
Originator_ID属性
- RR将一条BGP路由进行反射时会在反射出去的路由中增加Originator_ID属性,其值为本地AS中通告该路由的BGP路由器Router ID
- 若AS内存在多个RR,则Originator_ID属性由第一个RR创建,并且不被后续的RR所更改
- 当BGP路由器收到一条携带Originator_ID属性的IBGP路由,并且Originator_ID属性值与自身的Router ID相同,则它会忽略关于该条路由的更新
R3收到来自R2的BGP路由10.0.2.0/24,在反射给R1时会添加上Originator_ID:10.0.2.2,R1收到之后再次反射给其客户端R2时携带Originator_ID,R2收到之后查看Originator_ID属性值存在自身的Router ID,则忽略该路由更新
Cluster_List属性
- 路由反射族包括反射器RR及其Client。一个AS内允许存在多个路由反射族
- 每一个族都有唯一的族ID(Cluster_ID,缺省时为RR的BGP Router ID)
- 当一条路由被反射器反射后,该RR(该族)的Cluster_ID就会被添加至路由的Cluster_list属性中
- 当RR收到一条携带Cluster_list属性的BGP路由,且该属性值中包含该族的Cluster_ID时,RR认为该条路由存在环路,因此将忽略广宇该条路由的更新
- R2发送给R1的路由,经过R1反射给R3时除了添加Originator_ID之外还会添加Cluster_List属性:10.0.1.1,R3再次反射给R4时,Cluster_List为:10.0.3.3 10.0.1.1,R4反射给R1时Cluster_List为:10.0.4.4 10.0.3.3 10.0.1.1
- 当R4将路由反射给R1时,R1发现Cluster_List包含了自身Cluster_ID,判断存在环路,从而忽略该路由更新