方法3:路由反射器
简单介绍下:路由反射器工作在同一个AS内,路由器的角色分为RR(路由反射器)、RRC(路由反射器客户)、NOn-Clinet(非客户端)
路由反射器通告原则:当RR收到IBGP发来的路由,首先使用BGP选择路由的策略选择最佳路由。
1.RR只把最佳路由通告反射出去,不会改变路由属性(包括下一跳、LP、MED)
2.从非客户机IBGP对等体学到的路由,发布给此RR的所有客户机
3.RR从客户端学习到的路由,反射给它的所有客户端和非客户端(发起此路由的客户机除外)
4.RR从非客户端节学习到的路由,反射给它的客户端
5.从EBGP对等体学到的路由,发布给所有的非客户机和客户机。
RR的一个好处就是配置方便,因为只需要在反射器上配置,客户机不需要知道自己是客户机。
RR的防环机制:我们知道从一个IBGP学习到的路由不会再传给另一个IBGP,这样做目的是为了防止环路,引入RR就是为了人为的打破这一规则,但也为了防止环路,所以要有一个Originator_ID和Cluster_List。
Originator_ID(起源ID)属性长4字节,是由第一个路由反射器(RR)产生的,携带了本地AS内部路由发起者的Router ID(如果是本AS内的路由器发起的就发始发者Router ID,如果是AS外发起的,就为AS边界路由器的Router ID).
1)当一条路由第一次被RR反射的时候,RR将Originator_ID属性加入这条路由,标识这条路由的发起路由器。如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID.
2)当其它BGP Speaker接收到这条路由的时候,将比较收到的Originator_ID和本地的Router ID,如果两个ID相同,BGP 路由器会忽略掉这条路由,不做处理。
Cluster_List(簇列表)由一系列的Cluster_ID(簇ID,为RR的router-id)组成,描述了一条路由所经过的反射器路径,这和描述路由经过的As路径的AS_Path属性有相似之处。Cluster_List由路由反射器产生。
1)当RR在它的客户机之间或客户机与非客户机之间反射路由时,RR会把本地Cluster_ID添加到Cluster_List的前面。如果Cluster_List为空,RR就创建一个。
2)当RR接收到一条更新路由时,RR会检查Cluster_List.如果Cluster_List中已经有本地Cluster_ID,丢弃该路由;如果没有本地Cluster_ID,将其加入Cluster_List,然后反射该更新路由。
为了保证客户机可以学习到反射器发来的路由,Cluster_ID不能和客户机的Router ID相同。如果相同,客户机会将收到的路由丢弃。Cluster_List只在AS内部传播,从EBGP对等体收到的含有Cluster_List的路由将被丢弃。
配置如下:
IGP配置略,见前篇博文
R1:
router bgp 65000
no synchronization //关闭同步
neighbor 10.0.0.3 remote-as 65000 /指定IBGP邻居和AS
neighbor 10.0.0.3 update-source Loopback0 //指定更新源为LOOPBACK 0
neighbor 10.0.0.3 next-hop-self //把下跳改为自己(EBGP默认)
neighbor 10.0.0.4 remote-as 65000
neighbor 10.0.0.4 update-source Loopback0
neighbor 10.0.0.4 next-hop-self
neighbor 10.0.15.2 remote-as 65001 //指定EBGP邻居和AS
no auto-summary //关闭自动汇总
R2:
router bgp 65000
no synchronization
neighbor 10.0.0.4 remote-as 65000
neighbor 10.0.0.4 update-source Loopback0
neighbor 10.0.0.4 next-hop-self
neighbor 10.0.0.3 remote-as 65000
neighbor 10.0.0.3 update-source Loopback0
neighbor 10.0.0.3 next-hop-self
neighbor 10.0.26.2 remote-as 65002
no auto-summary
R3:
router bgp 65000
no synchronization
neighbor 10.0.0.1 remote-as 65000
neighbor 10.0.0.1 update-source Loopback0
neighbor 10.0.0.1 next-hop-self
neighbor 10.0.0.1 route-reflector-client //只需在RR上指定客户端
neighbor 10.0.0.4 remote-as 65000
neighbor 10.0.0.4 update-source Loopback0
neighbor 10.0.0.4 next-hop-self
neighbor 10.0.0.2 remote-as 65000
neighbor 10.0.0.2 update-source Loopback0
neighbor 10.0.0.2 next-hop-self
neighbor 10.0.0.2 route-reflector-client //只需在RR上指定客户端
network 10.0.0.0 mask 255.255.0.0 /静态发布路由到BGP
no auto-summary
ip route 10.0.0.0 255.255.0.0 null 0 //添加一条静态汇总路由,用来发布
R4:
router bgp 65000
no synchronization
neighbor 10.0.0.1 remote-as 65000
neighbor 10.0.0.1 update-source Loopback0
neighbor 10.0.0.1 next-hop-self
neighbor 10.0.0.1 route-reflector-client //只需在RR上指定客户端
neighbor 10.0.0.3 remote-as 65000
neighbor 10.0.0.3 update-source Loopback0
neighbor 10.0.0.3 next-hop-self
neighbor 10.0.0.2 remote-as 65000
neighbor 10.0.0.2 update-source Loopback0
neighbor 10.0.0.2 next-hop-self
neighbor 10.0.0.2 route-reflector-client
network 10.3.0.0 mask 255.255.0.0 /静态发布路由到BGP
no auto-summary //关闭自动汇总
ip route 10.3.0.0 255.255.0.0 null 0 //添加一条静态汇总路由,用来发布
R5上测试一下:
分析一下R3的路由表:
从这两条可以看出一条有起源ID一条没有,起源ID只有经过RR么射后才会有,如上面的路由经R2再通告给R4,R4从客户端学习到的路由再反射给客户端和非客户端(R3),起源ID为AS内始发路由器router-id R2 10.0.0.2 ,簇列表为RR router-id R4 10.0.0.4
结合R3和R1的路由表,我们来分析下BGP最优路由的选择原则:
我们结合下路由选择原则(
选择原则见最下面
)可以看出前面10条都是相同的,在这都无法比较最优的,我在网上找了很久路由选择原则,都没有说得很清楚的或有的地方不准确,现在大家和我一起来验证下下面的选择原则是否正确,这也是本次博文的重点!
这两张路由表,前面十条无法选择最优路由,下面看十一条,网上很多地方说是比较ROUTER-ID小的为优,那我现在就修改R3的ROUTER-ID(就是重新指定ROUTER-ID,命令bgp router-id x.x.x.x),再看一下R1的路由表,
大家可以看到由R3通告过来的路由的ROUTER-ID变成10.10.10.10了吧,10.10.10.10比10.0.0.4要大吧,但是它还是最佳路由,显然比较ROUTER-ID是不正确的。那我们接着这12条,还是R3那张路由表,由R2通告过来的路由没有Originator_ID吧(因为没经过反射),所以就用它的ROUTER-ID与另一个Originator_ID进行比较,相同则比较簇列表,由R2通过过来的路由没有簇列表,所以最优。再看R1的那张路由表(第三张图),Originator_ID和簇列表都相同吧,就比较邻居地址,显然10.0.0.3小于10.0.0.4,所以成为最优的(如果是比较ROUTER-ID的显示是第二条要优)
我们再来验证一下,把R3的邻居地址给改了(这里要重新建立BGP邻居了),再来看看,
大家可以看到这张图跟上面那张图唯一变的就是邻居地址吧20.20.20.20(上面是10.0.0.30),看到没有邻居小地址小的变成最优路由了(开始是在面最优,现在是下面这一条了) 大家在做实验中如果发现我的说法是错误的,一定要通知我哦!赶快去验证吧!
BGP最优路由选择原则总结:
1.丢弃下一条不可达的路由(这里的不可达是指全局路由表中没有下一条的路由,并不是说不能PING通)
2.在同步状态下,丢弃没有达到同步的路由
3.选择有最大Weight的路由 (范围0 到 65,535,本地始发默认为32768,weight是CISCO私有的参数,路由器配置了权重后在本地有效,即收到的为0)
4.选择LOCAL_PREF值最大的路由(范围 0到 4,294,967,295,默认都为100).
5.选择本路由器始发的路由(包括network、重分布、及汇总)
6.选择AS_PATH最短的路由(同AS中的as_path为空,只有离开AS才会加上AS号)
7.选择Origin源头最小的路由(IGP>EGP>Incomplete)
8.选择MED 值最小的路由
9.外部路由EBGP优先于联盟(confederation)外部路由优于内部路由IBGP(优选 E-BGP路由)
10.选择下一跳IBGP开销最小的路由
11.选择Router-id最小的BGP邻居通告的路由(在配置了路由反射器时具有Originator_ID属性时,不看这一条)
12.选择Originator_ID小的路由(没有Originator_ID时,用Router-id和Originator_ID进行比较,哪个小哪个优)
13.当Originator_ID相同时(没有Originator_ID和Router-id相同时),选择Cluster_List最短的路由(如果没有Cluster_List则为最优)
14.选择邻居地址最小的BGP邻居通告过来的路由(BGP只会向外通告一条最优的路由,所以这里是不可能相同的)
BGP路由通告原则:
在BGP邻居建立的基础上,将BGP表中最优的路由使用Update报文通告给BGP邻居。
(1)多条路径时,BGP只选最优的给自己使用
(2)BGP只把最优的路由通告给它的邻居
(3)从EBGP学到的路由会通告给它所有的BGP邻居(包括EBGP和IBGP)
(4)从IBGP学到的路由不通告给其它的IBGP邻居(IBGP水平分割)
(5)从IBGP学到的路由是否通告给它的EBGP邻居视同步情况而定。(非同步状态下,会将从IBGP学到的路由通告给它的EBGP邻居;同步状态下,只将达到同步的路由通告给它的EBGP邻居)
(6)BGP是距离矢量路由协议,遵从水平分割原则:包括基于邻居的水平分割、基于AS_Path的水平分割。
基于邻居的水平分割:从BGP邻居学到的路由不通告给该BGP邻居
基于AS_Path的水平分割:向EBGP邻居通告路由时,在AS_Path属性中附加上自己的AS号;接收BGP邻居通告过来的路由时,丢弃AS_Path属性中含有自己AS号的路由。
(7)BGP邻居一建立,就将自己所有的最优路由通告给它的邻居。
(8)增量更新与路由撤销
1)BGP邻居状态Established,从邻居通告过来的路由有效,BGP只需通过KeepAlive来维持邻居关系,不需要进行路由定期更新;
2)BGP采用增量更新机制:当新发布某些路由时,BGP只将这些新发布的路由通告给邻居;当某些路由失效时,BGP只向邻居发送Withdrawn消息撤销这些路由。(Withdrawn消息:将失效的路由放在BGP Update报文的不可达路由字段中)
3)BGP邻居Down,从邻居通告过来的路由立即失效,从BGP表中清除这些路由,并向其他邻居发送路由撤销消息撤销这些路由。
(9)BGP路由的管理距离
Cisco:EBGP:20 IBGP:200本地始发:200
H3C/ Quidway:EBGP:256 IBGP:256本地始发:256
路由反射器通告原则见本文前面!