一、背景介绍
BGP是一种多用于运营商之间的网络协议类型,他与IGP不同的地方(主要指IGP中的ospf协议)在于它是一种距离矢量型的协议,所以路由器之间传递的为路由表,而运行商选择BGP协议的原因在于IGP协议无法容纳公网上数量巨大的路由条目
二、BGP的工作模式
BGP作为一种应用层协议,工作在7层,类似于ospf协议,运行BGP协议的路由器之间需要建立对等体关系。在ospf中,只有直连路由器之间才能建立邻居关系(因为TTL=1),而在BGP协议中,建立对等体关系的路由器不是必须直连(IBGP中TTL=255;虽然EBPG中TTL=1,但可以修改),两个路由可达的路由器之间就可以建立对等体关系,如下图所示,RB与RE之间尽管没有直连,但仍可以建立对等体关系,在IBGP中路由器之间需要建立全网状对等体关系,所以IBGP的对等体数量为n*(n-1)/2
上图中RB与RE要建立对等体,首先就需要相互之间路由可达,这就需要借助IGP(ospf等)协议来实现,从这个角度来看,可以说BGP是建立在IGP之上的协议
三、BGP的分类
BGP按照工作的区域,可以分为IBGP与EBGP两种,在同一个as内运行BGP协议的路由器之间是IBGP协议,不同as之间的路由器采用EBGP协议,as号有65535个,类似于私有ip地址64512~65535这1024个as为私有as号,BGP的as号,相当于BGP的进程号,不同于ospf,每个路由器上只能启动1个BGP进程,即每个路由器只能属于1个as,BGP按照工作的区域又可以分为:
1.IBGP
在同一as内建立BGP对等体的路由器相互之间是IBGP,由于BGP是一种距离矢量行协议(DV),所以防环成为必须要考虑的事情,在IBGP中,采用“水平分割法”来进行防环,即:在同一个as内,路由器B从对等体路由器A处学到的路由,不会再发给本as内其他的IBGP对等体,IBGP通常使用环回口建立对等体关系
2.EBGP
EBPG作用于不同as之间,通过AS_PATH属性防环,当一个路由器发现传递过来的属性中包含自己的AS_PATH编号,则会拒绝接收。从EBGP学习到的路由会自动同步给其他IBGP和EBGP对等体,且被同步的路由器不会更改下一跳地址,对于IBGP对等体,需要手动修改下一跳地址
四、实验拓扑
本次实验的拓扑如下图所示,其中,as2345中跑ospf协议,BGP建立在ospf基础之上,ospf在宣告时,R2的g0/0/0接口与R5的g2/0/0接口不宣告进ospf(因为要做EBGP,对方不会相应ospf的hello报文),R2与R5的lo1接口也不宣告进ospf(留作IBGP起源地址)R2与R5建立IBGP对等体关系
这样整个拓扑结构梳理为以下几点:
- R1、R2之间,R5、R6之间建立EBGP对等体
- R2、R3、R4、R5之间建立ospf邻居
- R2、R5之间建立IBGP对等体
- R3、R4现阶段没有运行BGP协议
为实现以上条件,R1上的配置如下:
[R1]bgp 100
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 12.0.0.2 as-number 2345
[R1-bgp]peer 12.0.0.2 connect-interface g0/0/0
R2上的配置如下:
[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]network 23.0.0.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]network 24.0.0.2 0.0.0.0
[R2]bgp 2345
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 12.0.0.1 as-number 100
[R2-bgp]peer 12.0.0.1 connect-interface g0/0/0
[R2]bgp 2345
[R2-bgp]peer 5.5.5.5 as-number 2345
[R2-bgp]peer 5.5.5.5 connect-interface lo0
R3上的配置如下:
[R3]ospf 1 router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 23.0.0.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]network 35.0.0.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]network 3.3.3.3 0.0.0.0
R4上的配置如下:
[R4]ospf 1 router-id 4.4.4.4
[R4-ospf-1]area 0
[R4-ospf-1-area-0.0.0.0]network 24.0.0.4 0.0.0.0
[R4-ospf-1-area-0.0.0.0]network 45.0.0.4 0.0.0.0
[R4-ospf-1-area-0.0.0.0]network 4.4.4.4 0.0.0.0
R5上的配置如下:
[R5]ospf 1 router-id 5.5.5.5
[R5-ospf-1]area 0
[R5-ospf-1-area-0.0.0.0]network 2.2.2.2 0.0.0.0
[R5-ospf-1-area-0.0.0.0]network 23.0.0.2 0.0.0.0
[R5-ospf-1-area-0.0.0.0]network 24.0.0.2 0.0.0.0
[R5]bgp 2345
[R5-bgp]router-id 5.5.5.5
[R5-bgp]peer 56.0.0.6 as-number 600
[R5-bgp]peer 56.0.0.6 connect-interface g2/0/0
[R5]bgp 2345
[R5-bgp]peer 2.2.2.2 as-number 2345
[R5-bgp]peer 2.2.2.2 connect-interface lo0
R6上的配置如下:
[R6]bgp 600
[R6-bgp]router-id 6.6.6.6
[R6-bgp]peer 56.0.0.5 as-number 2345
[R6-bgp]peer 56.0.0.5 connect-interface g0/0/0
以R2为例,此时能看到R2与R1和R5都已建立了BGP对等体关系
dis bgp peer
BGP local router ID : 2.2.2.2
Local AS number : 2345
Total number of peers : 2 Peers in established state : 2
Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pre
fRcv
5.5.5.5 4 2345 47 49 0 00:45:40 Established
0
12.0.0.1 4 100 63 63 0 01:01:53 Established
0
1.起源IBGP路由
此时R2与R5之间已经建立了对等体,在R2与R5的路由器上面将lo1接口的地址宣告进IBGP,即起源地址。起源的路由必须是本路由器上存在的路由条目,且掩码位数必须与路由条目中保持一致。起源的地址只要存在于本路由器的路由表中即可,可以是非直连,一半情况是在边界路由器上起源本as内全部路由地址
[R2]bgp 2345
[R2-bgp]network 22.22.22.22 32
[R5]bgp 2345
[R5-bgp]network 55.55.55.55 32
以R2为例,此时在R2的BGP路由表中已经能看到通往55.55.55.55/32的路由下一跳是5.5.5.5
dis bgp routing-table
BGP Local router ID is 2.2.2.2
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 2
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 22.22.22.22/32 0.0.0.0 0 0 i
*>i 55.55.55.55/32 5.5.5.5 0 100 0 i
同时,R2路由器会将将最优的BGP路由条目加载到自己的路由表中,R5上也是类似结果,此处不再赘述
display ip routing-table protocol bgp
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : BGP
Destinations : 1 Routes : 1
BGP routing table status :
Destinations : 1 Routes : 1
Destination/Mask Proto Pre Cost Flags NextHop Interface
55.55.55.55/32 IBGP 255 0 RD 5.5.5.5 GigabitEthernet
2/0/0
IBGP 255 0 RD 5.5.5.5 GigabitEthernet
0/0/1
BGP routing table status :
Destinations : 0 Routes : 0
2.IBPG的路由黑洞
做完上述操作后,从R5的路由表中也能看到去往22.22.22.22/32网段的地址
display ip routing-table protocol bgp
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : BGP
Destinations : 1 Routes : 1
BGP routing table status :
Destinations : 1 Routes : 1
Destination/Mask Proto Pre Cost Flags NextHop Interface
22.22.22.22/32 IBGP 255 0 RD 2.2.2.2 GigabitEthernet
0/0/1
IBGP 255 0 RD 2.2.2.2 GigabitEthernet
0/0/0
BGP routing table status :
Destinations : 0 Routes : 0
但此时,你会发现在R2上无法ping通R5,反过来一样
ping -a 22.22.22.22 55.55.55.55
PING 55.55.55.55: 56 data bytes, press CTRL_C to break
Request time out
Request time out
Request time out
Request time out
Request time out
其原因就是尽管R2和R5之间建立了IBGP对等体,但数据包无法直接从R2“飞”到R5
这一点在路由表中能够清楚地看到,在R2路由器表中能看到目的地址是55.55.55.55/32的路由,下一跳为5.5.5.5,而去往5.5.5.5/32段,下一跳是R3或者R4
dis ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
Destinations : 21 Routes : 22
Destination/Mask Proto Pre Cost Flags NextHop Interface
55.55.55.55/32 IBGP 255 0 RD 5.5.5.5 GigabitEthernet
2/0/0
5.5.5.5/32 OSPF 10 2 D 24.0.0.4 GigabitEthernet
2/0/0
OSPF 10 2 D 23.0.0.3 GigabitEthernet
0/0/1
而此时R3或者R4路由器上根本没有22.22.22.22/32的源地址,所以数据包在到达R3或者R4路由器上时,直接被丢弃
dis ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
Destinations : 16 Routes : 17
Destination/Mask Proto Pre Cost Flags NextHop Interface
2.2.2.2/32 OSPF 10 1 D 23.0.0.2 GigabitEthernet
0/0/1
3.3.3.3/32 Direct 0 0 D 127.0.0.1 LoopBack0
4.4.4.4/32 OSPF 10 2 D 35.0.0.5 GigabitEthernet
0/0/0
OSPF 10 2 D 23.0.0.2 GigabitEthernet
0/0/1
5.5.5.5/32 OSPF 10 1 D 35.0.0.5 GigabitEthernet
0/0/0
23.0.0.0/24 Direct 0 0 D 23.0.0.3 GigabitEthernet
0/0/1
23.0.0.3/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/1
23.0.0.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/1
24.0.0.0/24 OSPF 10 2 D 23.0.0.2 GigabitEthernet
0/0/1
35.0.0.0/24 Direct 0 0 D 35.0.0.3 GigabitEthernet
0/0/0
35.0.0.3/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/0
35.0.0.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet
0/0/0
45.0.0.0/24 OSPF 10 2 D 35.0.0.5 GigabitEthernet
0/0/0
127.0.0.0/8 Direct 0 0 D 127.0.0.1 InLoopBack0
127.0.0.1/32 Direct 0 0 D 127.0.0.1 InLoopBack0
127.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
3.同步与建立全网状对等体
上述问题的原因在于,R3与R4在自身没有22.22.22.22/32和55.55.55.55/32路由的情况下,将IBGP学到的路由发送给了其他对等体。为了解决这个问题,早期要求只有路由器通过IGP学到了相同的BGP路由后,才能将BGP路由发送给其他对等体。即路由器通过BGP学习到的所有路由都要保证通过IGP也学习到,否则它不向其他对等体发送通过BGP学习到的路由条目。但前文说过,BGP的路由数量太大,IGP无法承载,所以现在所有路由器上将这个限制默认关闭
[R3-bgp]dis this
ipv4-family unicast
undo synchronization
另外一种解决方法是R3、R4路由也建立对等体关系,又由于IBGP的水平分割机制,所以就能解释为什么IBGP对等体需要全网状建立,根据n*(n-1)/2的原则,本例中共需建立6个IBGP对等体,除去已建立对等体的R2--R5,还需要建立的对等体为:
R2--R3,R2--R4,R5--R3,R5--R4,R3--R4
[R2]bgp 2345
[R2-bgp]peer 3.3.3.3 as-number 2345
[R2-bgp]peer 3.3.3.3 connect-interface lo0
[R2-bgp]peer 4.4.4.4 as-number 2345
[R2-bgp]peer 4.4.4.4 connect-interface lo0
[R3]bgp 2345
[R3-bgp]peer 2.2.2.2 as-number 2345
[R3-bgp]peer 2.2.2.2 connect-interface lo0
[R3-bgp]peer 5.5.5.5 as-number 2345
[R3-bgp]peer 5.5.5.5 connect-interface lo0
[R3-bgp]peer 4.4.4.4 as-number 2345
[R3-bgp]peer 4.4.4.4 connect-interface lo0
[R4]bgp 2345
[R4-bgp]peer 2.2.2.2 as-number 2345
[R4-bgp]peer 2.2.2.2 connect-interface lo0
[R4-bgp]peer 3.3.3.3 as-number 2345
[R4-bgp]peer 3.3.3.3 connect-interface lo0
[R4-bgp]peer 5.5.5.5 as-number 2345
[R4-bgp]peer 5.5.5.5 connect-interface lo0
[R5]bgp 2345
[R5-bgp]peer 3.3.3.3 as-number 2345
[R5-bgp]peer 3.3.3.3 connect-interface lo0
[R5-bgp]peer 4.4.4.4 as-number 2345
[R5-bgp]peer 4.4.4.4 connect-interface lo0
全网状的IBGP对等体建立完成后,R3和R4路由上就能学习到22.22.22.22/32和55.55.55.55/32路由并放入自己的路由表中
display ip routing-table protocol bgp
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : BGP
Destinations : 2 Routes : 2
BGP routing table status :
Destinations : 2 Routes : 2
Destination/Mask Proto Pre Cost Flags NextHop Interface
22.22.22.22/32 IBGP 255 0 RD 2.2.2.2 GigabitEthernet
0/0/1
55.55.55.55/32 IBGP 255 0 RD 5.5.5.5 GigabitEthernet
0/0/0
BGP routing table status :
Destinations : 0 Routes : 0
此时再去R2上带源ping 55.55.55.55,通信正常
ping -a 22.22.22.22 55.55.55.55
PING 55.55.55.55: 56 data bytes, press CTRL_C to break
Reply from 55.55.55.55: bytes=56 Sequence=1 ttl=254 time=70 ms
Reply from 55.55.55.55: bytes=56 Sequence=2 ttl=254 time=40 ms
Reply from 55.55.55.55: bytes=56 Sequence=3 ttl=254 time=30 ms
Reply from 55.55.55.55: bytes=56 Sequence=4 ttl=254 time=30 ms
Reply from 55.55.55.55: bytes=56 Sequence=5 ttl=254 time=30 ms
4.修改IBGP路由器下一跳地址
将R1与R6的lo0接口地址起源
[R1]bgp 100
[R1-bgp]network 1.1.1.1 32
[R6]bgp 600
[R6-bgp]network 6.6.6.6 32
此时,在R3和R4上看到去往R1与R6环回口的下一跳是12.0.0.1和56.0.0.6
display bgp routing-table
BGP Local router ID is 35.0.0.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: 4
Network NextHop MED LocPrf PrefVal Path/Ogn
i 1.1.1.1/32 12.0.0.1 0 100 0 100i
i 6.6.6.6/32 56.0.0.6 0 100 0 600i
*>i 22.22.22.22/32 2.2.2.2 0 100 0 i
*>i 55.55.55.55/32 5.5.5.5 0 100 0 i
由于R3和R4的路由表中并没有这两个网段的路由信息,所以次BGP路由不是最优,不会加载进路由表,R1无法ping通R6。这也印证了EBGP传往IBGP的时候下一跳是自身,不会改变,需要手动在修改R2和R5的下一跳地址
[R2]bgp 2345
[R2-bgp]peer 3.3.3.3 next-hop-local
[R2-bgp]peer 4.4.4.4 next-hop-local
[R2-bgp]peer 5.5.5.5 next-hop-local
[R5]bgp 2345
[R5-bgp]peer 2.2.2.2 next-hop-local
[R5-bgp]peer 3.3.3.3 next-hop-local
[R5-bgp]peer 4.4.4.4 next-hop-local
修改后再到R3上查看BGP路由表,发现欲望1.1.1.1/32与6.6.6.6/32网段下一跳已经改为as内的边界路由器,BGP路由表为最优,已加载进路由表中
[R3]dis bgp routing-table
BGP Local router ID is 35.0.0.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: 4
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 1.1.1.1/32 2.2.2.2 0 100 0 100i
*>i 6.6.6.6/32 5.5.5.5 0 100 0 600i
*>i 22.22.22.22/32 2.2.2.2 0 100 0 i
*>i 55.55.55.55/32 5.5.5.5 0 100 0 i
此时R1就可以ping通R6了
ping -a 1.1.1.1 6.6.6.6
PING 6.6.6.6: 56 data bytes, press CTRL_C to break
Reply from 6.6.6.6: bytes=56 Sequence=1 ttl=252 time=70 ms
Reply from 6.6.6.6: bytes=56 Sequence=2 ttl=252 time=60 ms
Reply from 6.6.6.6: bytes=56 Sequence=3 ttl=252 time=50 ms
Reply from 6.6.6.6: bytes=56 Sequence=4 ttl=252 time=50 ms
Reply from 6.6.6.6: bytes=56 Sequence=5 ttl=252 time=40 ms