思科DNA网络工程师

【网络工程师路由篇】BGP基础概念

2020-12-30  本文已影响0人  小云晓云

BGP概述

BGP的协议特征

BGP报文

BGP对等体类型

有两种BGP邻居关系:

BGP的路径矢量特征

IBGP水平分割

同步规则及中转AS内的IBGP互联问题

BGP路由通告规则概述

BGP概述

IGP也即内部网关路由协议,典型代表有OSPF、IS-IS等。IGP工作的“着眼点”在AS(自治系统)内部,它的主要职责就是负责AS内的路由发现和快速收敛,而且其承载的路由前缀就是本AS内的前缀。

这里先介绍一下AS的概念,AS(Autonomous system,自治系统)指的是在同一个组织或机构管理下、使用相同策略的设备的集合。我们可以简单的将AS理解为一个独立的机构或者企业——例如中国联通——所管理的网络。另一个AS的例子是一家大型企业的网络,在网络的规划上将全球各个区域划分为一个个AS:

中国区是一个AS,南美区是一个AS以此类推。

不同的AS通过AS号区分,AS号取值范围1-65535,其中64512-65535是私有AS号,在私有网络可随意使用。IANA负责AS号的分发,如果要使用公有AS号,则需要向IANA申请。BGP(Border Gateway Protocol,边界网关协议),是一种距离矢量路由协议,严格的说应该叫路径矢量路由协议,主要用于在AS之间传递路由信息,适用于大规模的网络环境,Internet的骨干网络正是得益于BGP才能承载如此大批量的路由前缀。总的来说,无论是内部网关路由协议,或者外部网关路由协议,最终的目的都是为了实现路由的互通,从而最终实现数据的互通。

BGP的协议特征

BGP在传输层使用TCP以确保可靠传输,所使用的TCP目的端口号为179

BGP会在需要交换路由的路由器之间建立TCP连接,这些路由器被称为BGP对等体,也叫BGP邻居。有两种BGP邻居关系:EBGP邻居关系,以及IBGP邻居关系。

BGP的邻居关系可以跨路由器建立,而不像OSPF及RIP那样,必须要求直连。

BGP对等体在邻居关系建立时交换整个BGP路由表。

在邻居关系建立完成后,BGP路由器只发送增量更新或触发更新(不会周期性更新)。

BGP具有丰富的路径属性和强大的策略工具。

BGP能够承载大批量的路由前缀,用于大规模的网络中。

BGP报文

加入交流群696283186获取更多实验详细配置

BGP报文是被承载在TCP报文之上的,使用端口号179。共有五种报文:

报文名称作用是什么什么时候发包

OPEN协商BGP邻居的各项参数,建立邻居关系通过TCP建立BGP连接,发送open报文

UPDATE进行路由信息的交换连接建立后,有路由需要发送或路由变化时,发送UPDATE通告对端路由信息

NOTIFICATION报告错误,中止邻居关系当BGP在运行中发现错误时,要发送NOTIFICATION报文通告BGP对端

KEEPALIVE维持邻居关系定时发送KEEPALIVE报文以保持BGP邻居关系的有效性

Route-refresh为保证网络稳定,触发更新路由的机制当路由策略发生变化时,触发请求邻居重新通告路由

BGP对等体类型

运行BGP的路由器被称为BGP speaker。BGP路由器之间要交互BGP路由,前提是要建立正常的BGP邻居关系。要建立正确的BGP邻居关系,首先BGP对等体之间要先建立TCP连接,由于BGP是承载在TCP之上的,因此BGP没有“邻居必须直连”的限制。

有两种BGP邻居关系:

EBGP邻居(External BGP peer):

位于不同AS的BGP路由器之间的BGP邻居关系

在上图中,R1、R2、R3属于一个AS,AS号为100;R4属于另一个AS,AS号为200。由于R3及R4分别属于两个不同的AS,因此它们之间建立的BGP邻居关系就是EBGP邻居关系。

要建立eBGP邻接关系必须至少满足两个条件:

1)两个eBGP邻居所属AS号不同;

2)Peer命令所指定的IP地址要路由可达,并且两者之间TCP连接能够建立。

IBGP邻居关系(Internal BGP peer):

位于相同AS的BGP路由器之间的BGP邻接关系

在上图中,在AS100内,R1、R2、R3运行了一个IGP,也就是OSPF,运行OSPF的目的是为了让AS内的路由能够打通。另一方面,R1与R3之间建立一个BGP邻居关系,由于R1及R3同属一个AS,因此它们之间建立的BGP连接是IBGP的邻居关系。

值得注意的是,R2并没有运行BGP,R1-R3之间并非直连,这在BGP中是被允许的,因为BGP是被承载在TCP之上的。

建立IBGP邻接关系,必须至少满足两个条件:

1)两个IBGP邻居所属AS号相同;

2)Peer命令所指定的IP地址要路由可达,并且TCP连接能够建立。

不同的BGP邻居关系,对路由的操作是有明显区别的。

BGP的路径矢量特征

加入交流群696283186获取更多实验详细配置

BGP是一个路径矢量路由协议。在某些层面上,它与RIP非常相似,在BGP邻居之间互相更新的是路由表,BGP路由同样有距离的概念,只不过这里的距离,与RIP的所谓跳数是完全不同的。

BGP在将路由更新给邻居时,会给每条路由粘附许多路径属性(Path Attribute)。BGP定义了丰富的路径属性,使得BGP对路由的操控及策略部署变得异常的灵活。每条BGP路由都携带了若干路径属性,路径属性是BGP的一个非常重要的基本概念,可以理解是为用于描述每条路由的特征的一系列属性值。就好像一个人,有身高、体重、年龄等这么一些属性。其中一个非常重要的路径属性就是AS_PATH,称为AS列表,它用于描述一条路由经过的AS号。每条BGP路由都必须携带AS_PATH属性。

相比于IGP着眼于AS内,BGP的“心胸”可就开阔得多了,在BGP眼里,一跳,就是一个AS。在上图中,AS500内有条路由10.1.1.0/24,这条路由被AS500的边界路由器(在图中未画出)通告给了EBGP邻居R1及R3。在路由传出AS500的时候,边界路由器会将路由的AS_PATH属性值设置为500。现在R1收到了这条路由,它又将路由通告给了自己的IBGP邻居R2,由于这条路由没有被传出AS100,因此AS_PATH没有发生改变,值依然为500。接下去R2将路由通告给了EBGP邻居R5,由于这时路由要传出AS,因此R2为路由的AS_PATH插入一个值为100的号码(也就是本地AS号,在列表的前面插入),这样一来R2传递给R5的BGP路由10.1.1.0/24中,AS_PATH属性值就变成了100,500,这是一个AS的列表,当R5收到这条路由时,它就知道,我要去往10.1.1.0/24,是需要先到AS100,然后再到AS500,只需要经过2跳AS。

另一方面,R5也从R4收到了关于10.1.1.0/24的BGP路由更新,AS_PATH为300 200 500,R5就知道,从AS300也能到达10.1.1.0/24,不过需要经过3跳AS。

AS_PATH在BGP中是非常重要的路径属性。一方面能够用来作为BGP路由优选的依据,另一方面可用于在AS之间防止路由环路的发生。例如在上图中,R5同时收到两条到达10.1.1.0/24的路由,在不考虑其他因素的情况下,R5会优选AS_PATH更短的路由,因为“距离的AS跳数”更少,所以最终优选从R2走。另外,10.1.1.0/24被AS500的边界路由器通告给R1后,完全有可能从R2-R5-R4-R3再通告回来,这就形成了路由环路,庆幸的是有AS_PATH这个路径属性。如果AS500的边界路由器发现,EBGP邻居R3通告给它的路由的AS_PATH属性值里出现了自己的AS号,它就认为出现了环路,因此将忽略这个路由更新。

IBGP水平分割

在AS之间,BGP的路由防环很大程度上是通过AS_PATH实现的,而AS_PATH仅仅在路由离开AS才会被更改,因此在AS内,IBGP路由就没有EBGP路由那样的防环能力了,这就是为什么我们需要“IBGP水平分割”:为了防止路由环路的出现,BGP路由器不会将自己从IBGP邻居学习过来的路由再通告给其他IBGP邻居。IBGP水平分割在华为网络设备上默认已经开启。

IBGP水平分割加上AS_PATH路径属性,能够在极大程度上解决BGP的路由环路问题,但是,在某些环境中,IBGP水平分割也带来一些问题。

在上图中:路由器A属于AS65101、路由器BCDE属于AS65102、路由器F属于AS65103;AB,EF之间建立EBGP邻居关系;BC,CE,BD,DE之间建立IBGP邻居关系;

现在F路由器将一条路由通过BGP更新给了E,E从EBGP邻居学习到这条路由后,会将其通告给C,而C从自己的IBGP邻居E那学习到这条路由后,根据iBGP水平分割规则,它不能再将该路由通告给自己的IBGP邻居B了,因此B路由器无法学习到去往AS65103的路由。这就是IBGP水平分割带来的问题。

那么,为了规避这个问题,我们就不得不在AS65102内建立IBGP全互联,也就是BCDE四台路由器两两都建立IBGP邻居关系。这种方法在路由器数量较少的时候尚且可行,可是如果数量很多,路由器就将会因为需要维护过多的BGP邻居关系而导致性能下降。为了解决这个问题,BGP设计了两个机制:路由反射器,以及联邦,这在后文中讨论。

同步规则及中转AS内的IBGP互联问题

在上图所示的网络中:

路由器A属于AS65101;路由器BCDE属于AS65102;路由器F属于AS65103;

BCDE运行OSPF,打通AS65102内的路由;

BE路由器运行BGP,两者之间建立IBGP邻居关系;CD路由器不运行BGP。

A上有个直连网段1.1.1.0/24,A将到达该网段的路由注入BGP,并且将路由通告给B,B又会将其通告给IBGP邻居E(这个传递过程其实是B将BGP报文放置于IP包内经过C或D最终传递给E,对于CD而言,这些数据包都是普通IP包,目的地址是E,因此直接转发不查看)。

最终E将1.1.1.0/24路由传递到了F。然而,虽然F能通告BGP学习到这条路由,但是当有数据前往1.1.1.0/24时,F将数据包丢给下一跳E,而E发现1.1.1.0/24路由的下一跳是B,B并非直连,因此需递归得到其前往B的下一跳,到B的下一跳是D或C(通过OSPF得知),于是E将数据包丢给D或C,而C和D是并不知道如何到达1.1.1.0/24的(它们只运行了OSPF,没有运行BGP),于是它们将数据包丢弃,至此形成了路由黑洞。

【BGP同步规则的概念】BGP路由器从IBGP邻居学到一条路由后,是不启用的(不优选的),也不会将其通告给EBGP邻居,除非它再次从IGP学习到相同的路由,才会启用并通告给EBGP邻居。这是为了防止出现上面所描述的路由黑洞问题。

回到上文的场景,为了规避路由黑洞问题,可以考虑在B、E上,将BGP路由重发布进OSPF,这样一来B、E就都能从BGP,以及IGP学习到路由,从而形成同步(如下图所示)。但这么做后果是不可预估的,毕竟BGP承载的路由条目是相当巨大的。

另一个解决方案是AS内路由器都运行BGP,并实现IBGP全互联,那么该AS内的路由器就都能获得BGP路由,如此即可解决路由黑洞问题。但是这个方法有个缺陷,即如果设备数量太多,管理这些IBGP的邻接关系将会是个挑战,并且设备的负担也较大。此时可以使用BGP联邦或者路由反射器技术。

综上所述,我们可以通过多种手段解决路由黑洞问题,因此BGP同步规则也就不再有必要了。实际上这是一个很老旧的特性,华为路由器缺省时关闭了BGP同步规则。因此当BGP路由器从IBGP邻居学习到一条路由时,该路由器无需再从IGP再次学习到相同路由,可以直接将该BGP路由通告给EBGP邻居。

BGP路由通告规则概述

BGP路由器会将其发现的BGP路由存储在BGP路由表中。当到达同一个目的地存在多条BGP路径时,路由器会将这些路径(路由)都存储在BGP路由表中,但是,到达每一个目的网络,路由器只会选取最优(Best)的路由来使用,并将该BGP路由加载到全局路由表中(在没有激活路由负载分担的情况下)。

BGP路由器只把自己使用的、最优的路由通告给其他邻居。

BGP路由器会将其从EBGP邻居学习到的路由通告给所有BGP邻居(包括EBGP和IBGP邻居)。

BGP路由器不会将其从IBGP邻居学习到的路由通告给它的IBGP邻居(IBGP水平分割;存在路由反射器的情况除外)。

上一篇下一篇

猜你喜欢

热点阅读