一、 什么是BGP?
BGP不同于之前介绍的动态路由协议,BGP是在自治系统之间进行路由学习及选路的协议,如果把一个城市比作一个自治系统,那么像RIP、OSPF等协议就相当于该城市的公交车或者地铁,而BGP则是火车,运行在城市之间。
1、 自治系统
自治系统(Autonomous System AS)是由同一个技术管理机构管理,使用统一选路策略,(运行同一动态路由协议)的一组路由器的集合,自治系统的编号取值范围为1~65535.其中1~64511是互联网上注册的公有AS号类,类似之前课程中讲过的公有IP地址,是全球唯一的且不可重复使用;64512~65535是私有AS号,类似之前博文讨论过的私有IP地址,可以重复使用但是互联网上不可见。
2、 动态路由的分类 动态路由协议有多种分类方法,其中按自治系统分类,按协议类型分类为较常用的两种。
1) 按自治系统分类
- IGP:即自治系统内部的路由协议,主要包含RIPv1/v2、OSPF、ISIS、EIGRP(思科私有协议)。IGP是运行在AS内部的路由协议,它解决AS内部的选路问题。其重要作用是发现、计算路由。
- EGP:即自治系统之间的路由协议,通常指BGP。EGP是运行在AS与AS之间的路由协议,它解决的是AS之间的选路问题。BGP的主要作用是控制路由的传播和选择最优路由。 通常情况下,会先使用IGP协议在自治系统内部计算和发现路由条目,再通过BGP协议将IGP协议产生的路由传递至其他的自治系统。
2) 按协议类型分类
- 距离矢量路由协议:RIPv1/v2、BGP(路径矢量协议)、EIGRP(高级的距离矢量协议)。
- 链路状态路由协议:OSPF、ISIS。
3、 BGP的概念
BGP是一种运行在AS与AS之间的动态路由协议,主要作用是在AS之间自动交换无环路由信息,以此来构建AS的拓扑图,从而消除路由环路并实施用户配置的路由策略。目前公网路由条目众多,IGP协议无法承载,但是对于BGP来说却能够轻松应对。而且BGP相比IGP具有更多的属性特征,更加便于在大规模的网络中使用各种路由策略,所以BGP协议经常用于ISP与ISP之间或跨地域总、分公司之间的路由信息交互。
BGP解决的是自治系统之间的路由学习问题。当今互联网是全球互联,在中国,互联网运营商有电信和联通。每个公司都有自己的自治系统,并且内部运行IGP协议。但是互联网又要求互联,所以通过BGP就可以在电信和联通之间学习路由,使电信的用户可以和联通的用户之间进行QQ聊天、发送E-mail等等,如下图:
4、 BGP的特征
BGP具有以下几个特性: 1) 传输协议:TCP,端口号179; 2) BGP是外部路由协议,用来在AS之间传递路由信息; 3) 是一种增强的路径矢量路由协议; 4) 拥有可靠的路由更新机制; 5) 具备丰富的Metric度量方法; 6) 无环路协议设计; 7) 为路由条目附带多种属性信息; 8) 支持CIDR(无类别域间选路); 9) 丰富的路由过滤和路由策略; 10) 无须周期性更新; 11) 路由更新时只发送增量路由; 12) 周期性发送KeepAlive报文,以保持TCP连通性;
二、 BGP的工作原理
1、 BGP邻居关系 运行BGP的路由器通常被称为BGPSpeaker(发言者),相互之间传递报文的Speaker之间互称为对等体(peer)。BGP邻居关系的建立,更新和删除是通过对等体之间交互5种报文、6种状态机和5个表等信息来完成的,最终形成BGP邻居。
1) BGP报文 BGP报文头中的Type定义了BGP的报文类型,BGP对等体之间通过5种报文进行路由信息的交互。这5种报文类型分别是Open、Update、Notification、KeepAlive和Route-Refresh。
- Open报文 Open报文是TCP连接建立后发送的第一个报文,用于建立BGP对等体之间的连接关系,主要包括BGP版本,本地AS编号,Holdtime等信息。对等体在接收到对端发送过来的Open报文并协商成功后,将发送KeepAlive和Route-Refresh报文的交换,以更新路由信息。如下图:
关键字段如下:
-
Version:标识当前使用的BGP版本,默认情况下值为4,标识BGP-4。
-
My Autonomous System:用于标识本地的AS编号,通过比较本地和对端的AS编号是否一致来确定是EBGP邻居还是IBGP邻居。
-
BGP Identifier:用于标识BGP路由器的Router ID,作用是标识当前的设备名称。
-
Update报文 Update报文用来在BGP对等体之间更新路由信息,如下图,Update报文可以通告多条属性相同的可达路由信息,也可撤销多条不可达路由信息。 网络可达性信息(Network Layer Reachability Information NLRI):通过此字段发布多条具有相同路由属性的可达路由,这些路由信息可共享同一组路由属性。此字段由可达的目的IP地址前缀和掩码构成。 撤销多条不可达路由(Withdrawn Routes):通告该字段发布已经失效或者不可达的路由信息。此字段由不可达的目的IP地址前缀和掩码构成。 Update报文可以只用于撤销路由,在仅用于撤销路由时,不需要包括路径属性或者NLRI。统一,也可以只用于通告可达路由,此时则不需要携带撤销路由信息。
-
Notification报文 Notification报文的作用时当BGP检测到错误状态时,立刻向对等体发出Notification报文,如下图,之后BGP连接会立即中断。需要注意的是,不管当前BGP状态当时处于何种状态,只要收到Notification报文就会返回idle状态。换而言之,BGP是不允许错误出现的一种路由协议,在选路原则中,更优的路径往往是邻居关系最久的对等体,以此反映对等体两端经历很长的时间都没有出现过错误,而之前学过的其他路由协议则是越新越好。 其中关键字段如下:
-
Error Code:差错码,用于指定错误类型;
-
Error subcode:差错子码,用于描述错误的详细信息;
-
Data:错误消息的内容,用于辅助发现错误的原因。
-
Route-Refresh
用来告知对等体本地所支持路由的刷新能力,如下图,在所有BGP路由器拥有Route-Refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发送Route-Refresh报文,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。该报文中的AFI字段,用于标识所采用的地址族的类型。如IPv4单播或者IPv4组播。 其中关键字段如下:
-
AFI:Address Family Identifier地址族标识。
-
Res:保留,占1字节。
-
SAFI:(Subsequent Address Family Identifier):子地址族标识,用于标识子地址族的类型。
-
KeepAlive 该报文在对等体之间周期性地发送,用以保持连接的有效性并维护其连接,如下图,KeepAlive报文只有一个BGP报文头。默认KeepAlive报文发送周期为60s,Holdtime为180s.KeepAlive报文类似于OSPF协议中的Hello报文,当收到对等体发过来的KeepAlive报文后会刷新Holdtime计时器,如果Holdtime计时器超时仍未收到KeepAlive报文,则认为对等体失效。
2) BGP状态机
BGP状态机描述的是BGP邻居的建立过程,通过对这些不同状态学习,可以更加深入地了解BGP的工作原理,以及排查思路。BGP状态机共有六种状态,分别是Idle、Connect、Active、OpenSent、OpenConfirm和Established。
接下来聊一下BGP状态机的六种状态机及BGP建立过程。如下图所示:
-
Idle状态 Idle状态下,BGP拒绝任何进入的连接请求,Idle状态是BGP的初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件(如运行BGP协议)后,BGP才开始尝试和其他BGP对等体进行TCP连接,并转至Connect状态。任何状态中收到Notification报文或者TCP拆链通知等Error事件后,BGP都会转至Idle状态。
-
Connect状态 Connect状态下,BGP等待TCP连接的建立完成后再决定后续操作。在Connect状态下,BGP启动连接重传定时器(Connect Retry,通常计数器为30s),等待TCP完成连接。如果TCP连接成功,那么BGP向对等体发送open报文,并转至opensent状态;如果TCP连接失败,那么BGP继续尝试和其他BGP对等体进行TCP连接,停留在Connect状态。
-
Active状态 Active状态下,BGP将尝试进行TCP连接的建立,是BGP的中间状态。在Active状态下,BGP总是在视图建立TCP连接。如果TCP连接成功,那么BGP停留在Active状态,如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
-
OpenSent状态 在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、Holdtime等进行检查。如果收到到Open报文正确,那么BGP发送KeepAlive报文,并转至OpenConfirm状态,如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
-
OpenConfirm状态 在OpenConfirm状态下,BGP等待KeepAlive或Notification报文。如果收到KeepAlive报文,则转至Established状态;如果收到Notification报文,则转至Idle状态。
-
Established状态 在Established状态下,BGP可以在对等体之间交换Update、KeepAlive、Route-refresh报文和Notification报文。如果收到正确的Update或KeepAlive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接;如果收到错误的Update或者KeepAlive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。 在BGP对等体建立的过程中,通常可见的三种状态是Idle、Active、Established。BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。
3)BGP数据库
BGP数据库是BGP正常工作所需要的存储空间,基于保存的内容不同,可分为如下几种:
1.IP路由表(IP-RIB) 全局路由信息库,包括所有最优的IP路由信息。
2.BGP路由表(Loc-RIB) BGP路由信息库,包括本地BGP Speaker通告的路由信息,将其中最优路由添加到IP路由表中。 注意:先要关注BGP路由表,若BGP路由表中不是最优路由,则无法在IP路由表中可见。
3.邻居表 对等体邻居清单列表,包括对等体两端的邻居信息及邻居列表。
4.Adi-RIB-In 对等体宣告给本地Speaker的未处理的路由信息库。
5.Adj-RIB-Out 本地Speaker宣告给指定对等体的路由信息库。
4) BGP邻居关系类型
在BGP中大致可分为两种邻居关系:IBGP邻居和EBGP邻居。
- IBGP:同一个AS内部的BGP邻居关系,IBGP邻居通常是指运行BGP协议的对等体两端均在同一个AS域内,属于同一个BGP AS内部。
- EBGP:AS之间的BGP邻居关系,EBGP邻居通常是指运行BGP协议的对等体两端分别在不同的AS内。
IBGP邻居和EBGP邻居如下图:
可通过以下命令建立IBGP邻居和EBGP邻居,中AS-number后面根邻居所在的AS号,邻居的AS号和本端的AS号和相同就为IBGP邻居,不同就为EBGP邻居。
R2配置如下:
[R2]bgp 200 #进入BGP视图,其中本端AS号为200
[R2-bgp]router-id 2.2.2.2 #配置BGP的router-id
[R2-bgp]peer 12.1.1.1 as-number 100 #和12.1.1.1建立EBGP邻居关系
[R2-bgp]peer 34.1.1.4 as-number 200 #和34.1.1.4建立IBGP邻居关系
上面配置为R2设备通告有两个对等体邻居,R1:12.1.1.1为EBGP邻居,R4:34.1.1.4为IBGP邻居
R5配置如下:
[R5]bgp 300 #进入bgp视图,其中本端AS号为200
[R5-BGP]router-id 5.5.5.5 #配置bgp的router-id
[R5-bgp]peer 45.1.1.4 as-number 200 #和45.1.1.4建立EBGP邻居关系
[R5]display bgp peer #查看bgp邻居
2、通告BGP路由的方法
BGP路由是通过BGP命令通告而成的,而通告BGP路由的方法有两种:network和Import。
1) Network方式 使用network命令可以将当前设备路由表中的路由(非BGP)发布到BGP路由表中并通告给邻居。需要特别注意的是,network的对象是路由条目。
2) Import方式 使用Import命令可以将所学习到的路由信息重分发到BGP路由表中,是BGP宣告路由的一种方式,可以引入BGP的路由包括直连路由,静态路由及动态路由协议学习的路由。和network方式的区别是,import的对象是某种动态路由协议,而不是路由条目。
三、BGP的配置
1、配置BGP对等体的交互原则 1)从IBGP对等体获得的BGP路由,BGP设备只传递给它的EBGP对等体。 2)从EBGP对等体获得的BGP路由,BGP设备传递给它的所有EBGP和IBGP对等体(对等体是IBGP只能传递一跳,对等体是EBGP则不限制)。 3)当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。 4)路由更新时,BGP设备只发送更新的BGP路由。 5)所有对等体发送的路由,BGP设备都会接收。 6)所有EBGP对等体在传递过程中下一跳改变。 7)所有IBGP对等体在传递过程中下一跳不变。 8)默认EBGP传递时,TTL值为1。 9)默认IBGP传递时,TTL值为255。
EBGP多跳
由于默认BGP中EBGP邻居之间的TTL值为1,若EBGP对等体非直连,在传递时,TTL跳数限制会使非直连的EBGP对等体无法正常建立邻居关系,所以需要用EBGP多跳的命令来解决非直连的邻居关系。如下图:
[R3]bgp 200 #进入bgp视图,其中本端AS号为200
[R3-bgp]router-id 3.3.3.3 #配置bgp的router-id
[R3-bgp]peer 12.0.0.1 as-number 100 #和12.0.0.1建立邻居关系
[R3-bgp]peer 12.0.0.1 ebgp-max-hop 2 #R3到达12.0.0.1建立邻居关系需要经过2个路由
2、更新源建立邻居关系
避免因为接口不稳定或DOWN而导致的BGP状态改变,通常会在同一个AS内使用冗余链路来确保BGP的稳定性,这样即使某一链路故障,也不影响BGP的邻居关系,所以经常会使用loop back接口IP地址来和对端建立BGP邻居。因为环回接口几乎永远UP,所以只要至少有一条链路可达,BGP的邻居关系就不会因为链路而发生改变,这种使用环回接口建立BGP邻居的方法称为更新源建邻居。如下图:
R1配置如下:
[R1]bgp 100 #进入bgp视图,其中本端AS号为100
[R1-bgp]router-id 1.1.1.1 #配置bgp的router-id
[R1-bgp]peer 3.3.3.3 as-number 100 #和3.3.3.3建立邻居关系
[R1-bgp]peer 3.3.3.3 connect-interface loopback 0
#通过本地的lop0接口和3.3.3.3建立邻居关系
R3配置如下:
[R3]bgp 100 #进入bgp视图,其中本端AS号为100
[R3-bgp]router-id 3.3.3.3 #配置bgp的router-id
[R3-bgp]peer 1.1.1.1 as-number 100 #和1.1.1.1建立邻居关系
[R3-bgp]peer 1.1.1.1 connect-interface loopback 0
#通过本地的lop0接口和1.1.1.1建立邻居关系
需要注意,本地Loopback接口先要让对等体可达,需要手动添加对等体环回接口的路由条目,或者IGP自动学习对方环回接口路由。
3、保证IBGP下一跳可达
在AS边缘的BGP设备,会接收到它的EBGP对等体邻居传递过来的BGP路由信息。刚已讨论过,EBGP邻居接收到的BGP路由信息中下一跳改变,而在同一个AS内通过IBGP邻居接收过来的BGP路由信息中的下一跳不会改变。
假如R1通告一条路由,经过EBGP邻居传播到AS200后,R2看到的路由下一跳为12.0.0.1,继续经过EBGP传播到R3之后,R3看到的路由下一跳为23.0.0.2。R3传播给IBGP邻居R4后,R4看到的路由下一跳依然为23.0.0.2,因为通过IBGP邻居接收的BGP路由下一跳不变,又因为R4没有下一跳地址23.0.0.2的路由,所以由R1传播过来的路由信息无效,不能传播给其他BGP邻居,更不能放入路由表。 解决办法是在R3上宣称下一跳为R3自己,那么R4看到的下一跳就变成34.1.1.3,而34.1.1.3可以通过IGP学习到(图中是直连),从而解决了路由无效的问题,在R3上执行如下命令实现:(命令解释请参照以上注释,就不再一一注释了)
[R3]bgp 300
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 23.0.0.2 as-number 200
[R3-bgp]peer 34.1.1.4 as-number 300
[R3-bgp]peer 34.1.1.4 next-hop-local
#向邻居传递路由时,宣告所以传递给邻居的路由条目下一跳都是自己
4、BGP的属性
1)BGP属性分类
BGP的属性分为公有比遵、公认任意、可选过渡、可选非过渡四大类。
-
公有必遵:所有BGP路由器都可以识别,且必须存在update报文中。
-
公有任意:所有BGP路由器都可以识别,但不要求必须存在于update报文中,可以根据具体情况来决定是否添加到Update报文中。
-
可选过渡:BGP路由器可以选择是否在Update报文中携带这种属性。接收的路由器如果不识别这种属性,可以转发给邻居路由器(这就是过渡的含义),邻居路由器可能会识别并使用这种属性。
-
可选非过渡:BGP路由器可以选择是否在Update报文中携带这种属性。在整个路由发布的路径上,如果部分路由器不能识别这种属性,可能会导致该属性无法发挥作用。因为接收的路由器如果不识别这种属性,将丢弃这种属性,而不再转发给邻居路由器。
2)BGP属性的介绍
BGP的常用属性由Origin、AS-PATH、Next-Hop、Local-Pref和MED等。
- Origin(起源)属性:属于公有必遵,用来定义路径信息的来源,其作用是标记一条路由是怎么成为BGP路由的。它有以下三种类型:
- IGP(I):优先级最高,通过Network命令注入BGP路由表的路由,其Origin属性为IGP。
- EGP(e):优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。
- Incomplete(?):优先级最低。通过其他方式学习到的路由信息。如BGP通过Import-route命令重分发引入的路由,其Origin属性为Incomplete。
- AS-PATH(AS路径)属性:该属性按照矢量顺序记录某条路由从本地到目的地址要经过的所有AS编号,在接受路由时,设备如果发现AS-PATH列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。 AS路径列表记录了所经过的AS号,各AS号之间以逗号分隔,如(100,200,300),则表示该路由条目是经过了AS300、AS200和AS100传播到本设备,其中AS100是离本设备最近的AS。
- Next-Hop(下一跳)属性:又回到保证IBGP下一跳可达这个问题了,这么说吧,在前面提到的保证IBGP下一跳可达,就是利用了Next-Hop属性,不解释了。
- Local-Perf属性:用来标识BGP路由的优先级,,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但是下一跳不同的多条路由时,将选择优先级Local-Perf属性值较高的路由。Local-Perf属性仅在IBGP对等体之间有效,不会通告给其他AS,本地优先级在AS内部传递,数值越高越优先。默认优先级为100,可以手动更改。如下图: 互联网路由210.52.83.0/24和210.52.82.0/24分别通过ISP1和ISP2两个自治系统传到ISP0自治系统。配置RT4中210.52.83.0/24路由的Local-Pref属性为一个更高的值200,同理配置RT3中210.52.82.0/24路由的Local-Pref属性为一个更高的值200.如此一来,ISP0中的设备去往210.52.83.0/24将会走ISP1,去往210.52.82.0/24将会走ISP2。在RT4上,控制210.52.83.0的Local-Pref属性为200,而210.52.82.0的Local-Pref属性为100的配置如下:
[RT4]acl number 2000
[RT4-acl-basic-2000]rule 5 permit source 210.52.83.0 0.0.0.255
[RT4]route-policy test permit node 10
[RT4-route-policy]if-match acl 2000 #满足匹配ACL的条件
[RT4-route-policy]apply local-preference 200 #修改local-pref为200
[RT4]route-policy test permit node 20
[RT4-bgp]peer 1.1.1.1 route-policy test import #和邻居1.1.1.1入方向应用策略
- MED属性:用于判断流量进入邻居AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址一样但是下一跳不同的多条路由时,在其他条件相同的情况下,将选择MED 值较小者作为最佳路由,用来改变下游的选路。 MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给其他任何第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按默认值0来处理。
在RT3上,配置发送给EBGP邻居RT1的路由条目中匹配210.52.82.0/24,将MED属性设置为100,其他的设置为50的命令如下:
[RT3]acl number 2000
[RT3]acl number 2000
[RT3-acl-basic-2000]rule 5 permit source 210.52.82.0 0.0.0.255
[RT3]route-policy test1 permit node 10
[RT3-route-policy]if-match acl 2000 #满足配置ACL的条件
[RT3-route-policy]apply cost 100 #修改MED属性为100
[RT3]route-policy test permit node 20
[RT3-route-policy]apply cost 50 #没有匹配条件代表匹配一切条件,修改MED属性为50
[RT3-bgp]peer 1.1.1.1 route-policy test1 export #应用策略
四、BGP的选路原则
1)若去往目的网络的路由下一跳不可达,则可以忽略此路由; 2)Preferred-Value优先级以数值高的路由优先; 3)Local-Preference优先级以数值高的路由优先; 4)聚合路由优先级高于非聚合路由; 5)本地手动聚合路由的优先级高于本地自动聚合的路由; 6)本地通过Network命令引入的路由的优先级高于本地通过Import-route命令引入的路由; 7)AS路径长度最短(最少个数)的路径优先级高; 8)比较Origin属性,IGP优先级高于EGP,EGP优先级高于Incomplete; 9)选择MED优先级较小的路由; 10)EBGP路由优先级高于IBGP路由; 11)BGP优先选择到BGP下一跳的IGP度量低的路径; 当以上全部相同,则为等价路由,可以负载分担(注:AS-PATH必须一致),当负载分担时,以下3条原则无效: 1)比较Cluster-List长度,短者优先; 2)比较Originator_ID(如果没有Originator_ID,则用Router ID比较),选择数值较小的路径; 3)比较对等体的IP地址,选择IP地址数值最小的路径;
关于BGP理论总结就写到这里,感谢阅读~ 下一篇博文再写BGP的详细配置。