实验拓扑
实验需求
- R1、R2、R3属于AS123,R4属于AS 400;
- AS123内的R1、R2、R3运行OSPF,通告各自直连接口,注意OSPF域的工作范围;
- R3-R4之间建立eBGP邻居关系,R2暂时不运行BGP,R1-R3之间建立iBGP邻居关系,所有的BGP邻居关系基于直连接口建立;在R4上创建Loopback0接口并将接口IP地址设置为4.4.4.4/32,同时将该条直连路由通告到BGP,要求R1的路由表中能看到4.4.4.4/32;
- 修改BGP配置,使得R1、R3基于Loopback接口建立iBGP邻居关系,R1、R3的Loopback接口地址分别为1.1.1.1/32及3.3.3.3/32;
- 要求R1能够ping通4.4.4.4。
实验步骤及配置
- 所有设备完成接口IP地址的配置(这部分配置不再贴出)
- R1、R2、R3运行OSPF;R1、R3建立IBGP邻居关系,R3、R4建立EBGP邻居关系
R1的配置如下
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 0
[R1-ospf-1-area-0.0.0.0] network 10.1.12.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0] quit
[R1-ospf-1] quit
[R1] bgp 123 #进入BGP进程,AS号为123
[R1-bgp] router-id 1.1.1.1 #配置BGP routerID
[R1-bgp] peer 10.1.23.3 as-number 123 #配置BGP邻居,由于邻居的AS号与本地一致,因此两者之间为iBGP邻居关系
R2的配置如下(R2先不运行BGP)
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 10.1.12.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0] network 10.1.23.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0] quit
[R2-ospf-1] quit
R3的配置如下:
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 0
[R3-ospf-1-area-0.0.0.0] network 10.1.23.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0] quit
[R3-ospf-1] quit
[R3] bgp 123
[R3-bgp] router-id 3.3.3.3
[R3-bgp] peer 10.1.34.4 as-number 400 #配置eBGP邻居R4
[R3-bgp] peer 10.1.12.1 as-number 123 #配置iBGP邻居R1
R4的配置如下:
[R4] interface loopback 0
[R4-loopback0] ip address 4.4.4.4 32
[R4] bgp 400
[R4-bgp] router-id 4.4.4.4
[R4-bgp] peer 10.1.34.3 as-number 123
[R4-bgp] network 4.4.4.4 32 #把本地直连路由network进BGP
[R3] display bgp routing-table
BGP Local router ID is 10.1.23.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 4.4.4.4/32 10.1.34.4 0 0 400 i
我们看到R3已经学习到了R4传递过来的BGP路由4.4.4.4/32。并且该条BGP路由的NextHop属性值为10.1.34.4,这个下一跳是可达的,因此该条路由在R3的BGP表里有标记“* >”,其中“*”号表示这条路由是可用(Valid)的,而“>”则表示这条路由是去往该目的地最优(Best)的路由。再到在R3上查看路由表:
[R3] display ip routing-table protocol bgp
Destination/Mask Proto Pre Cost Flags NextHop Interface
4.4.4.4/32 EBGP 255 0 D 10.1.34.4 GigabitEthernet0/0/1
该条BGP路由由于是best,因此被装载进了路由表。那么,既然在R3上,这条BGP路由是best的,它就会传递给自己的iBGP邻居R1,在R1上查看BGP表。
[R1] display bgp routing-table
Network NextHop MED LocPrf PrefVal Path/Ogn
i 4.4.4.4/32 10.1.34.4 0 100 0 400i
我们看到,R1的BGP表里,已经有4.4.4.4/32的路由,而这条路由NextHop属性值是10.1.34.4,但是R1在本地路由表中没有到达10.1.34.0/24的路由,因此此时BGP路由4.4.4.4/32的下一跳不可达,该BGP条目则不可用(在BGP表中没有“ * ”星号标记),既然不可用,自然就不能装载进路由表中使用。那么怎么解决这个问题呢?一个最简单的方法是,为R1配置一条静态路由,ip route-static 10.1.34.0 24 10.1.23.3,这样一来R1的路由表里就有了到达10.1.34.0/24网段的路由,那么BGP路由4.4.4.4/32的下一跳就可达了,路由自然也就可用了。但是这种方法有点钻空子、取巧。另一种方法是,在R3上OSPF进程中将10.1.34.0/24网段也注入到OSPF,使得R1能够通过OSPF学习到10.1.34.0/24网段的路由,但是由于R3-R4之间的互联链路被视为AS外部链路,因此10.1.34.0/24作为外部网段往往不会被宣告进AS内的IGP。那么还有什么其他办法能解决这个问题?
- 修改下一跳为自身
BGP是AS-by-AS的路由协议,而不是router-by-router的路由协议。在BGP中,next-hop并不意味着是下一台路由器,而是到达下一个AS的IP地址。当一台BGP路由器将路由传递给自己的eBGP邻居时,该路由的NextHop属性值为其BGP更新源地址。如下图,R4将4.4.4.4/24传递给R3时,下一跳为10.1.34.4,也就是R4的GE0/0/0口地址。
当一台BGP路由器将eBGP路由传递给自己的iBGP邻居时,默认情况下这些eBGP路由的NextHop属性值保持不变。因此R3收到R4传递过来的eBGP路由,下一跳属性值为10.1.34.4,那么它将该条路由传递给iBGP邻居R1的时候,路由的下一跳属性值不会发生改变,仍然为10.1.34.4。
这就造成了我们上面所述的问题,R1由于没有到达10.1.34.0/24的路由,因此下一跳地址10.1.34.4不可达,从而导致BGP路由4.4.4.4/32不可用。
有一个方法可以解决这个问题:在R3上使用next-hop-local命令,可修改BGP路由的下一跳属性值为自身。在下图中,我们在R3上增加了peer 10.1.12.1 next-hop-local命令,这样一来当R3再更新eBGP路由给R1的时候,这些路由的下一跳属性值就会被修改为R3自己的更新源地址,而这个地址,R1能够通过OSPF学习到,因此是可达的。
完成配置后,我们在R1上查看BGP表:
[R1]display bgp routing-table
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 4.4.4.4/32 10.1.23.3 0 100 0 400i
R3将EBGP路由4.4.4.4/32传递给R1时,将路由的下一跳属性值改成了自身的IP(10.1.23.3),而这个IP对于R1来说是路由可达的,因此路由优化了,并被装载进了路由表。
- 指定更新源IP
内部网关协议例如RIP、OSPF等,能够自动在接口上发现直连邻居,但是BGP在这点上却大不相同,BGP无法自动发现邻居,必须手工使用peer命令指定邻居。BGP路由器之间交互BGP报文时,报文的目的地址就是peer命令所配置的地址,而源地址默认则是数据包出接口的地址。iBGP邻居在一个AS内部被部署,一般而言,AS内部的网络是具有一定冗余性的,例如下图所示,我们在本实验拓扑的基础上做了一点小小的修改,在AS123中增加了一台路由器:R5。R1、R2、R3、R5运行了OSPF。现在设想一下,如果R1与R3之间的iBGP邻居关系使用物理接口来建,例如R1使用GE0/0/0接口,R3使用GE0/0/0接口的话,则一旦R2发生故障,R1、R3的GE0/0/0接口都会DOWN掉,于此同时R1、R3的BGP邻居也就DOWN掉了。但是仔细观察我们就会发现,其实R1、R3之间的IP连通性其实还是存在的,经过R5的这条冗余路径完全可以在R2发生故障时实现R1、R3之间的数据互通。因此为了保障iBGP邻居关系的稳定性,我们提倡在建立iBGP邻居关系时,使用Loopback来建立,而不是物理接口。
思路很简单,就是在R1及R3上各开设一个Loopback接口并为这个接口配置IP地址,然后在各自的Loopback接口上激活OSPF,使得OSPF域能够获知这两条Loopback路由。接下来R1、R3之间部署iBGP邻居时,使用Loopback地址来建,如此一来,即使R2发生故障,由于R1、R3双方依然可以通过OSPF学习到对端的Loopback路由,所以故障发生时,R1、R3的BGP邻居关系不会DOWN。
回到本实验,在上文的配置中,我们在R1-R3之间建立iBGP邻居关系时,使用的就是物理接口,现在我们将配置做些修改:
在R1及R3上创建loopback0,地址分别为1.1.1.1/32及3.3.3.3/32,然后各自将loopback0宣告进OSPF,使得彼此都能通过OSPF学习到对方的Loopback0路由,再修改BGP的配置,使得R1-R3之间的iBGP邻居关系基于Loopback0来建立。
peer x.x.x.x connect-interface intf [ ipv4-src-address ]
上面这条命令用于指定BGP的更新源地址或接口。
R1增加的配置如下:
[R1] interface loopback0
[R1-LoopBack0] ip address 1.1.1.1 32
[R1-LoopBack0] quit
[R1] ospf 1
[R1-ospf-1] area 0
[R1-ospf-1-area-0.0.0.0] network 1.1.1.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0] quit
[R1-ospf-1] quit
[R1] bgp 123
[R1-bgp] undo peer 10.1.23.3
[R1-bgp] peer 3.3.3.3 as-number 123
[R1-bgp] peer 3.3.3.3 connect-interface LoopBack 0
由于R1、R3现在是使用Loopback接口来建立邻居关系,因此在R1上使用peer命令指定邻居的时候,必须使用R3的Loopback地址作为邻居IP。同时使用connect-interface关键字指定本设备用于和对端建立邻居关系的接口,这个接口的地址将作为更新源。
R3的关键性配置如下:
[R3] interface loopback0
[R3-LoopBack0] ip address 3.3.3.3 32
[R3-LoopBack0] quit
[R3] ospf 1
[R3-ospf-1] area 0
[R3-ospf-1-area-0.0.0.0] network 3.3.3.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0] quit
[R3-ospf-1] quit
[R3] bgp 123
[R3-bgp] undo peer 10.1.12.1
[R3-bgp] peer 1.1.1.1 as-number 123
[R3-bgp] peer 1.1.1.1 connect-interface LoopBack 0
[R3-bgp] peer 1.1.1.1 next-hop-local
完成上述配置后,R1与R3即会基于Loopback0接口建立邻居关系。
- 完成这个实验
经过前面的讲解,我们的环境现在是这样的:R1-R3之间建立基于Loopback的iBGP邻居关系;R3对R1配置了next-hop-local;R3与R4之间仍然是建立基于直连的eBGP邻居关系;R4在BGP中network本地的4.4.4.4/32路由。
现在R1是能够学习到BGP路由4.4.4.4/32的,并且该路由在BGP表中也是优化的,这条路由就会被装载进R1的路由表。那么是不是意味着R1就能够ping通4.4.4.4了呢?经过测试你可能会发现,R1虽然有了4.4.4.4/32网段的路由,但是无法ping通,为什么?因为数据包在R2这里就被丢弃了,还记得么,R2并没有运行BGP,因此它无法学习到BGP路由4.4.4.4/32,现在问题来了,怎么让R1 ping通R4呢?方法之一是在R3上将BGP路由重发布进OSPF,使得R2能够通过OSPF学习到BGP路由,但是这种方法存在一定的风险,因为我们知道BGP承载的前缀数量往往是非常庞大的;另一种方法是,让R2也运行BGP,并与R3建立iBGP邻居关系,这样一来问题就解决了。那么BGP邻居关系就变成了这样:
R3增加如下配置:
[R3] bgp 123
[R3-bgp] peer 2.2.2.2 as-number 123
[R3-bgp] peer 2.2.2.2 connect-interface LoopBack 0
R2增加如下配置:
[R2] interface loopback0
[R2-LoopBack0] ip address 2.2.2.2 32
[R2-LoopBack0] quit
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 2.2.2.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0] quit
[R2-ospf-1] quit
[R2] bgp 123
[R2-bgp] peer 3.3.3.3 as-number 123
[R2-bgp] peer 3.3.3.3 connect-interface LoopBack 0
完成上述配置后,R1、R2和R3就都学习到了4.4.4.4/32的BGP路由。最后要实现R1能够ping通4.4.4.4,则要求R4的路由表中也有10.1.12.0/24的路由,以保证数据包的回程。因此在R1上增加如下配置:
[R1] bgp 123
[R1-bgp] network 10.1.12.0 24
也就是将10.1.12.0/24这条路由注入到BGP,如此一来R4就能通过BGP学习到这条哦路由,那么当R1去ping 4.4.4.4时,报文能够顺利到达4.4.4.4,并且回程的报文能顺利地回来。
- 学会看三张表
查看BGP邻居表:
查看BGP表:
查看BGP路由条目的详细信息: