该文档涉及的命令有:
bgp fast-external-fallover
bgp cluster-ID x.x.x.x/xxxx
3-4 bgp fast-external-fallover
BGP的fast external fallover特性为默认启用的。当用来建立BGP连接的接口失效的时候,该特性会促使BGP路由器即刻中断bgp对话.如果接口频繁震荡,该特性会引发网络的不稳定,这是因为bgp状态将会在IDLE和established状态之间来回切换,从而导致BGP update和withdraswn消息泛滥。如果路由器的接口频繁震荡的话,可以率使用该命令的no形式,关闭该特性.
说了那么多。我个人的理解就是,bgp fast-external-fallover这个特性是系统默认启动的,当邻居频繁的震荡的时候,可以关闭这个特性,当关闭之后,不管对端的接口邻居是什么状态,本地的bgp邻居始终会师established状态,直到bgp holdtime超时以后邻居才会down掉。
减少网络震荡对于大型或者超大型网络是相当重要的,稍微的失误就会导致路由器的资源耗尽从而产生严重事故.
对于这个特性,首先我们来看结果,然后我验证一下我心中所想的工作原理:
在该拓扑中,R1和R2的配置为:
R1路由器:
R1#sh run | be router bgp
router bgp 100
no synchronization
bgp log-neighbor-changes
network 1.1.1.1 mask 255.255.255.255
neighbor 172.17.1.2 remote-as 200
no auto-summary
R2路由器:
R2#sh run | be router bgp
router bgp 200
no synchronization
bgp log-neighbor-changes
network 2.2.2.2 mask 255.255.255.255
neighbor 172.17.1.1 remote-as 100
no auto-summary
在正常情况下,当两边都建立好了EBGP邻居以后,如果在R1上面shutdown interface f0/0,那么两边的邻居都会从established状态回到IDLE状态。
下面来看一下R1的情况:
现在在R1上面将bgp fast-external-fallover no掉看看情况:
然后再来做同样的实验:
这就是命令bgp fast-external-fallover的功能.
当遇到网络频繁的震荡以后,进行故障排查是需要时间的,那么这个时候希望对于网络造成最小的影响,首先应该把这个命令no掉,然后这样来争取最多的时间找到问题的原因。
不过,这里有一个问题.就是当接口down下去了以后,本端是否会发nitification 给对端,最后造成的结果是本端的邻居不受影响,而对端的邻居却down了呢?
答案显示不是这样的。我已经做了实验进行验证了,打开debug ip bgp events以后,在本端打开no bgp fast-external-fallover以后,当shutdown接口,这个时候本端bgp不会发送任何notification消息给对端,这样也就造成了本端的bgp邻居不会down掉,对端的bgp邻居也不会down掉。
当把本端的接口up起来以后,也不户发送任何update消息给对端。这样两边的邻居就会在老化时间之内持续的up起来,并且由bgp学到的路由也会存在在bgp数据库中,但是接口已经down了,show ip route的时候[B]的路由肯定是不会有的了。因为接口都已经down了。
这个感觉,就好像只要使能no bgp fast-external-fallover以后,在holdtime内,没有任何的update/Notification...让邻居慢慢的老化去吧....
3-2 bgp client-to-client reflection
路由反射器(Route Reflector:
路由反射器让被配置为路由反射器的路由器向其他IBGP对等体传输由IBGP所学到的路由来修改BGP的横向隔离规则,如果没有路由反射器,那么需要在AS内部每一个IBGP邻居形成full-mesh的结构。对于运维成本来说相当不科学.
路由反射器的优点:
配置了BGP路由反射器,就不再需要全互连的IBGP对等体。路由反射器被允许向其它IBGP对等体传输IBGP路由。当内部邻居命令语句数量过多时,I SP就会采用路由反射器技术。路由反射器通过让主要路由器给它们的路由反射器客户复制路由更新来减少AS内BGP邻居关系的数量(这样可以减少TCP连接)。
路由反射器不影响IP数据包所要经过的路径;只有发布路由信息的那条路径受影响。如果路由反射器没有被正确配置,那么将可能产生路由环路。
路由反射器的术语:
路由反射器:是被配置为允许它把通过IBGP所学到的路由通告(或反射)到其他IBGP对等体的路由器。
集群:路由反射器出其它客户的组合;
客户:路由反射器和其他路由有部分IBGP对等关系的这些路由器
非客户:不是路由反射器的客户的其他IBGP的对等体;
在BGP-4配置手册中,第58页,感觉没有说清楚,和同事讨论也不知道书上想说个啥意思,唯一看明白了就是当2个RR配置为互为冗余的时候,cluster-ID需要一致。
================================================================================
在网络上找到了强人的笔记,是这样描述的:
关于BGP originator-id 与 cluster-list id 属性
这两个属性是用于BGP路由反射器RR,防止环路用的。
originator-id是当RR收到客户或是非客户的路由信息放射给他的其它客户时加上originator-id属性,一般是对端的BGP router-id. 当路由器收到是originator-id是自己的话就把路由信息给丢弃来达到防止环路的目的。
originator_id属性只有当RR从客户端学到路由信息向其它客户端反射路由时才会加上,来防止环路。
cluster-list属性有点类似于AS-PATH属性,它在存在路由放射组的时候用。当两台RR互为客户时,当一台RR向另外一台RR放射路由时会加上cluster-list属性,一般是自己的cluster id号来填充。如果RR收到路由信息的cluster-list属性与自己的cluster id一致的话,就把此路由信息丢弃,来达到防止环路的目的。
■双RR做冗余备份案例:
在这里图中,R2和R3为两台相互备份相互冗余的RR--路由反射器.(配置会随后附上)
R4和R2/R3建IBGP邻居.
R5和R2/R3建IBGP邻居.
R2和R1/R4/R3/R5建IBGP邻居,cluster-ID为1.
R3和R1/R4/R2/R5建IBGP邻居,cluster-ID为1.
R1和R2/R3建IBGP邻居。
那么这个时候,可以看到在R2上面,关于100.100.100.0的bgp数据库中只有一条信息:
对于R2来说,按理来说,RR-2-R3应该也有一个100.100.100.的路由要传递过来,但是因为两个RR的cluster ID配置的是一样的,根据bgp的路由反射器的这个原则,收到了相同的cluster ID的路由需要丢掉以免成环。
对于R3来说也是一样,R3上面这个RR,到100.100.100.0的网络,也只有下一跳是2.1.1.1的路由在bgp数据库中。
在R4和R5上面,2条路由都有:
这个就是同AS内双RR互为备份的例子。我们可以看到,在R4上面(R5也一样),最优的路由是下一跳为1.1.1.1(因为这里没有在两个路由反射器上用next-hop-self的命令),实际走的是R2,也就是说在这个实例中,R2作为主用RR,R3作为备用的。
为什么呢?就是前面所提到的bgp的选路原则,已经逼到最后一步了,比两个RR哪个router-ID小,上面是7.1.1.1,下面是5.1.1.1,自然就走5.1.1.1。
各个路由器主要配置如下:(可以参考拓扑图核查配置)-----BGP部分的关键配置,基本IGP和接口配置这里忽略.
R1配置:
router ospf 1
log-adjacency-changes
network 0.0.0.0 255.255.255.255 area 0
!
router bgp 100
no synchronization
bgp log-neighbor-changes
network 100.100.100.0 mask 255.255.255.0
neighbor 1.1.1.2 remote-as 100
neighbor 2.1.1.2 remote-as 100
no auto-summary
R2配置:
router ospf 1
log-adjacency-changes
network 0.0.0.0 255.255.255.255 area 0
!
router bgp 100
no synchronization
bgp cluster-id 1
bgp log-neighbor-changes
neighbor 1.1.1.1 remote-as 100
neighbor 1.1.1.1 route-reflector-client
neighbor 3.1.1.2 remote-as 100
neighbor 4.1.1.2 remote-as 100
neighbor 4.1.1.2 route-reflector-client
neighbor 5.1.1.2 remote-as 100
neighbor 5.1.1.2 route-reflector-client
no auto-summary
R3的配置:
router ospf 1
log-adjacency-changes
network 0.0.0.0 255.255.255.255 area 0
!
router bgp 100
no synchronization
bgp cluster-id 1
bgp log-neighbor-changes
neighbor 2.1.1.1 remote-as 100
neighbor 2.1.1.1 route-reflector-client
neighbor 3.1.1.1 remote-as 100
neighbor 6.1.1.2 remote-as 100
neighbor 6.1.1.2 route-reflector-client
neighbor 7.1.1.2 remote-as 100
neighbor 7.1.1.2 route-reflector-client
no auto-summary
R4的配置:
router ospf 1
log-adjacency-changes
network 0.0.0.0 255.255.255.255 area 0
!
router bgp 100
no synchronization
bgp log-neighbor-changes
neighbor 5.1.1.1 remote-as 100
neighbor 6.1.1.1 remote-as 100
no auto-summary
R5的配置:
router ospf 1
log-adjacency-changes
network 0.0.0.0 255.255.255.255 area 0
!
router bgp 100
no synchronization
bgp log-neighbor-changes
neighbor 4.1.1.1 remote-as 100
neighbor 7.1.1.1 remote-as 100
no auto-summary
上面是说的同一个AS双RR做冗余的情况,下面就是双RR做负载分担的情况:
■当R2与R3的cluster-ID不同的时候
上面我们已经提到过,bgp的原则就是,当本端的路由反射器收到了从对端发送过来的bgp路由携带了相同的cluster-id的时候,那么这条路由会被丢弃掉。
因为怕环路的产生.
上面我们也说过,当R2上面去看bgp数据库的时候就一条 达到100.100.100.100。
如果把R2和R3的cluster-id修改得不一样,实际上每个路由反射器都会把自己认为最优的路由发送给对端。
R2和R3现在设置不同的cluster-id,再到R2上面看看:
在R3上面也有2条路由在BGP数据库中:
对于R2和R3,配置只是修改了cluster ID是不同的而已....
这就是BGP的cluster-ID的特性。拿来做冗余的。一个很实用的备份功能,当clusterID相同的时候,本地收到对端bgp邻居发送过来的路由如果携带了相同的cluster-id,直接丢弃.避免环路。