CCNP16-BGP的水平分割问题
打破水平分割:联邦、反射器
当一个AS内路由器过多时,由于IBGP水平分割的原因,一个路由器要和很多路由器建邻,导致过于麻烦,邻居数也过多,所谓有条件的打破IBGP水平分割,在管理员确认无环的前提下来去除IBGP水平分割限制。
一、路由反射器
角色:
存在三种角色:1、 RR(反射器) 2、 客户端 3、 非客户端
RR分别与客户端和非客户端都是IBGP邻居关系,三者构建为一个簇(组),在一个簇内设备的数量不限制;在一个簇中至少存在一台RR和一台客户端;
规则:
RR从一个EBGP邻居处学习到的路由,传递给本地客户端、非客户端、其他的EBGP邻居;
RR从一个客户端学习到的路由条目,传递给本地其他客户端、非客户端、其他EBGP邻居;
RR从一个非客户端学习到的路由条目,传递给本地的其他客户端、EBGP邻居;不传递给其他的非客户端;
注意到,只有从非客户端学习到的路由条目,不传递给其他的非客户端;即非非不传
注:RR将路由条目反射给其他IBGP邻居时,不修改条目中的属性;反射条目在RR本地一定是优秀,否则无法传递;
首先我们在AS 234内,为了减少邻居关系的建立,我们让R2和R3建邻,R3和R4建邻即可,然后使用路由反射器,这里只需让R3成为RR,R2或R4其中一个成为客户端即可,那么R3可以从客户端R2学习路由,然后反射给非客户端R4。
R2(config)#router bgp 234
R2(config-router)#neighbor 3.3.3.3 remote-as 234
R2(config-router)#neighbor 3.3.3.3 update-source loopback 0
R2(config-router)#neighbor 3.3.3.3 next-hop-self
R3(config)#router bgp 234
R3(config-router)#bgp router-id 3.3.3.3
R3(config-router)#neighbor 2.2.2.2 remote-as 234
R3(config-router)#neighbor 2.2.2.2 update-source lo0
R3(config-router)#neighbor 4.4.4.4 remote-as 234
R3(config-router)#neighbor 4.4.4.4 update-source lo0
R4(config)#router bgp 234
R4(config-router)#neighbor 3.3.3.3 remote-as 234
R4(config-router)#neighbor 3.3.3.3 up lo0
R4(config-router)#neighbor 3.3.3.3 next-hop-self
让R2成为我的客户端,同时我成为RR
R3(config-router)#neighbor 2.2.2.2 route-reflector-client
R1#ping 5.5.5.5 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 5.5.5.5, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 80/81/88 ms
切记:在真机上,一旦一台设备成为RR或者客户端,那么next-hop-self将失效;在模拟器上生效;
故在真机上使用route-map来取代该指令
R2(config)#route-map next permit 10
R2(config-route-map)#set ip next-hop peer-address
R2(config-route-map)#exi
R2(config)#router bgp 234
R2(config-router)#neighbor 3.3.3.3 route-map next out
R2#clear ip bgp * soft
以上策略的意义在于将路由传递给邻居3.3.3.3的时修改下一跳为本地地址;
簇id
RR将一条路由反射给其他路由器时会加上自己的簇id(默认等于route id),若本条路由又被反射给我自己,而包含了自己的簇id,那么将直接丢弃,用来防环。
起源者
RR将一条路由反射给其他路由器时还会加上起源者的route-id,若这条路由被反射给了起源者,那么起源者也会丢弃,用来防环
举例:
R1、R2、R3、R4、R5在同一个AS内,两两互相为邻居,想让路由互相传递,就必须时R2,R3,R4都为RR,客户端无所谓,那么路由将由R1传给R2,R2反射给R3,R3反射给R4,R4反射给R5,
情况一:
若R4的客户端为R2,那么R4从非客户端R3学习的路由就会反射给R2,而这条路由又是R2传递给R3的,即R2给R3,R3给R4,R4给R2,成环,所有有了簇id解决这个问题,即R2将这条路由反射给R3时,给这条路由加上了自己的簇id,当这条路由再回到R2时,因为有自己的簇id,R2将不学习。
情况二:
若R4的客户端为R1,那么R4从非客户端R3学习的路由就会反射给R1,而这条路由又是R1传递过来的,成环,所以有了起源者解决这个问题,即R2将这条路由反射给R3时,给这条路由加上了起源者R1的route-id,当这条路由再回到R1时,因为有自己的route-id,R1将不学习。
二、联邦
作用:将一个大AS逻辑的划分多个虚拟的小AS;小AS间为联邦内的EBGP邻居关系,这种关系间路由的传递性和真实EBGP邻居一致,但传递过程中条目的属性不变化(更改ebgp多条和next-hop-self),生成的路由管理距离为200;
对于其他的大AS也不清楚这些小AS的情况;
- 所有建邻和配置均基于小AS编号进行
- 联邦内所有设备声明自己所在的大AS号
R2(config)#router bgp 23
R2(config-router)#bgp confederation identifier 234 //声明自己所在的大AS号
3)小AS间的EBGP邻居关系,需要互指peer;
R3(config)#router bgp 23
R3(config-router)#bgp confederation peers 4 //对端的小AS号
总结:在实际工程中,常常将反射器和联邦同时使用,协同工作,减少配置量;