不同于RIP、OSPF之类的路由协议,BGP是在自治系统之间进行路由学习及选路的协议。举例来说:把一个城市当做一个自治系统,RIP、OSPF路由协议就像是城市中的公交;BGP则相当于火车、高铁运行在城市与城市之间。
自治系统(AS)是由同一个技术管理机构管理,使用统一选路策略(运行同一种动态路由协议)的一组路由器的组合。自治系统的编号取值范围为165535。其中164511是互联网上注册的公有AS号,类似于公网地址,是全球唯一的且不可重复使用;64512~65535是私有AS号,类似于私网地址,可以重复使用但是互联网上是不可见的。
动态路由协议有很多种分类方法,其中按自治系统分类、按协议类型分类是比较常用的两种。
IGP:即自治系统内部的路由协议,主要包含RIPv1/v2、OSPF、ISIS、EIGRP(Cisco私有协议)。IGP是运行在AS内部的路由协议,它主要解决AS内部的选路问题。其主要作用是发现、计算路由;
EGP:即自治系统之间的路由协议,通常指BGP。EGP是运行在AS与AS之间的路由协议,它主要解决的是AS之间的选路问题。BGP的主要作用是控制路由的传播和选择最优路由;
通常情况下,会先使用IGP协议在自治系统内部计算和发现路由条目,再通过BGP协议将IGP协议产生的路由传递至其他的自治系统。
距离矢量路由协议:RIPv1/v2、BGP(路径矢量协议)、EIGRP(高级的距离矢量协议);
链路状态路由协议:OSPF、ISIS;
BGP是一种运行在AS与AS之间的动态路由协议,主要作用是在AS之间自动交换无环路由信息,以此来构建AS的拓补图,从而消除路由环路并实施用户配置的路由策略。目前公网路由条目众多,IGP协议无法承载,但是对于BGP来说却能轻松应对。而且BGP相比IGP具有更多的属性特性,更加便于在大规模的网络中使用多种路由策略,所以BGP协议常用于ISP与ISP之间或跨地域总、分公司之间的路由信息交互。
BGP解决的是自治系统之间的路由学习问题。当今互联网是全球互联,在中国,互联网运营商有电信和联通。每个公司都有自己的自治系统,并且内部运行IGP协议。但是互联网又要求互联,所以通过BGP就可以在电信和联通之间的学习路由,是电信的用户可以和联通的用户之间上网聊天,发送邮件等。
BGP具有以下特性:
(1)传输协议:TCP,端口号179;
(2)BGP是外部路由协议,用来在AS之间传递路由信息;
(3)是一种增强的路径矢量路由协议;
(4)拥有可靠的路由更新机制 ;
(5)具备丰富的Metric度量方法;
(6)无环路协议设计;
(7)为路由条目附带多种属性信息;
(8)支持CIDR(无类别域间选路);
(9)丰富的路由过滤和路由策略;
(10)无需周期性更新;
(11)路由更新时只发送增量路由;
(12)周期性发送KeepAlive报文以保持 TCP连通性;
BGP是跨公网、跨自治系统的路由协议,可以在自治系统之间学习路由。BGP的动态学习路由也是基于邻居,只有邻居关系正常,BGP才可以正常工作。
运行BGP的路由器通常被称为BGPSpeaker(发言者),相互之间传递报文的Speaker之间互称为对等体(Peer)。BGP邻居关系的建立、更新和删除是通过对等体之间交互5种报文、6种状态机和5个表等信息来完成的,最终才可以形成邻居关系。
BGP报文头中的Type定义了BGP的报文类型。BGP对等体之间通过5种报文进行路由信息的交互。下面详细介绍5种报文的详细信息。
Open(打开)报文是TCP连接建立后发送的第一个报文,用于建立BGP对等体之间的连接关系,主要包含BGP版本、本地AS编号、Hoidtime(保存时间)等信息。对等体在接收到对端发过来的Open报文并协商成功后,将发送KeepAlive报文确认并保持连接的有效性。BGP对等体关系确认后,对等体之间才可以进行发送剩下的报文,交换路由信息。
Update(更新)报文用来在BGP对等体之间更新路由信息。
Update报文可以通过多条属性系统同的就可达路由信息,也可撤销多条不可达路由信息。
网络可达信息(NLRI):通过此字段发布多条具有相同属性的可达路由,这些路由信息可共享同一组路由属性,此字段由可达的目的IP地址前缀和掩码组成;
撤销多条不可达路由:通过该字段发布应经失效或者不可达的路由信息。此字段由不可达的目的IP地址和掩码组成;
Update报文可以用于只撤销路由,在仅用于撤销路由时,不需要包括路径属性或NLRI。同样,也可以用于只通告可达路由,此时则不需要携带撤销路由信息。
Notification(通知)报文的作用是当BGP检测到错误信息时,立刻向对等体发出Notification报文,之后BGP连接会立即中断。要注意的是,不管当前的BGP状态当时处于何种状态,只要收到Notification报文就会返回idle状态。换而言之,BGP是不允许错误出现的一种路由协议,在选路原则中,更优的路径往往是邻居关系最久的对等体,以此反映对等体两端经历很长的时间都没有出现错误,而之前学过的其他路由协议则是越新越好。
用来告知对等体本地所支持路由的刷新能力。在所有BGP路由器拥有Route-Refresh(路由更新)能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发送Route-Refresh报文,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。
该报文在对等体之间周期性的发送,用以保持连接的有效性并维护器连接,KeepAlive(保持)报文只有一个BGP报文头。默认KeepAlive(保持)报文发送周期为60s,Holdtime(保存报文)为180s。KeepAlive报文类似于OSPF协议中的Hello报文,当收到对等体发过来的KeepAlive报文后会刷新Holdtime计时器,如果Holdtime计时器超时仍然没有收到KeepAlive报文,则认为对等体失效。
BGP状态机描述的是BGP邻居的建立过程,通过对这些不同状态的学习,可以更加深入地了解BGP的工作原理,以及排查思路。BGP状态机公有六种状态。
下面详细介绍BGP的六种状态:
ldle(空闲)状态,BGP拒绝任何进入的连接请求,IdIe状态是BGP的初始状态。在ldle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件(如运行BGP协议)后,BGP才开始尝试和其他BGP对等体进行TCP连接,并转至Commect状态。任何状态中收到NOtification报文或TCP拆链通知等Error事件后,BGP都对转至ldle状态。
Connect(连接)状态下,BGP等待TCP连接的建立完成后再决定后续操作。在Connect状态下,BGP启动连接重传定时器(通常计时器为30s),等待TCP完成连接。如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent(开放)状态;如果TCP连接失败,那么BGP转至Active(活跃)状态;如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其他BGP对等体进行TCP连接,停留在Connect状态。
Active(活跃)状态下,BGP将尝试进行TCP连接的建立,是BGP的中间状态。在Active状态下,BGP总是在试图建立TCP连接,如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态;如果TCP连接失败,那么BGP停留在Active状态;如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
在OpenSent(开放集)状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、Holdtime等进行检查。如果收到的Open安博文正确,那么BGP发送KeepAlive报文,并转至OpenConfirm(打开确认)状态;如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至IdIe状态。
OpenConfirm(打开确认)状态下,BGP等待KeepAlive或Notification报文。如果收到KeepAlive报文,则转至Established(确认)状态;如果收到Notification报文,则转至ldle状态。
在Established(确认)状态下,BGP可以在对等体之间交换Update、KeepAlive、Route-refresh报文和Notification报文。如果收到正确的Update或KeepAlive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接;如果收到错误的Update或KeepAlive报文,那么BGP发送Notification报文通知对端,并转至ldle状态。
**注意:**Route-refresh报文不会改变BGP状态。如果收到Notification报文,那么BGP转至ldle状态。如果收到TCP拆链通知(FIN),那么BGP断开连接,转至ldle状态。
在BGP对等体建立的过程中,通常可见的三种状态是ldle、Active、Established。BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。
BGP数据库是BGP正常工作所需要的存储空间,基于保存的内容不同,可分为如下几种:
全局路由信息库,包括所有最优的IP路由信息。
BGP路由信息看,包括本地BGP Speaker通告的路由信息,将其中最优路由添加到IP路由表中。
注意:先要关注BGP路由表,若BGP路由表中不是最优路由,则无法在IP路由表中可见。
对等体邻居清单列表,包括对等体两端的邻居信息及邻居列表。
对等体宣告给本地Speaker的未处理的路由信息库。
本地Speaker宣告给指定对等体的路由信息库。
在BGP中大致可分为两种邻居关系:
IBGP: 同一个AS内部的BGP邻居关系,IBGP邻居通常是指运行BGP协议的对等体两端均在同一个AS域内,属于同一个BGP AS内部;
EBGP: AS之间的BGP邻居关系,EBGP邻居通常是指运行BGP协议的对等体两端分别在不同的AS内;
注意:
IGP协议建立邻居一般要求三层直连,并且通过广播或组播建立邻居。而BGP的邻居关系是基于TCP的,也就是说只要TCP/IP可达,无论是否直连,BGP对等体彼此之间就可以建立邻居关系。所以BGP建立邻居之前首先要考虑的就是对等体之间的路径可达(是否存在路由)。务必要通过IGP或者静态路由使对等体两端互通。
BGP路由是通过BGP命令通告而成的,而通告BGP路由的方法有两种:Network方式和Import方式。
使用Network方式可以将当前设备路由表中的路由(非BGP)发布到BGP路由表并通告给邻居,需要注意的是,network的对象是路由条目而不是接口。
BGP通过路由和IGP不同,在IGP中,通告的是接口,以OSPF为例,假如路由器有两个接口,地址分别为192.168.1.1/24和192.168.2.1/24,那么运行IGP时,可以通告汇总地址,以使这两个接口运行OSPF协议,命令为network 192.168.0.0 0.0.255.255 area 0 。但是BGP不同,BGP通过的不是接口,而是路由,假如路由表中的实际路由为1.1.1.0/24,那么就不能执行命令network 1.0.0.0 8以8为通过,必须以实际的路由通告。
使用Import命令可以将锁学习到的路由信息重分发到BGP路由表中,是BGP宣告路由的一种方式,可以引入BGP的路由包括直连路由、静态路由即动态路由协议学习的路由。和Network方式的区别是,Import的对象是某种动态路由协议,而不是路由条目。
通过display bgp routing-table命令可以查看BGP的路由表,在输出的BGP路由中,“*” 表示有效的路由,“>”表示最优的路由,只有最优的路由才会最终放入路由表中。
如果某个BGP路由条目不优,那么原因可能有:
在同步打开的情况下,从IBGP邻居学习到的路由不会通过给其他BGP邻居,也不会使用该路由哦,直到通过IGP也学习到该路由或有静态路由可以关闭同步来解决(路由进程下执行
undo synchronization); BGP 路由条目的下一跳不可达;
BGP设备会将最优路由加入到BGP路由表,形成BGP路由。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;
(1)EBGP多跳
由于默认BGP中EBGP邻居之间的TTL值为1,若EBGP对等体非直连,在传递时,TTL跳数限制会使非直连的EBGP对等体无法正常建立邻居关系,所以需要用EBGP多跳的命令来解决非直连 的邻居关系。
(2)更新源建立邻居关系
连接公网环境设备的地址很容易出现各种各样的问题,为了避免因为接口不稳定或DOWN而导致的BGP状态的改变。通常会在同一个AS内使用冗余链路来确保BGP的稳定性,这样即使某一链路故障,也不影响BGP的邻居关系,所以经常会使用LoopBack接口IP地址和对端建立BGP邻居,因为环回接口永远是UP,所以只要至少有一条链路可达,BGP的邻居关系就不会因链路而发生改变,这种使用环回接口建立BGP邻居的方法称为更新源建立邻居。
在AS边缘的BGP设备,会接收到它的BGP对等体邻居传递过来的BGP路由信息。
区别于传统的协议,BGP协议包含很多路由属性,这些属性可以非常灵活的控制BGP的选路。
BGP的属性共分为公有必遵、公认任意、可选过渡、可选非过渡。
公有必遵:
所有BGP路由器都可以识别,且必须存在于Update报文中;
公认任意:
所有BGP路由器都可以识别,但不要求必须存在于Update报文中,可以根据具体情况来决定是否添加到Update报文中;
可选过渡:
BGP路由器可以选择是否在Update消息中携带这种属性。接收的路由器如果不识别这种属性,可以转发给邻居路由器(这就是过渡的含义),邻居路由器可能会识别并使用到这种属性;
可选非过渡:
BGP路由器可以选择是否在Update消息中携带这种属性。在整个路由发布的路径上,如果部分路由器不能识别这种属性,可能会导致该属性无法发挥作用。因为接收的路由器如果不识别这种属性,将丢弃这种属性,而且不再转发给邻居路由器;
BGP的常用属性有Origin、AS-PATH、Next-Hop、Local-Pref和MED等。
Origin属性属于公有必遵,用阿里定义路径信息的来源,其作用是标记一条路由是怎么成为BGP路由的。
Origin包含以下三种类型:
IGP(i):优先级最高。通过Network命令注入BGP路由表的路由,其Origin属性为IGP;
EGP(e):优先级次之。通过EGP得到的路由信息,通过使用Import-route命令注入的路由,其Origin属性为EGP;
Incomplete(?):优先级最低。通过其他方式学习到的路由信息;
AS-PATH属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有的AS编号。在接收路由时,设备如果发现AS-PATH列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。
AS路径列表记录了所经过的AS号,各AS号之间以逗号分隔,且离本设备最近的AS号在最前面。
当BGP Speaker发布始发于本自治系统的路由时,遵循以下原则:
(1)当BGP Speaker将这条路由通告到EBGP对等体时,便会在Update报文中创建一个携带本地AS好的AS-PATH列表;
(2)当BGP Speaker将这条路由通告给IBGP对等体是,便会在Update报文中创建一个空的AS-PATH列表;
当BGP Speaker抓饭来自于其他自治系统的路由时,遵循以下原则:
(1)当BGP Speaker将这条路由通告给EBGP对等体时,便会把本地AS编号添加到AS-PATH列表的最前面。收到此路由的BGP设备根据AS-PATH属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排序;
(2)当BGP对等体将这条路由发布给IBGP对等体时,不会改变这条路由相关的AS-PATH属性;
Next-Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,IGP中的下一跳描述的是下一个路由器,而BGP中的下一跳描述的是下一个AS,所以大部分情况下不是直连设备的IP地址。
通常情况下,Next-Hop属性遵循以下原则:
(1)BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址;
(2)BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口;
(3)BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变路由信息的下一跳属性;
Local-Pref属性标识BGP路由的优先级,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先级选择Local-Pref属性值最高的路由。Local-Pref属性仅在IBGP对等体之间有效,不通告给其他AS。本地优先级在AS内部传递,优先级越高越优先。
Local-Pref属性可以手动设置,如果路由器没有配置Local-Pref属性,BGP选路是将该路由的Local-Pref值按默认值100来处理。
MED属性用于判断流量进入邻居AS是的最佳路由,当一个运行BGP的设备通过不同的EBGP 对等体得到目的地址相同但下一跳不同的多条路由时,在其他条件相同的情况下,将优先选择MED值较小者作为最佳路由,用来改变下游的选路。
MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给其他任何第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按默认值0来处理。
众所周知,BGP是被广泛应用于互联网ISP与ISP之间的路由协议,而BGP之所以能被众多ISP所信任,主要是因为其路径选择过程非常严格。
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地址数值最小的路径;