我们之前所学的RIP也好,OSPF也好,都属于IGP协议- 内部网关协议(Interior Gateway Protocol),而我们本章要学习的BGP协议,则属于EGP协议— 外部网关协议(Exterior Gateway Protocol)。虽然都属于动态路由协议的范畴,但二者其实是存在本质的差别的,这个我们需要通过后续的课程,慢慢的研究清楚。
当然,我们首先需要搞清楚的,就是这个IGP协议和EGP协议是如何划分的。
这个划分依据其实我们在IA阶段去了解动态路由协议的时候,就已经提及到了,那就是依据工作范围来进行划分:
而这里提到的自治系统,就是我们范围的划分依据,我们英文称为AS (Autonomous system)
这里我们只需要知道,我们目前在IPV4环境下,主要使用的是BGPV4版本,而目前,市场上也存在BGPV4+版本,即MP-BGP(Muti-protocol-BGP),可以支持多种地址族,能应用在IPV6环境下。之后,我们在MPLS VPN中,也需要用到。
这里可以思考一个问题,那就是我们BGP在完成AS之间路由共享的时候,需要采用哪种形式来进行共享?
BGP共享AS之间的路由信息的方式应该是直接传递路由信息而不是共享拓扑信息,因为拓扑信息一方面更新量—更大,其次将暴露本AS的拓扑情况,所以,传递路由信息更加合理
这种做法显然有点类似我们之前接触的距离矢量型协议,但是,BGP并不属于距离矢量型协议,而我们通常称他为—“路径失灵型协议”
路径矢量 | 距离矢量 |
---|---|
一个AS为一跳 | 一个路由器为一跳 |
不是算法概念仅将IGP协议算好的路由信息传递出去,仅完成搬运工 | 是一个算法的概念,用来计算到达未知网段作的路由信息 |
所以,我们发现,BGP和我们之前学习的IGP是存在本质的区别的,IGP协议的主要任务是将AS内部的未知网信息计算获取到,而BGP则主要是将IGP协议计算出来的路由信息进行搬运和传递,并不去计算路由。
这里列举些BGP相比于IGP而言,不一样的关注点及其特征
可控性
AS-BY-AS
IBGP (Internal BGP):位于相同自治系统的BGP路由器之间的BGP邻接关系。
BGP存在5种数据包类型。(常用的是前四种)
报文名称 | 作用 | 发送时刻 |
---|---|---|
Open | 协商BGP对等体参数,建立对等体关系 | BGPTCP连接建立成功之后 |
Update | 发送BGP路由更新 | BGP对等体关系建立之后有路由需要发送或路由变化时向对等体发送Update报文 |
Notification | 报告错误信息,中止对等体关系 | 当BGP在运行中发现错误时,发送Notification报文将错误通告给BGP对等体 |
Keepalive | 标志对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接 |
Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
BGP的状态机和OSPF的状态机不同之处在于 — BGP的状态机仅描述的是对等体关系建立过程的状态变化。主要是因为BGP可以将邻居建立过程和BGP路由收发过程分开
BGP一共存在六种状态机。
Peer状态名称 | 用途 |
---|---|
dle | 开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源 |
Connect | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态,反复尝试连接 |
Active | TCP连接没建立成功,反复尝试TCP连接 |
OpenSent | TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立 |
OpenConfirm | 参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
Established | 已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息 |
IDLE — 空闲状态— 所有设备启动BGP进城后将首先进入空闲状态
当手工指定邻居关系后,将会进入到一个检查环节,需要检查手工指定的IP地址在本地路由表中是否可达,只有可达,才可以正常建立TCP的会话,如果不可达,则邻居关系建立失败,停留在IDLE状态。
如里检查成功,则将进入到Connect状态 — 连接状态。----建立TCP会话连接的状态
(注意,对等体关系指定是双向的,双方都将发起TCP会话连接请求,最终将会建立两个双向的TCP会话通道,只需要保留一个即可。所以,在之后发送的open报文中,将比较其中的RID参数,RID大的设备发起的TCP会话连接将被保留,RID小的发起的连接将被关闭。)
如果TCP会话连接失败,则将进入到Active状态 --. 尝试重新建立TCP会连接(多次失败后,将超时,回退到空闲状态,如果成功,则进入到opensent状态。)
如果TCP会话连接成功,则将直接进入到opensent状态— 发送open报文来协商参数,建立对等体关系。同时,也将收到对方发来的open报文,则将查看其中的参数,如果参数没问题,则将发送keeplive报文进行确认则将进入到openconfirm状态。— 等待对方发送keeplive报文,确认本地参数。
如果,收到对方发送的keeplive报文,则代表双方open报文中的参数协商完成,则邻居关系建立成功,将进入到最终状态— Established状态。
以下是BGP状态机变化的过程图:
根据我们之前对BGP基础的了解,我们下面总结以下BGP的工作过程。
由于BGP协议可以非直连建邻,所以导致BGP协议可能出现跨越未运行BGP协议的设备,导致BGP路由传递后,控制层面显示可达,但是,数据层面,流量流经未运行BGP协议的设备时,无法通过,形成路由黑洞。
解决方案
BGP在解决路由环路问题是采取的方法我们也称为— 水平分割
BGP的水平分割又分为两种,一种是专门针对EBGP对等体的EBGP水平分割,以及一个专门针对IBGP对等体的IBGP水平分割
EBGP的水平分割—针对EBGP对等体之间可能出现的环路问题所提供的解决方案
所谓EBGP的水平分割,主要用于防止EBGP环境路由回传而形成环路—BGP协议在路由条目中将经过的AS号进行记录,生成一个属性— AS_PATH(记载所有经过的AS的AS号),之后,在接收到的路由条目中的AS_PATH属性中,如果存在本地的AS号,则将拒绝学习该路由信息,防止路由回传,形成环路。 — AS PATH属性也可以用于选路,其可以反应经过AS的数量。
路由在EBGP对等体之间传递时,AS_Path还用于防止出现路由环路。R4从R3收到10.1.1.024路由后,如果它与R2之间存在EBGP对等体关系,那么它会将该路由通告给R2,此时路由的AS_Path为 300 100 200,如上图所示,R2从R4收到该路由后,会忽略这条路由更新,因为它在收到的路由中看到了自己本地的AS号码便意识到网络中出现了环路。
IBGP的水平分割— 针对IBGP对等体之间可能出现的环路问题所提供的解决方案
注意:因为BGP的AS-BY-AS的特性,要求其将一个AS看作是一个整体,所以,在默认情况下,AS内部传递的路由信息的路径属性是不会发生变化的。也就是说当BGP路由在一个AS内传递时,是无法依赖AS Path 提供的防环能力的,那么此时路由环路就有可能发生,IBGP水平分割规则就是用于解决这个问题的。
上图所示的网络中,R1与R2和R3分别建立EBGP对等体关系,而AS 64513内的三台路由器则两两建立IBGP对等体关系。现在R1将AS 64512内的10.1.1.0/24路由发布到BGP。R1将这条路由通过BGP通告给自己的EBGP对等体R2,当然,我们并不担心这条路由在AS 64512及AS 64513之间传递时会发生环路,因为ASPath能够起到防环的作用。但是在AS内部的路由防环呢?当R2收到R1通告的10.1.1.0/24路由后,它将这条路由通告给自己的IBGP对等体R3及R4,R4会将该路由通告给IBGP对等体R3,而R3又会将该路由通告给R2,这就极有可能引发路由环路。
所以,BGP规定,当路由器从一个IBGP对等体学习到某条BGP路由时,它将不能再把这条路由通告给任何IBGP对等体,这就是IBGP水平分割规则。在本例中,R4从IBGP对等体R2学习到的路由将不能再通告给R3,因为R3也是它的IBGP对等体。同理,R3从R2学习到的BGP路由也不能通告给R4。
IBGP水平分割规则是一个非常重要的设计,它可以在极大程度上规避AS内 BGP路由传递时可能引发的路由环路问题。然而在某些场景中,它也会带来一些新的问题。
上图展示了一个示例,在这个网络中,R4增加了一个IBGP对等体R5。由于IBGP水平分割规则的限制,R4是无法将学习自IBGP对等体R2的10.1.1.0/24路由再通告给另一个BGP对等体R5的,因此这将造成R5无法学习到去往AS64512的路由。实际上我们不可能放弃1BGP水平分割规则,因为它确实非常重要,但是在许多场景下又必须解决IBGP路由传递的问题。
解决方案:
这个问题有多种解决办法,例如可以在AS内部建立IBGP对等体关系的全互联模型。以AS 64513为例,需在该AS中所有的BGP路由器两两之间建立IBGP对等体关系。— 当然,这样做会造成资源消耗增加,网络的可扩展性降低。
所以,我们后面还会专门学习BGP里面的两个技术— 路由反射器和联邦。都是为了解决IBGP水平分割所造成的通讯障碍的。
BGP的基本配置可以分为对等体关系建立和发布路由两个部分来看。BGP可以实现邻居关系建立和发布路由分开实现)
1、启动BGP进程
[Huawei] bgp {as-number-plain / as-numberdot}
[Huawei-bgp] routerid ipv4-address
启动BGP,指定本地AS编号,并进入BGP视图。使用router-id命令配置BGP的Router D,建议将BGP Router D配置为设备Loopback接口的地址。
2、配置BGP对等体
[Huawei-bgp] peer (ipv4-address / ipv6-address ) as-number {as-number-plain / as-number-dot }
创建BGP对等体,指定对等体地址以及AS号。
3、配置建立对等体使用的源地址、EBGP对等体最大跳数
[Huawei-bgp] peer ipv4-address connect-interface interface-type interface-number [ ipv4-source-address]
[Huawei-bgp] peer ipv4-address eb-max-hop [hop-count ]
指定发送BGP报文的源接口,并可指定发起连接时使用的源地址。指定建立EBGP连接允许的最大跳数。缺省情况下,EBGP连接允许的最大跳数为1,即只能在物理直连链路上建立EBGP连接。
配置实例
R1的配置如下
[R1] bgp 100
[R1-bgp]router-id 10.0.1.1
[R1-bgp]peer10.0.3.3as-number 100
[R1-bgp]peer10.0.3.3connect-interface LoopBack1
R3的配置如下:
[R3] bgp 100
[R3-bgp]router-id 10.0.3.3
(R3-bgp]peer 10.0.1.1as-number 100
[R3-bgp]peer 10.0.1.1 connect-interface LoopBack1
[R3-bgp]peer10.0.34.4as-number 200
[R4] bgp 200
[R4-bgp]router-id 10.0.4.4
[R4-bgp] peer 10.0.34.3 as-number 100
这里我们搭建如下拓扑来完成之前邻居建立和路由发布的演示。
路由发布 — 对于BGP而言,只要是路由表中存在的路由信息,都可以发布
通过network命令发布路由
[R1-bgp]network 1.1.1024
— 后面跟目标网络号及掩码信息
发布路由后,我们就会使用update包将路由信息传递出去,当然,也会将发布的路由信息记录在BGP路由表中。我们前面说了,BGP路由表是将所有BGP发布及收集到的路由信息记录的表。
那下来我们可以先看下R1的BGP表。 — 我们可以通过命令:[r1]display bgp routing-table
来查看
目前表中只存在一条路信息,因为我们R1本身就只发布了一条1.0网段的路由,其他路由器也并没有发布路由信息。
状态码 — 路由条目最前面的符号,不同的状态码表示了该路由信息的不同状态
>--
代表优选。 — 当收到多条到达相同网段的路由信息时,并且都可用,则将依据属性在其中选择最优的进行加表及传递。我们这条因为是自己发布出去的,证明这条路由本身就在我们的路由表中,所以,可用性自然是得到保证的。而且,目前我们只有这一条1.0网段的路由信息,所以,我们肯定会让他优选的。那么这条路由就可以进行传递和加表了。
之后,我们可以看下R2的路由表,查到加表信息的路由信息如下。
1.1.1.0/24 EBGP 255 0D 12.0.0.1GigabitEthernet0/0/0址,我们将直接使用下一跳属性中的地址,我们将BGP的路由信息的优先级设置为255。
当然,该路由信息在R2上也是可用且优的,则可以传递给R2的邻居— R3。(则查看R3的BGP表)
我们发现,该路由信息不可用且不优。为啥不可,我们知道,BGP接收到路由信息之后,将尽心可用检查,这条路由的下一跳是12.0.0.1,所以,R3会基于自己的路由表去递归查找12.0.0.1。但是,因为这个网段,我们并没有宣告到OSPF中,所以,R3将检查失败,认定该路由不可用。所以没有。既然不可用,那自然也没有优选符号了。
这里主要是因为AS-BY-AS的规则,导致R2在给R3传递时并没有修改下一跳,所以,R3检查失败
解决方案:
我们需要到R2上做如下配置。
[r2-bgp]peer3.3.3.3 next-hop-local
(这个命令只是把外面传进来的路由的下一跳改成自己)之后我们的路由信息将可以正常传递了。
注意:这里如果R2和R4之间没有建立IBGP对等体关系的话,则R4将无法收到路由信息,主要原因是因为IBGP的水平分割导致。所以,需要保证整个AS 2内部,建立全联接的IBGP对等体关系
通过重发布发布路由
Network宣告的方式,是BGP协议最基本的通告路由的方法。当然,这样做也存在一定的缺点,就是当需要通告的路由量比较大的时候,使用这种方法就会十分的低效。
所以,我们还有另一种通告路由的方式,也就是批量通告的方式。那就是重发布。我们可以直接在BGP中将其他协议生成的路由重发布进来,以达到批量通告的目的。
[r2-bgp]import-route ospf 1
这里执行完成后,可以观察一下路由信息中最后一列的属性 — Ogn — 起源码
起源码一共存在三种
BGP的聚合分为自动聚合和手工聚合,我们分别来进行讲解。
[r1-bgp]summaryautomatic
— 自动聚合的开启命令Info: Automatic summarization is valid only for the routes imported through theimport-route command
— 命令执行后会出现信息提示,说明只能针对重发布的路由条目生效。因为自动聚合存在上述的两个缺点,所以,想要对路由信息进行精准的汇总,则需要使用到手工聚合
手工聚合所使用的命令为— Aggregate
在上图中,路由器按图示的要求建立EBGP对等体关系。R3向BGP发布了172.16.1.0/24及172.16.2.0/24路由(当然,在实际的情况中R3发布的子网路由可能更多,简单起见此处只取了两个子网做代表)。R1及R2能够通过BGP学习到这两条路由。我们便可以在次场景下进行手工聚合。
1.使用aggregate命令配置路由汇总
首先在R1为172.16.1.0/24及172.16.2.0/24这两条子网路由生成汇总路由。R1的关键配置如下:
[R1jbgp 100
[R1-bgplaggregate 172.16.0.016
使用aggregate命令,用户可以灵活地指定汇总路由的目的网络掩码长度,而且不受网络地址类别的限制。
此处为了简单起见,我们直接将汇总路由配置为172.16.0.0/16。
完成上述配置后,如果R1的BGP路由表中存在172.16.0.0/16这个网络下的子网路由,它便会产生BGP汇总路由172.16.0.0/16,并目将这条汇总路由通告给所有的BGP对等体,包括R3及R2,如图7-34所示。这里实际上存在两个问题第一个问题是配置aggregate 17216.0.016命令后,虽然R1的确产生了汇总路由,但是该汇总路由下的明细路由依然会被通告,也就是说R2将会学习172.16.1.0/24、172.16.2.0/24路由以及汇总路由172.16.0.0/16,因此实际上在R1上所做的路由汇总配置意义并不大,R1所通告的路由前缀数量并未减少,R2的路由表规模也并未减小。另一个问题是,R1所产生的这条汇总路由,由于丢失了明细路由的路径信息(尤其是 ASPath属性),因此它们会被通告给R3并被它接收,而且加载到路由表,这样就产生了路由环路的隐患。
2.使用aggregate detail-suppressed命令配置路由汇总
现在我们修改R1上的配置将aggregate命令修改为
[R1]bgp 100
[R1-bgplaggregate 172.16.0.0 16 detail-suppressed
使用aggregate 172.16.0.0 16命令,R1将产生汇总路由172.16.0.0/16并且将汇总及明细路由都通告给R2,如果在这条命令中增加detail-suppressed关键字,R1将只通告汇总路由,而抑制明细路由,如上图所示。完成上述配置后,R1的BGP路由表如下:
在R1的BGP路由表中,明细路由172.16.1.0/24及172.16.2.0/24在行首都有“s”标记,这意味着这些明细路由已经被抑制,不再被通告给其他 BGP对等体。
3.使用aggregate detail-suppressed as-set命令配置路由汇总
当使用aggregate命令配置BGP路由汇总时,如果增加 as-set 关键字,则产生的汇总路由将会继承明细路由的路径属性,其中ASPath属性的继承最为关键。现在将R1的配置修改为如下:
[R1]bgp 100
[R1-bgp]aggrogate 172.16.0.0 16 deuail-suppressed as-set
完成上述配置后,R1将抑制明细路由172.16.1.0/24及172.16.2.0/24,只通告汇总路由172.16.0.0/16(这得益于detail-suppresse关键字),而且由于命令中使用了as-set关键字,因此该条汇总路由将继承172.16.1.0/24及172.16.10.0/24这两条明细路由的路径属性。我们重点关注AS Path属性的继承。首先查看一下R2的 BGP路由表:
从R2的BGP路由表可以看出,它从R1收到的这条汇总路由的AS_Path 属性有了明显的变化,在使用as-set关键字之后,R1产生的汇总路由将会继承明细路由172.16.1.0/24及172.16.2.0/24的 AS_Path属性值,因此300这个AS号被写入汇总路由的AS Path,然后R1将汇总路由通告给EBGP对等体R2时,在该AS Path之前插入本地AS号100,这条汇总路由最终被加载到R2的BGP表中时,ASPath为100 300,如下图所示。另一方面,由于R1所产生的这条汇总路由继承了明细路由的 AS Path 属性,因此R3从R1收到关于该路由的更新后在路由的AS Path中将看到自己本地的AS号,于是它将忽略这个更新。如此一来,路由环路的隐患也就可以得到规避。
4、在aggregate命令中使用suppress-policy关键字
在使用aggregate命令配置路由汇总时,还可以搭配suppress-policy关键字,这个关键字用于通告汇总路由以及被选定的明细路由(换句话说,就是有选择性地抑制明细路由)。以上图为例,如果要求R1将汇总路由172.16.0.0/16以及除了172.16.1.0/24之外的其他明细路由都通告给R2,使用suppress-policy便可以轻松实现这个需求,R1的配置如下:
在上述配置中,我们首先定义了一个名称为no-subnet-1的IP前缀列表,并使用这个IP前缀列表允许了路由172.16.1.0/24。接着创建了一个名称为hcnp1的 Route-Policy,并在这个Route-Policy 的节点10中调用已经定义好的IP前缀列表no-subnet-1。最后,在BGP的配置视图下,使用aggregate 172.16.0.0 16 suppress-policy hcnp1命令通告汇总路由172.16.0.0/16 以及被选定的明细路由(抑制172.16.1.0/24路由,放行其他明细路由)。
suppress-policy关键字意为”抑制策略”因此该关键字所指定的Route-Policy 中,被允许(Permit)的路由将会被抑制。留意到IP前缀列表no-subnet-1的这条语句的匹配模式为Permit,而且 Route-Policy hcnp1的节点10的匹配模式也为Permit,所以只172.16.1.0/24路由被“允许”。
因此最终R2将学习到汇总路由172.16.0.0/16 以及除了172.16.1.0/24之外的其他明细路由。值得注意的是suppress-policy虽然调用了 Route-Policy,但是被调用的Route-Policy 只能用于路由匹配(只能使用if-match命令),不能用于设置路由属性 (不能配置apply命令)。此时,R1的BGP表如下:
172.16.1.0/24路由有“s”标记表明该条路由被抑制。R2的BGP表如下:
Atomic_Aggregate及Aggregator
这是和链路聚合相关的两个路径属性。
在BGP路由详细信息中可与看到Aggregator属性记录了聚合设备的AS号、Router ID,同时通过Atomic-Aggregate属性标明该路由为聚合路由。