飞道的博客

BGP协议基础

239人阅读  评论(0)

前言

我们前面学习了OSPF与ISIS,他们都是IGP内部网关协议,除了IGP外还有EGP外部网关协议。如果说OSPF,ISIS是用于一个自治系统AS内的动态路由协议,那么BGP就是用于不同AS之间的动态路由协议。所谓的AS指的是自治系统AS(Autonomous System),代表一个组织统一组建和维护的网络,简单讲就是一个局域网,类似企业网络或者学校网络等。而这种网络中使用的动态路由协议就是OSPF和ISIS,当然更多使用的是OSPF。而ISIS作为ISP底层路由协议为上层BGP提供支持。
BGP作为事实上的Internet外部路由协议标准,被广泛地应用在ISP之间。BGP使用TCP作为传输层协议,用来提高协议的稳定性。BGP经历了3个版本,我们现在使用的BGP是BGP-4。

BGP的基本作用


BGP的前身是EGP即外部网关协议,EGP的作用非常简单,只能在AS之间简单地传递路由信息,其他的问题均不考虑,最后被我们的BGP替代,既然BGP能替代EGP说明BGP不只是能简单的传递路由信息,还能进行其他的操作。BGP能做的其他操作有:邻居的发现与建立邻居关系,路由的获取、优选和通告(即有选择地传递路由),提供避免路由环路机制,并能够高效地传递路由,维护大量路由信息,在不完全信任的AS之间提供丰富的路由控制功能。
像OSPF与ISIS一样,BGP也有区域的概念,对于BGP来说区域的划分跟AS有关,一个AS即为一个区域。因此BGP用AS编号来标识路由域,AS编号唯一标识一个路由域或者说AS域,早期使用的AS编号只有2个字节最多是65535,其中1-64511为公有AS,64512-65534为私有AS,在2009年1月后IANA决定使用4字节的AS编号,即1-4294967295。

邻居的发现

与我们的OSPF和ISIS动态路由相似,我们BGP在进行工作前也要建立邻居关系,对于BGP来说邻居关系分为了IBGP和EBGP邻居关系。而我们前面也说了BGP使用的是TCP作为传输层协议,因此BGP也使用了TCP来发现邻居。由于TCP建立连接的特性即单播建立连接,所以配置BGP时要手动指定邻居,这一点非常重要!

当配置完BGP后,先起来的BGP路由器发起TCP请求,而后经过TCP三次握手后邻居建立完成,这与TCP连接建立一致,而BGP使用的端口号为179.
邻居关系
邻居建立完后根据不同情况分为了EBGP和IBGP邻居关系,EBGP邻居关系是不同AS域的路由器建立的另据关系即为EBGP邻居关系。

EBGP邻居关系


如上图所示,AS100内有三台设备,RTA,B,C,RTB与RTD分别属于不同的区域,他们之间建立邻居关系后会被BGP认为是EBGP邻居关系,在上图中AS100内使用IGP路由协议的OSPF建立AS内的路由。而AS直接则通过BGP建立路由,若在AS200内RTD想要访问或AS300的路由,则必须通过RTB和RTC在OSPF下引入BGP路由,然后在BGP下引入OSPF的路由。而这样做有许多的缺点:首先BGP承载的是AS间的路由信息,即公网路由条目,这个数量是非常庞大的,直接引入到IGP协议中可能会使得OSPF承担不了大量的BGP路由条目,并且在引入BGP路由信息时,里面携带了BGP自己的路由属性,OSPF无法识别,因此导致路由条目丢失。
这时候有没有不引入BGP路由条目又能有效传递BGP路由信息的方法呢?有,那就是我们的IBGP邻居关系。

IBGP邻居关系


同个AS域内的设备建立的BGP邻居关系称为IBGP邻居关系,并且由于BGP使用的是TCP建立连接,TCP的连接接力是逻辑上的建立连接,并不需要设备互连,因此IBGP邻居关系能够跨越设备建立。如上图所示RTB与RBC直接建立了IBGP邻居关系,用来传递AS200与AS300直接的BGP路由信息,而不必引入进OSPF中。

BGP邻居关系的配置


在配置邻居关系之前,首先配置Router ID用来标识设备。使用命令router id X.X.X.X

如果没有配置Router id,BGP路由器会从接口下选取IP地址最高的成为Router id选取顺序为loopback接口–>物理接口。
而后进入BGP视图,命令BGP +AS编号
进入手动配置邻居关系,命令为peer +对端邻居的更新源IP地址,标识自己向对端发起TCP连接的目的定制,而后接as-number+对端的AS编号,如果对端AS编号与自己想同则建立的是IBGP邻居关系,不同建立的是EBGP邻居关系。
例如R1配置与R2的邻居关系:

这样我们就建立了单方面的EBGP邻居关系,除了R1上要配置外,R2上也要有相应的配置。

这样一个EBGP邻居关系就建立成功了,这里需要注意的一点是,我们在建立IBGP邻居关系时一般使用对端的Loopback接口作为TCP请求的目的端口,这样是为了保证邻居建立的稳定性,只要路由可达,哪怕路由器接口故障也能建立邻居关系,因为Loopback接口是一个逻辑接口。因此我们在一个AS域内要配置IGP协议保证AS域内路由可达,而EBGP邻居关系必须使用对端直连接口IP地址作为TCP请求的目的地址,因为在未建立BGP连接前EBGP邻居之间非直连路由不可达。
而在使用Loopback接口建立IBGP邻居关系时除了peer对端Loopback接口外,还要指定建立连接的端口为环回口,例:

在R4上与R5通过Loopback接口接力IBGP邻居关系,注意的时在通过loopbcak建立邻居关系时要确保对端loopback口可达,不然邻居建立失败。同样的R5上也要配置。
如何查看邻居关系是否建立呢?
通过命令display bgp peer进行查看

显示Established则表示邻居建立成功。

BGP邻居状态

Idel BGP拒绝任何进入的连接请求,BGP初始状态
Connect 建立TCP邻居关系
Active TCP建立失败进入active状态,不断进行TCP连接知道定时器超时转入connect状态
OpenSent TCP建立成功,发送open报文,协商成功进入openconfirm状态,协商失败进入Idel状态
OpenConfirm 发送keepalive或Notification报文,如果收到keepalive报文则进入established状态,收到Notification报文则进入Idel状态
Established BGP路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文。

BGP报文类型

Open 在TCP连接建立后用来建立BGP邻居之间的关系
Keepalive BGP路由器会周期性的向邻居发出Keepalive报文,用来保持连接的有效性。
Notification 当BGP路由器检测到错误状态时,就向邻居发出Notification报文,之后BGP连接会立即中断。
Update 用于在BGP邻居之间交换路由信息。Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
Route-refresh Route-refresh消息用来请求对等体重新发送所有的可达路由信息。


Idel状态下不做任何操作,BGP使能后,配置相关命令,路由器进入connect状态进行等待TCP连接建立再进行后续操作,TCP建立完成后进入OpenSent状态,互相发送OPEN报文协商BGP邻居关系,路由器收到对端的OPEN报文后对报文进行检查,正确就进入OpenConfirm状态,不正确就就发送Notification报文给对端后进入Idel状态,进入OpenConfirm状态后发送keepalive或notification报文,处于OpenConfirm状态下收到keepalive报文则进入estabilished状态,如果收到notification报文则进入Idel状态,处于established状态下路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文。

BGP路由生成的方式

Network 在BGP中宣告已知的路由信息通过BGP转发
Import 在BGP中引入其他路由协议的路由信息

BGP通过Network和Import两种方式生成BGP路由,BGP路由封装在Update报文中通告给邻居。BGP在邻居关系建立后才开始通告路由信息。
Update消息主要用来公布可用路由和撤销路由,Update中包含以下信息:

网络层可达信息(NLRI) 用来公布IP前缀和前缀长度。
路径属性 为BGP提供环路检测,控制路由优选。
撤销路由 用来描述无法到达且从业务中撤销的路由前缀和前缀长度。

在通告BGP路由时要遵循下列原则:

一、存在多条有效路由时,BGP路由器只将自己最优的路由发布给邻居。
二、通过EBGP获得的最优路由发布给所有BGP邻居
三、通过IBGP获得的最优路由不会发布给其他的IBGP邻居
四、一条从IBGP邻居学来的路由在发布给一个BGP邻居之前,通过IGP必须知道该路由,即BGP与IGP同步。

BGP路由信息处理

IP路由表(IP_RIB) 全局路由信息库,包括所有的IP路由信息。
BGP路由表(Local_RIB) BGP路由信息库,包括本地BGP路由器选择的路由信息,邻居表,邻居清单列表。

当从BGP邻居接收到Update报文时,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径;得出的最佳路径被存储到本地BGP路由表(Local_RIB)中,然后被提交给本地IP路由表(IP_RIB),以用作安装考虑;被选出的有效的最佳路径路由将会被封装在Update报文中,发送给对端的BGP邻居。

BGP的属性


根据BGP属性,BGP路由能够有选择的发布路由或者接受路由信息,而不再是单纯的发布路由信息。在BGP属性中分为了4个类别的属性

公认必遵 BGP的Update消息中必须包含的属性。
公认任意 不必存在于BGP的Update消息中,可以根据需求自由选择的属性。
可选过渡 BGP不能识别该属性,但可以接收该属性并将其发布给它的邻居的属性。
可选非过渡 BGP可以忽略包含该属性的消息并且不向它的邻居发布。

其中公认必遵属性是Update里必须要包含的,也是一个BGP路由的基本信息,通过这三条属性我们能够建立一条基础的路由条目。而其他的属性就是对BGP在选择路由时的补充,使得我们BGP能有非常多的选择方式来获取或者发布想要的路由条目。

公认必遵属性:
Origin 定义了路由信息的来源,是由network产生的还是import产生的路由或者是从EGP学来的路由,按优先级来看network>import>EGP产生的路由
AS Path 记录了经过的AS编号,用来在AS间防环,一旦设备收到路由信息中ASpath有自己的AS编号则丢弃该路由信息
Next hop 记录了下一跳的IP地址

Origin的3种属性:
i表明BGP路由通过network命令注入;
e表明BGP路由是从EGP学来的,EGP协议在现网中很难见到,但可以通过路由策略将路由的Origin属性修改为e;
? 即Incomplete表明BGP路由通过其它方式学到路由信息,如使用import命令引入的路由。
3种Origin属性的优先级为:i>e>Incomplete(?)。

AS_Path的4种类型:
AS_Sequence
AS_Set
AS_Confed_Sequence
AS_Confed_Set

不同情况下的Next_hop
BGP路由器将本端始发路由发布给IBGP邻居时,会把该路由信息的Next_hop设为本端建立邻居关系所使用的接口IP。
BGP路由器在向EBGP邻居发布路由时,会把路由信息的Next_hop设置为本端与对端建立BGP邻居关系的接口IP。
BGP路由器在向IBGP邻居通告从EBGP学来的路由时,不改变该路由下一跳属性。

公认任意属性
Local_pref Local_Pref 属性仅在IBGP邻居之间有效,不通告给其他AS。它表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。默认100,越大越优
可选过渡属性
Community 限定路由的传播范围。打标记,便于对符合相同条件的路由进行统一处理。
可选非过渡属性
MED MED(Multi-Exit-Discriminator)属性仅在相邻两个AS之间传递,收到此属性的AS不会再将其通告给任何其他第三方AS,用于判断流量进入AS时的最佳路由。默认为0,越小越优
华为私有属性
Preference_Value Preference_Value是BGP的私有属性(华为私有属性),Preference_Value相当于BGP选路规则中Weight值,仅在本地路由器生效。Preference_Value值越大,越优先。默认为0

BGP路由优选原则:

BGP路由器将路由通告给邻居后,每个BGP邻居都会进行路由优选,路由选择有三种情况:
1.该路由是到达目的地的唯一路由,直接优选。
2.对到达同一目的地的多条路由,优选优先级最高的。
3.对到达同一目的地且具有相同优先级的多条路由,必须用更细的原则去选择一条最优的。
一般来说,BGP计算路由优先级的规则如下:
丢弃下一跳不可达的路由。
优选Preference_Value值最高的路由(私有属性,仅本地有效)。
优选本地优先级(Local_Preference)最高的路由。
优选手动聚合>自动聚合>network>import>从对等体学到的。
优选AS_Path短的路由。
起源类型IGP>EGP>Incomplete。
对于来自同一AS的路由,优选MED值小的。
优选从EBGP学来的路由(EBGP>IBGP)。
优选AS内部IGP的Metric最小的路由。
优选Cluster_List最短的路由。
优选Orginator_ID最小的路由。
优选Router_ID最小的路由器发布的路由。
优选具有较小IP地址的邻居学来的路由。


转载:https://blog.csdn.net/network_idiot/article/details/104638211
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场