一、BGP简介
1、自治系统(Atuonomous System):由同一个技术管理机构管理、使用同一选路策略的一些路由器的集合。自治系统内部的路由协议--IGP。自治系统之间的路由协议--EGP。AS号是2字节(4字节)。两字节范围取值1-65535,其中1-64511为公有,64512-65535为私有。
2、IGP主要有RIP、OSPF、ISIS,着重于发现和计算路由,EGP主要有BGP,着重于控制路由的传播和选择最优的路由。
3、BGP属于边界网关路由协议,是一种增强的距离矢量路由协议
AS内部使用IGP来计算和发现路由,如OSPF,ISIS,RIP等。
AS之间使用BGP来传递和控制路由。
(1)可靠的路由更新机制;
丰富的Metric度量方法;
从设计上避免了环路的发生;
BGP为路由附带属性信息,支持 CIDR,支持丰富的路由过滤和路由策略。
(2)BGP可靠的路由更新:
传输协议:TCP,端口号179(目的端口号 ),无需周期性更新
路由更新:只发送增量路由
周期性发送keepalive报文检测 TCP的连通性
4、BGP报文种类
BGP通过报文的交互完成邻居建立、路由更新等操作,共有Open、Update、Notification、Keepalive和Route-refresh等5种报文类型。
(1)Open:负责和对等体建立邻居关系
(2)KeepAlive:该消息在对等体之间周期性地发送,用以维护连接
(3)update:该消息被用来在BGP对等体之间传递路由信息
(4)Notification:当BGP Speaker检测到错误的时候,就发送该消息给对等体
(5)Route-refresh:用来通知对等体自己支持路由刷新能力
Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP邻居之间的连接关系。BGP邻居在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。确认后,BGP邻居间可以进行Update、Notification、Keepalive和Route-refresh报文的交换。
Update报文:用于在BGP邻居之间交换路由信息。Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
一条Update报文可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update报文里的路由属性适用于该Update报文中的NLRI(Network Layer Reachability Information)字段里的所有目的地(用IP前缀表示)。
一条Update报文可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚地定义了BGP路由器之间先前通告过的路由。
一条Update报文可以只用于撤销路由,这样就不需要包括路径属性或者NLRI。相反,也可以只用于通告可达路由,就不需要携带撤销路由信息了。
Notification报文:当BGP路由器检测到错误状态时,就向邻居发出Notification报文,之后BGP连接会立即中断。
Keepalive报文:BGP路由器会周期性的向邻居发出Keepalive报文,用来保持连接的有效性。
Route-refresh报文:Route-refresh用于在改变路由策略后请求对等体重新发送路由信息。
BGP对等体交互过程
BGP路由器报文交互过程:Idle状态是BGP初始状态。在Idle状态下,BGP路由器拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP路由器才开始尝试与其邻居进行TCP连接,并转至Connect状态。
在Connect状态下,BGP路由器启动连接重传定时器(Connect Retry),等待TCP完成连接。
如果TCP连接成功,那么BGP路由器向邻居发送Open报文,并转至OpenSent状态。
如果TCP连接失败,那么BGP路由器转至Active状态。
如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器继续尝试与其邻居进行TCP连接,停留在Connect状态。
在Active状态下,BGP路由器总是在试图建立TCP连接。
如果TCP连接成功,那么BGP路由器向邻居发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
如果TCP连接失败,那么BGP路由器停留在Active状态。
如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器转至Connect状态。
在OpenSent状态下,BGP路由器等待邻居的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
如果收到的Open报文正确,那么BGP路由器发送Keepalive报文,并转至OpenConfirm状态。
如果发现收到的Open报文有错误,那么BGP路由器发送Notification报文给邻居,并转至Idle状态。
在OpenConfirm状态下,BGP路由器等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
在Established状态下,BGP路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文。
idle状态下每32秒进行TCP连接,进入connect状态,没有TCP连接进入Active状态,连接建立成功进入OpenSent状态,互相收发open报文,进入OpenConfirm状态,互相收发Keepalive报文,进入最后的Established状态。
5、BGP数据库
(1)IP路由表(IP-RIB):全局路由信息库,包括所有IP路由信息(dis ip routing-table)
(2)BGP路由表(Loc-RIB):BGP路由信息库,包括本地BGP Speaker选择的路由信息(dis bgp routing-table)
(3)邻居表:对等体邻居清单列表
(4)Adj-RIB-In:对等体宣告给本地Speaker的未处理的路由信息库
(5)Adj-RIB-Out:本地Speaker宣告给指定对等体的路由信息库
6、基于TCP连接的BGP邻居关系
(1)BGP邻居分为IBGP(自治系统内邻居)和EBGP(自治系统外邻居)。
(2)在建立邻居过程中,使用回环地址需要配置更新源为回环口,否则会导致邻居建立失败。命令如下:
bgp 100
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface loopback 0
对于EBGP,一般使用环回口来建立邻居,环回口使用静态路由来打通。除了需要配置更新源外,还需要配置跳数,因为对于EBGP来说,TTL数值默认为1,当经过一跳后,TTL减为0,所以需要手动配置跳数来避免TTL减到0。(IBGP的TTL数值为255)
bgp 100
peer 3.3.3.3 as-number 200
peer 3.3.3.3 connect-interface loopback 0
peer 3.3.3.3 ebgp-max-hop //配置EBGP多跳,默认为255,后面可以跟数字指定跳数
基本配置:
首先配置AR1-AR5的端口地址和AS 200内的OSPF:
AR1:
int lo0
ip address 1.1.1.1 32
int lo1
ip address 11.1.1.1 24
int g0/0/0
ip address 10.1.12.1 24
AR2:
int lo0
ip address 2.2.2.2 32
int g0/0/0
ip address 10.1.12.2 24
int g0/0/1
ip address 10.1.23.2 24
ospf 100 router-id 2.2.2.2
area 0
network 2.2.2.2 0.0.0.0
network 10.1.23.2 0.0.0.0
AR3:
int lo0
ip address 3.3.3.3 32
int g0/0/0
ip address 10.1.34.3 24
int g0/0/1
ip address 10.1.23.3 24
ospf 100 router-id 3.3.3.3
area 0
network 3.3.3.3 0.0.0.0
network 10.1.23.3 0.0.0.0
network 10.1.34.3 0.0.0.0
AR4:
int lo0
ip address 4.4.4.4 32
int g0/0/0
ip address 10.1.34.4 24
int g0/0/1
ip address 10.1.45.4 24
ospf 100 router-id 4.4.4.4
area 0
network 4.4.4.4 0.0.0.0
network 10.1.34.4 0.0.0.0
AR5:
int lo0
ip address 5.5.5.5 32
int g0/0/1
ip address 10.1.45.5 24
然后,配置AR1、AR2、AR4、AR5的BGP
AR1:
bgp 100 //AS号
router-id 1.1.1.1 //router-id
peer 10.1.12.2 as-number 200 //使用端口地址建立邻居关系
network 1.1.1.1 32 //宣告网络
network 10.1.12.0 255.255.255.0
network 11.1.1.0 24
AR2:
bgp 200
router-id 2.2.2.2
peer 10.1.12.1 as-number 100
dis bgp peer //查看bgp邻居情况
peer 4.4.4.4 as-number 200 //使用AR4的lo0地址建立邻居关系
peer 4.4.4.4 connect-interface lo 0 //手动设置更新源为回环口
network 2.2.2.2 32
network 10.1.12.0 24
network 10.1.23.0 24
AR4:
bgp 200
router-id 4.4.4.4
peer 2.2.2.2 as-number 200
peer 2.2.2.2 connect-interface lo 0
peer 5.5.5.5 as-number 300
peer 5.5.5.5 connect-interface lo 0
peer 5.5.5.5 ebgp-max-hop 2 //手动配置EBGP最大跳数
network 4.4.4.4 32
network 10.1.34.0 24
network 10.1.45.0 24
quit
ip route-static 5.5.5.5 32 10.1.45.5
AR5:
bgp 300
router-id 5.5.5.5
peer 4.4.4.4 as-number 200
peer 4.4.4.4 connect-interface lo 0
peer 4.4.4.4 ebgp-max-hop 2
network 5.5.5.5 32
network 10.1.45.0 24
quit
ip route-static 4.4.4.4 32 10.1.45.4
dis bgp routing-table //查看BGP路由
此时各个邻居正常建立,但路由是不通的,AR5无法PING通AR1:
7、BGP路由通告原则
(1)连接一建立,BGP Speaker将把自己所有BGP路由通告给新对等体;多条路径时,BGP Speaker只选最优的给自己使用;BGP Speaker只把自己使用的最优路由通告给对等体。
(2)BGP Speaker从EBGP获得的路由会向它所有BGP对等体通告(包括EBGP和IBGP)
从EBGP获得的路由,下一跳地址是AS外的地址,其他路由器是没有该条路由的,这样当BGP Speaker将EBGP发给IBGP时,收到的路由会因为下一跳将不可达;为保证IBGP下一跳可达,手动设置改下一跳为本地,也就是传递路由时,将NextHop地址变更为自己建立邻居使用的地址,从而保证其他路由器收到后,该路由NextHop地址一定可达。
保证nexthop一定可达,这条路由就被标记为最优路由,就可以继续通告给其他对等体,非最优路由是不会被通告给其他对等体的。
bgp 100
peer 1.1.1.1 as-number 100
peer 1.1.1.1 next-hop-local
以第6条案例为例,更改前的bgp routint-table
进行如下配置后,NextHop地址变更为2.2.2.2(也就是AR2和AR4建立邻居关系使用的回环口地址)
AR2:
bgp 200
peer 4.4.4.4 next-hop-local
(3)BGP Speaker从IBGP获得的路由不会通告给它的IBGP邻居,从而防止环路,这也叫IBGP的水平分割。
还是以第6条为例,AR5去往AR1的数据包,到达AR3时,因为AR3没有去AR1的路由,就会把数据包丢掉,因此AR5、AR1无法互通。
解决方案:IBGP全互联
IBGP逻辑全互联,会导致AS内部的路由器需要维护更多的IBGP会话,可以使用路由反射器和联盟这两个工具来简化
(4)BGP Speaker从IBGP获得的路由是否通告给 它的EBGP对等体要依靠IGP和BGP同步的情况来决定。华为设备里,默认关闭这个功能,且无法打开。
8、BGP路由的宣告途径
(1)network 命令,使用的正掩码。BGP中network的是路由信息,而不是OSPF中的接口信息。路由表中的路由都可以在BGP中精确的宣告,网络位和掩码要严格匹配,不要求接口下必须有这个地址。
(2)import-route命令,类似于OSPF
bgp 200
import-route ospf
import-route direct