iBGP之间只可以发送自身产生的前缀信息,不可以转发接受自其他iBGP对等体的前缀信息,这是BGP的防环机制。
解决IBGP间路由发送的限制一般有三种方法:
1. 建立full-mesh的对等体连接
2. 建立联盟
3. 建立RR(路由反射器)
在RR中引入了originator-id和cluster-id这两个属性来防止环路。
Originator是指产生首发该路由的路由器的RID,cluster-id可以手工配置,也可以有系统默认生成(RR的RID)。
系统为RR默认配置的cluster-id就是RR的RID。这样,当一个系统中有多个RR时,他们是同簇的。不同簇的RR会以一般的RR与非客户端对等体的反射原则来传递路由信息。
那么,如果同一级别的RR拥有相同的cluster-id,那么,他们之间就不会反射路由信息了!
下面的试验讨论的是同一个AS中,有多个同级RR时,路由传递的一些特性。
拓扑如下:
R1,R2,R3,R4在同一个AS中,其中R1和R2作为RR,R3,R4作为客户端对等体被两个RR共同拥有,R3与R4之间没有建立对等体。
基本配置:
R1#sh ip int b
Interface IP-Address OK? Method Status Protocol
FastEthernet0/0 unassigned YES manual up up
FastEthernet0/0.12 12.1.1.1 YES manual up up
FastEthernet0/0.13 13.1.1.1 YES manual up up
FastEthernet0/0.14 14.1.1.1 YES manual up up
Loopback0 10.1.1.1 YES manual up up
。。。。(omit)
R1#sh run | b router
router bgp 1
no synchronization
bgp router-id 1.1.1.1
bgp log-neighbor-changes
network 10.1.1.0 mask 255.255.255.0
neighbor 12.1.1.2 remote-as 1
neighbor 13.1.1.3 remote-as 1
neighbor 13.1.1.3 route-reflector-client
neighbor 14.1.1.4 remote-as 1
neighbor 14.1.1.4 route-reflector-client
no auto-summary
R2#sh ip int b
Interface IP-Address OK? Method Status Protocol
FastEthernet0/0 unassigned YES manual up up
FastEthernet0/0.12 12.1.1.2 YES manual up up
FastEthernet0/0.23 23.1.1.2 YES manual up up
FastEthernet0/0.24 24.1.1.2 YES manual up up
Loopback0 20.1.1.1 YES manual up up
……(omit)
R2#sh run | b router
router bgp 1
no synchronization
bgp router-id 2.2.2.2
bgp log-neighbor-changes
network 20.1.1.0 mask 255.255.255.0
neighbor 12.1.1.1 remote-as 1
neighbor 23.1.1.3 remote-as 1
neighbor 23.1.1.3 route-reflector-client
neighbor 24.1.1.4 remote-as 1
neighbor 24.1.1.4 route-reflector-client
no auto-summary
R3#sh ip int b
Interface IP-Address OK? Method Status Protocol
FastEthernet0/0 unassigned YES manual up up
FastEthernet0/0.13 13.1.1.3 YES manual up up
FastEthernet0/0.23 23.1.1.3 YES manual up up
Loopback0 30.1.1.1 YES manual up up
…..(omit)
R3#sh run | b router
router bgp 1
no synchronization
bgp router-id 3.3.3.3
bgp log-neighbor-changes
network 30.1.1.0 mask 255.255.255.0
neighbor 13.1.1.1 remote-as 1
neighbor 23.1.1.2 remote-as 1
no auto-summary
R4配置与R3基本一致,略。
看看R1向R2反射了那些路由
R1#sh ip b nei 12.1.1.2 advertised-routes
BGP table version is 9, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 10.1.1.0/24 0.0.0.0 0 32768 i
*>i30.1.1.0/24 13.1.1.3 0 100 0 i
*>i40.1.1.0/24 14.1.1.4 0 100 0 i
切到R2上,选取一条路由来研究,比如选了30.1.1.0/24这条路由
R2#sh ip b 30.1.1.0
BGP routing table entry for 30.1.1.0/24, version 8
Paths: (2 available, best #1, table Default-IP-Routing-Table) #选取1号来源为最佳路由
Advertised to non peer-group peers:
12.1.1.1 24.1.1.4 #R2将这条前缀反射给了非对等体组成员R1和R4
Local, (Received from a RR-client)
23.1.1.3 from 23.1.1.3 (3.3.3.3)
Origin IGP, metric 0, localpref 100, valid, internal, best
Local
13.1.1.3 (inaccessible) from 12.1.1.1 (1.1.1.1)
Origin IGP, metric 0, localpref 100, valid, internal
Originator: 3.3.3.3, Cluster list: 1.1.1.1 #两个RR防环属性属性
R2收到两条关于30.1.1.0/24的更新,一条是来自于R3的,一条是来自于R1的。
下面我们在R2上打开debug,然后在R1上软重启,看看路由更新的发送情况。
R2#deb ip b up
BGP updates debugging is on
R2#
*Mar 1 00:25:08.195: BGP(0): 12.1.1.1 rcvd UPDATE w/ attr: nexthop 12.1.1.1, origin i, localpref 100, metric 0
*Mar 1 00:25:08.195: BGP(0): 12.1.1.1 rcvd 10.1.1.0/24...duplicate ignored
*Mar 1 00:25:08.199: BGP(0): 12.1.1.1 rcvd UPDATE w/ attr: nexthop 14.1.1.4, origin i, localpref 100, metric 0, originator 4.4.4.4, clusterlist 1.1.1.1
*Mar 1 00:25:08.199: BGP(0): 12.1.1.1 rcvd 40.1.1.0/24...duplicate ignored
*Mar 1 00:25:08.199: BGP(0): 12.1.1.1 rcvd UPDATE w/ attr: nexthop 13.1.1.3, origin i, localpref 100, metric 0, originator 3.3.3.3, clusterlist 1.1.1.1
*Mar 1 00:25:08.199: BGP(0): 12.1.1.1 rcvd 30.1.1.0/24...duplicate ignored
如上所示,发送了三条更新。
接下来在R1和R2上手动配置相同的cluster-id(前面说过了,默认情况下的cluster-id就是RR的RID)
R1(config)#router b 1
R1(config-router)#bgp clus
R1(config-router)#bgp cluster-id 12.1.1.1
R2(config)#router b 1
R2(config-router)#b clus
R2(config-router)#b cluster-id 12.1.1.1
再来看看R1向R2发送了哪些更新
R1#sh ip b nei 12.1.1.2 ad
BGP table version is 9, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 10.1.1.0/24 0.0.0.0 0 32768 i
*>i30.1.1.0/24 13.1.1.3 0 100 0 i
*>i40.1.1.0/24 14.1.1.4 0 100 0 i
跟以前一样!
是不是上面的命令不起作用呢?
再来看看R2的路由表
R2#sh ip b
BGP table version is 9, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*>i10.1.1.0/24 12.1.1.1 0 100 0 i
*> 20.1.1.0/24 0.0.0.0 0 32768 i
*>i30.1.1.0/24 23.1.1.3 0 100 0 i
*>i40.1.1.0/24 24.1.1.4 0 100 0 i
如上所示,并没有R1向它发送更新。这时还是要通过debug来看看
R2#deb ip bgp up
BGP updates debugging is on
R2#
*Mar 1 00:35:02.671: BGP(0): 12.1.1.1 rcvd UPDATE w/ attr: nexthop 12.1.1.1, origin i, localpref 100, metric 0
*Mar 1 00:35:02.671: BGP(0): 12.1.1.1 rcvd 10.1.1.0/24...duplicate ignored
*Mar 1 00:35:02.675: BGP: 12.1.1.1 RR in same cluster. Reflected update dropped
*Mar 1 00:35:02.675: BGP(0): 12.1.1.1 rcv UPDATE w/ attr: nexthop 14.1.1.4, origin i, localpref 100, metric 0, originator 4.4.4.4, clusterlist 12.1.1.1, path , community , extended community
*Mar 1 00:35:02.675: BGP(0): 12.1.1.1 rcv UPDATE about 40.1.1.0/24 -- DENIED due to: reflected from the same cluster;
*Mar 1 00:35:02.675: BGP: 12.1.1.1 RR in same cluster. Reflected update dropped
R2#
*Mar 1 00:35:02.675: BGP(0): 12.1.1.1 rcv UPDATE w/ attr: nexthop 13.1.1.3, origin i, localpref 100, metric 0, originator 3.3.3.3, clusterlist 12.1.1.1, path , community , extended community
*Mar 1 00:35:02.675: BGP(0): 12.1.1.1 rcv UPDATE about 30.1.1.0/24 -- DENIED due to: reflected from the same cluster;
R2#
这样就明白了吧!
可能会有这样的疑问,10.1.1.0/24这个网段上面显示的也被拒绝了,为什么路由表里面还有?
这是因为如果一个路由条目是RR自身发起的话,那么他不会在这个条目上创建cluster-id。而且,RR从外部对等体学习到的路由信息,在反射给自己的客户端或者为非客户端时,也不会为这前缀创建cluster-id。
我们可以切到R3上来看看10.1.1.0/24这个信息被两个RR反射给R3时有携带的属性什么不同。
R3#sh ip b 10.1.1.0
BGP routing table entry for 10.1.1.0/24, version 7
Paths: (2 available, best #2, table Default-IP-Routing-Table)
Not advertised to any peer
Local
12.1.1.1 (inaccessible) from 23.1.1.2 (2.2.2.2)
Origin IGP, metric 0, localpref 100, valid, internal
Originator: 1.1.1.1, Cluster list: 12.1.1.1
Local
13.1.1.1 from 13.1.1.1 (1.1.1.1)
Origin IGP, metric 0, localpref 100, valid, internal, best
第一个是从R2发过去的,下面的一个是从R1发过去的。很明显,从R1发送过去的没有携带originator和cluster-id这两个属性。