一、BGP概述
1.BGP在企业中的应用
2.AS
- OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。
- AS指的是在同一个组织管理下,使用统一选路策略的设备集合。
- 不同AS通过AS号区分,AS号存在16bit、32bit两种表示方式。IANA负责AS号的分发。
- 当不同AS之间需要进行通信时,在AS之间应使用何种路由协议进行路由的传递?
2.1.使用IGP传递路由
- AS之间需要直连链路,或通过VPN协议构造逻辑直连(例如GRE Tunnel)进行邻居建立。
- AS之间可能是不同的机构、公司,相互之间无法完全信任,使用IGP可能存在暴露AS内部的网络信息的风险。
- 整个网络规模扩大,路由数量进一步增加,路由表规模变大,路由收敛变慢,设备性能消耗加大。
2.2.使用BGP传递路由
- 为此在AS之间专门使用BGP(Border Gateway Protocol ,边界网关协议)协议进行路由传递,相较于传统的IGP协议:
- BGP基于TCP,只要能够建立TCP连接即可建立BGP。
- 只传递路由信息,不会暴露AS内的拓扑信息。
- 触发式更新,而不是进行周期性更新。
3.BGP发展历史
二、BGP的基本概念
- BGP是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议。早期发布的三个版本分别是BGP-1(RFC1105)、BGP-2(RFC1163)和BGP-3(RFC1267),1994年开始使用BGP-4( RFC1771),2006年之后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络(如IPv6等)使用的版本是MP-BGP(RFC4760)。
- BGP的特点:
- BGP使用TCP作为其传输层协议(端口号为179),使用触发式路由更新,而不是周期性路由更新。
- BGP能够承载大批量的路由信息,能够支撑大规模网络。
- BGP提供了丰富的路由策略,能够灵活的进行路由选路,并能指导对等体按策略发布路由。
- BGP能够支撑MPLS/VPN的应用,传递客户VPN路由。
- BGP提供了路由聚合和路由衰减功能用于防止路由振荡,通过这两项功能有效地提高了网络稳定性。
1.BGP特征
1.1.BGP特征(1)
- BGP使用TCP为传输层协议,TCP端口号179。路由器之间的BGP会话基于TCP连接而建立。
- 运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。
- 两个建立BGP会话的路由器互为对等体(Peer),BGP对等体之间交换BGP路由表。
- BGP路由器只发送增量的BGP路由更新,或进行触发式更新(不会周期性更新)。
- BGP能够承载大批量的路由前缀,可在大规模网络中应用。
1.2.BGP特征(2)
!
- BGP通常被称为路径矢量路由协议(Path-Vector Routing Protocol )。
- 每条BGP路由都携带多种路径属性(Pathattribute),BGP可以通过这些路径属性控制路径选择,而不像IS-IS、OSPF只能通过Cost控制路径选择,因此在路径选择上,BGP具有丰富的可操作性,可以在不同场景下选择最合适的路径控制方式。
2.BGP对等体关系
- 与OSPF、IS-IS等协议不同,BGP的会话是基于TCP建立的。建立BGP对等体关系的两台路由器并不要求必须直连。
- BGP存在两种对等体关系类型:EBGP及IBGP:
- EBGP(External BGP):位于不同自治系统的BGP路由器之间的BGP对等体关系。两台路由器之间要建立EBGP对等体关系,必须满足两个条件:
- 两个路由器所属AS不同(即AS号不同)。
- 在配置EBGP时,Peer命令所指定的对等体IP地址要求路由可达,并且TCP连接能够正确建立。
- IBGP(Internal BGP):位于相同自治系统的BGP路由器之间的BGP邻接关系。
- EBGP(External BGP):位于不同自治系统的BGP路由器之间的BGP对等体关系。两台路由器之间要建立EBGP对等体关系,必须满足两个条件:
3.BGP对等体关系建立
3.1.BGP对等体关系建立(1)
- 先启动BGP的一端先发起TCP连接,如左图所示,R1先启动BGP,R1使用随机端口号向R2的179端口发起TCP连接,完成TCP连接的建立。
- 三次握手建立完成之后,R1、R2之间相互发送Open报文,携带参数用于对等体建立,参数协商正常之后双方相互发送Keepalive报文,收到对端发送的Keepalive报文之后对等体建立成功,同时双方定期发送Keepalive报文用于保持连接。
- 其中Open报文中携带:
- ’My Autonomous System :自身AS号
- Hold Time:用于协商后续Keepalive报文发送时间
- BGP Identifier : 自身Router ID
3.2.BGP对等体关系建立(2)
BGP对等体关系建立之后,BGP路由器发送BGP Update(更新)报文通告路由到对等体。
4.TCP连接源地址
- 缺省情况下,BGP使用报文出接口作为TCP连接的本地接口。
- 在部署IBGP对等体关系时,建议使用Loopback地址作为更新源地址。Loopback接口非常稳定,而且可以借助AS内的IGP和冗余拓扑来保证可靠性。
- 在部署EBGP对等体关系时,通常使用直连接口的IP地址作为源地址,如若使用Loopback接口建立EBGP对等体关系,已保存则应注意EBGP多跳问题。
5.BGP报文类型
5.1.BGP报文类型(1)
!
BGP存在5种类型的报文,不同类型的报文拥有相同的头部(header)。
5.2.BGP报文类型(2)
报文名称 | 作用 | 发送时刻 |
---|---|---|
Open | 协商BGP对等体参数,建立对等体关系 | BGP TCP连接建立成功之后 |
Update | 发送BGP路由更新 | BGP对等体关系建立之后有路由需要发送或路由变化时向对等体发送Update报文 |
Notification | 报告错误信息,中止对等体关系 | 当BGP在运行中发现错误时,发送Notification报文将错误通告给BGP对等体 |
Keepalive | 标志对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接 |
Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
6.BGP报文格式
6.1.BGP报文格式-报文头格式
- BGP五种报文都拥有相同的报文头,格式如左侧所示,主要字段解释如下:
- Marker:16Byte,用于标明BGP报文边界,所有bit均为“1”。
- Length:2Byte,BGP报文总长度(包括报文头在内),以Byte为单位。
- Type:1Byte,BGP报文的类型。其取值从1到5,分别表示Open、Update、Notification、Keepalive和Route-refresh 报文。
6.2.BGP报文格式-Open
!
- Open报文是TCP连接建立之后发送的第一个报文,用于建立BGP对等体之间的连接关系,报文格式如左侧所示,主要字段解释如下:
- Version:BGP的版本号。对于BGP4来说,其值为4。
- My AS ( autonomous system):本地AS号。通过比较两端的AS号可以判断对端是否和本端处于相同AS。
- Hold Time:保持时间。在建立对等体关系时两端要协商Hold Time,并保持一致。如果在这个时间内未收到对端发来的Keepalive报文或Update报文,则认为BGP连接中断。
- BGP Identifier:BGP标识符,以IP地址的形式表示,用来识别BGP路由器。
6.3.BGP报文格式-Update
- Update报文用于在对等体之间传递路由信息,可以用于发布、撤销路由。
- 一个Update报文可以通告具有相同路径属性的多条路由,这些路由保存在NLRI(Network Layer Reachable Information网络层可达信息)中。同时Update还可以携带多条不可达路由,用于告知对方撤销路由,这些保存在WithdrawnRoutes字段中。
- 报文格式如左侧所示,主要字段解释如下:
- Withdrawn routes :不可达路由的列表。
- Path attributes :与NLRI相关的所有路径属性列表,每个路径属性由一个TLV(Type-Length-Value)三元组构成。
- NLRI:可达路由的前缀和前缀长度二元组。
6.4.BGP报文格式-Notification
- 当BGP检测到错误状态时(对等体关系建立时、建立之后都可能发生),就会向对等体发送Notification,告知对端错误原因。之后BGP连接将会立即中断。
- Error Code、Error subcode:差错码、差错子码,用于告知对端具体的错误类型。
- Data:用于辅助描述详细的错误内容,长度并不固定。
6.5.BGP报文格式-Keepalive
- BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接。
- Keepalive报文格式中只包含报文头,没有附加其他任何字段。
6.6.BGP报文格式-Route-refresh
- Route-refresh报文用来要求对等体重新发送指定地址族的路由信息,一般为本端修改了相关路由策略之后让对方重新发送Update报文,本端执行新的路由策略重新计算BGP路由。
- 相关字段内容如下:
- AFI :Address Family Identifier,地址族标识,如IPv4。
- Res.:保留,8个bit必须置0。
- SAFI : Subsequent Address Family Identifier,子地址族标识。
7.BGP状态机
7.1.BGP状态机(1)
Peer状态名称 | 用途 |
---|---|
Idle | 开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源 |
Connect | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态,反复尝试连接 |
Active | TCP连接没建立成功,反复尝试TCP连接 |
OpenSent | TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立 |
OpenConfirm | 参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
Established | 已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息 |
7.2.BGP状态机(2)
7.3.BGP状态机详解(1)
7.4.BGP状态机详解(2)
8.协议表项
8.1.BGP对等体表
8.2.BGP路由表
8.2.1.BGP路由表(1)
-
在设备上通过display bgp routing-table查看BGP路由表:
-
Network:路由的目的网络地址以及网络掩码
-
NextHop:下一跳地址
-
-
如果想要查看某条路由更加详细的信息,可以通过display bgp routing-table ipv4-address { mask | mask-length}查看,该命令会将匹配的BGP路由信息详细展示。
8.2.2.BGP路由表 (2)
9.路由生成
- 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。
- BGP注入路由的方式有两种:
- Network
- import-route
- 与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由。
9.1.Network注入路由
9.1.1.Network注入路由(1)
- 通过Network方式注入路由:
- 1.AS200内的BGP路由器已经通过IGP协议OSPF学习到了两条路由:10.1.0.0/24和10.2.0.0/24,在BGP进程内通过network命令注入这两条路由,这两条路由将会出现在本地的BGP路由表中。
9.1.2.Network注入路由(2)
- 通过Network方式注入路由:
- 2.AS200内的BGP路由器通过Update报文将路由传递给AS300内的BGP路由器。
- 3.AS300内的BGP路由器收到路由后,将这两条路由加入到本地的BGP路由表中。
9.2.import-route方式注入路由
- Network方式注入路由虽然是精确注入,但是只能一条条配置逐条注入IP路由表中的路由,如果注入的路由条目很多配置命令将会非常复杂,为此可以使用import-route方式,将:
- 1.直连路由
- 2.静态路由
- 3.OSPF路由
- 4.IS-IS路由
- 等协议的路由注入到BGP路由表中。
9.3.BGP聚合路由
10.通告原则
- BGP通过network、import-route、aggregate聚合方式生成BGP路由后,通过Update报文将BGP路由传递给对等体。
- BGP通告遵循以下原则:
- 只发布最优且有效路由。
- 从EBGP对等体获取的路由,会发布给所有对等体。
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
10.1.BGP路由通告原则
10.1.1BGP路由通告原则一
10.1.2.BGP路由通告原则二
10.1.3.BGP路由通告原则三
10.1.3.1BGP路由通告原则三(1)
- 第三条原则:从IBGP对等体获取的BGP路由,不会再发送给其他IBGP对等体。
- 该条原则也被称为“IBGP水平分割”。
- 如图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:
- R2将一条路由传递给了IBGP对等体R3
- R3收到路由之后传递给IBGP对等体R1
- R1继续传递给IBGP对等体R2路由环路形成。
10.1.3.2.BGP路由通告原则三(2)
- 第三条原则可能会带来新的问题,如左侧所示,当BGP路由器R2将路由传递给BGP路由器R1时,由于第三条原则限制,R1无法将BGP路由传递给R3,R3将无法学习到路由。
- 为解决该问题可以采用AS内IBGP全互联的方式,即:R2、R3之间建立非直连的IBGP对等体关系,以此让BGP路由器R2将路由传递给BGP路由器R3。
10.1.4.BGP路由通告原则四
10.1.4.1BGP路由通告原则四(1)
- 第四条原则:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,该条规则也被称为BGP同步原则。
- 如图所示:
- 1.BGP路由器R4上存在一条路由10.0.4.0/24,R4将其传递给了R2。
- 2.R2将路由传递给非直连IBGP对等体R3。
- 3.R3将路由传递给R5。
- 4.之后R5向10.0.4.4发起访问。
10.1.4.2BGP路由通告原则四(2)
-
R5访问10.0.4.4:
-
1.R5查找路由表,将报文发送给R3。
-
2.R3收到报文后查找路由表,匹配到一条BGP路由,其下一跳为R2,但是R2为非直连下一跳,需要进行路由迭代,通过IGP学习到的路由迭代出下一跳为R1。R3将报文发送给R1。
-
3.R1收到报文后查找路由表,因为R1并非BGP路由器,未与R2建立IBGP对等体关系,因此R1上并无BGP路由
10.0.4.0/24,路由查找失败,R1将报文丢弃。
三、BGP的基本配置
1.配置介绍
1.1.启动BGP进程
[Huawei] bgp { as-number-plain | as-number-dot }
[Huawei-bgp] router-id ipv4-address
启动BGP,指定本地AS编号,并进入BGP视图。使用router-id命令配置BGP的Router ID,建议将BGP Router ID配置为设备Loopback接口的地址。
1.2.配置BGP对等体
[Huawei-bgp] peer { ipv4-address | ipv6-address } as-number { as-number-plain | as-number-dot }
创建BGP对等体,指定对等体地址以及AS号。
1.3.配置建立对等体使用的源地址、EBGP对等体最大跳数
[Huawei-bgp] peer ipv4-address connect-interface interface-type interface-number [ ipv4-source-address ]
[Huawei-bgp] peer ipv4-address ebgp-max-hop[ hop-count ]
指定发送BGP报文的源接口,并可指定发起连接时使用的源地址。
指定建立EBGP连接允许的最大跳数。缺省情况下,EBGP连接允许的最大跳数为1,即只能在物理直连链路上建立EBGP连接。
2.配置案例
2.1.配置案例(1)
- BGP对等体关系、AS号、设备互联地址如图所示。
- 所有设备的Loopback1接口地址为10.0.x.x/32,其中x为设备编号,所有设备都使用Loopback1地址作为Router ID。
- R1、R3之间使用Loopback1地址作为更新源地址建立IBGP对等体关系,R3、R4之间使用互联接口地址作为更新源地址建立EBGP对等体关系。
R1的配置如下:
[R1] bgp 100
[R1-bgp] router-id 10.0.1.1
[R1-bgp] peer 10.0.3.3 as-number 100
[R1-bgp] peer 10.0.3.3 connect-interface LoopBack1
R3的配置如下:
[R3] bgp 100
[R3-bgp] router-id 10.0.3.3
[R3-bgp] peer 10.0.1.1 as-number 100
[R3-bgp] peer 10.0.1.1 connect-interface LoopBack1
[R3-bgp] peer 10.0.34.4 as-number 200
2.2.配置案例(2)
R4的配置如下:
[R4] bgp 200
[R4-bgp] router-id 10.0.4.4
[R4-bgp] peer 10.0.34.3 as-number 100