BGP 路由协议
一、概述:
A、产生背景和基础:
1、BGP协议出现背景:
OSPF、ISIS路由协议在网络中已经广泛使用,但是随着网络规模的扩大,路由条目也随增加,IGP协议已经无法管理大规模网络了。因此出现了AS的概念。
官方解释:AS是指在同一组织管理下,使用统一选路策略设备的集合。简单来说:就是你可以把一个网络中的不同的设备划分到不同的组(AS)中,或者都划分在一个组中,那么一个组中的这些设备具备相同的路由协议。

比如你可以将企业总部网络划分在一个AS中,企业的分部网络划分在一个AS中。不同的AS可以运行不同的路由协议。不同AS的网络需要通信时,采用BGP路由协议。那么为什么不能够通过IGP(ISIS、BGP)进行通信呢。正如下图所示:


2、BGP协议基础:
BGP(Border Gateway Protocol,边界网关协议)是一种用于AS(Autonomous System,自治系统)之间的动态路由协议。AS是拥有同一选路策略,在同一技术管理部门下运行的一组路由器.
BGP用于在不同的自治系统(AS)之间交换路由信息。当两个AS需要交换路由信息时,每个AS都必须指定一个运行BGP的节点,来代表AS与其他的AS交换路由信息。通常是路由器来执行BGP。两个AS中利用BGP交换信息的路由器也被称为边界网关(Border Gateway)或边界路由器(Border Router)。
BGP的AS是指在一个组织机构管辖下拥有相同选路策略的IP网络,在一个自治系统中的所有路由器必须相互连接,运行相同的路由协议,BGP网络中的每个AS都被分配了一个唯一的AS号,用于区域不同的AS。
(2)BGP的AS号分为2字节和4字节的AS号,
2字节AS号范围1----65535的整数,
4字节AS号范围2----4 294 967 295的整数(可以有不同的表示格式)

早期发布的三个版本分别是BGP-1(RFC 1105)、BGP-2(RFC 1163)和BGP-3(RFC 1267),当前使用的版本是BGP-4(RFC 1771,已更新至RFC 4271)。BGP-4作为事实上的Internet外部路由协议标准,被广泛应用于ISP(Internet Service Provider,因特网服务提供商)之间。
BGP虽然是一种动态路由协议,但它实际上本身并不产生路由、不发现路由、不计算路由,其主要功能是完成最佳路由的选择并在BGP邻居之间进行最佳路由的传递。路由更新时,BGP只发送更新的路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息。
BGP使用TCP作为其传输层协议(监听端口号为179),本地端口号任意,提高了协议的可靠性,且不需要专门机制来确保连接的可控性。支持CIDR 无类域间路由,路由聚合需手动配置,同时提供了丰富的路由策略;也易于扩展。
BGP有2个重要属性,分别为AS-PATH 和 NEXT-HOP,通过这2个属性避免了环路的发生。2个属性解释如下:
AS-PATH。该属性包含了前缀的通告已经经过的那些 AS,即去往该目的前缀时需要经过的 AS 的列表,也称为通路向量,这使接受者能够了解去往目的网络的通路信息。因此 BGP 协议有时也称为“路径向量”协议。当一个前缀传送到一个 AS 时,该 AS 将它的 ASN 增加到该前缀的 AS-PATH 中。路由器使用该 AS-PATH 属性来检测和防止循环通告;特别是如果一台路由器看到它的AS 被包括在该路径列表中,它将拒绝该通告。
NEXT-HOP。指开始 AS-PATH 的路由器接口地址。该属性的重要性体现在,当某 AS 中的路由器知道到相同前缀 x xx 具有两条不同的路由时,这两条路由具有相同的 AS-PATH,但具有不同的 NEXT-HOP 值对应于不同的链路,使用 NEXT-HOP 值和 AS 内部路由选择算法,路由器能够确定到每条对等链路的路径的费用,然后使用热土豆路由选择来决定适当的接口。

AS之间:BGP通过携带AS路径信息来标记途经的AS,带有本地AS号的路由将被丢弃,从而避免了域间产生环路。
AS内部:BGP在AS内学到的路由不再通告给AS内的BGP邻居,避免了AS内产生环路。
BGP 按照运行方式分为 EBGP(External/Exterior BGP)和 IBGP(Internal/Interior BGP)。
1、EBGP:运行于不同 AS 之间的 BGP 称为 EBGP。为了防止 AS 间产生环路,当 BGP 设备接收 EBGP 对等体发送的路由时,会将带有本地 AS 号的路由丢弃。
2、IBGP:运行于同一 AS 内部的 BGP 称为 IBGP。为了防止 AS 内产生环路, BGP 设备不将从IBGP 对等体学到的路由通告给其他 IBGP 对等体,并与所有 IBGP 对等体建立全连接。为了解决 IBGP 对等体的连接数量太多的问题, BGP 设计了路由反射器和 BGP 联盟。
如果在AS内一台BGP设备收到EBGP邻居发送的路由后,需要通过另一台BGP设备将该路由传输给其他AS,则推荐使用IBGP。

B、Router-ID、BGP发言者(BGP Speaker)、BGP对等体(BGP Peer):
1、BGP Router-ID:
Router-ID(RID) 是用来唯一标识一台运行 BGP(或其他路由协议,如OSPF、IS-IS)的路由器的一个 32位标识符,通常写作 IPv4 地址形式(例如:1.1.1.1)。
注意:它只是“长得像”IP地址,但不一定必须是设备上实际存在的IP地址,只是一个标识符。其作用如下:
标识 BGP 邻居:BGP 建立对等体关系时,会以 Router-ID 作为唯一身份标识。
路径选择参考:在多条路径具有相同属性时,BGP 会选择 Router-ID 最小的邻居 作为下一跳路径(最后一条决策规则)。
环路检测:BGP 通过 Router-ID 来判断路由是否从自身学习到,从而避免环路。
Router-ID 的变化与生效时机
如果手动修改了 Router-ID,BGP进程需要重启才能生效(例如
reset bgp all或重启进程)。修改后,所有已建立的 BGP 邻居关系将重新建立。
2、邻居角色介绍:
发送BGP消息的路由器称为BGP发言者(BGP Speaker),它接收或产生新的路由信息,并发布(Advertise)给其它BGP发言者。当BGP发言者收到来自其它自治系统的新路由时,如果该路由比当前已知路由更优、或者当前还没有该路由,它就把这条路由发布给自治系统内所有其它BGP发言者。简而言之就是运行了BGP协议的路由器,就是BGP发言者。

自治系统中,运行 BGP 协议的路由器称为 BGP 发言人(BGP speaker)。
每个 BGP 发言人都有一个
4字节的 BGP 标识符(BGP identifier);标识符在 BGP 发言人启动过程中确定,通常是其某个接口的 IP 地址。
通过TCP连接建立邻居,那么这两个 BGP 发言人互称为对等发言人(peer)。
内部对等发言人(internal peer;IBGP):位于同一个 AS。如R1和R2。
外部对等发言人(external peer;EBGP):位于不同 AS。如R1和R3。

C、报文类型:
BGP存在5种不同类型的报文,分别是open、update、notification、keepalive、route-refresh。不同类型的报文具有相同的头部

D、邻居建立:
1、BGP状态机、邻居类型:
BGP的状态有idle、connect、active、opensent、openconfirm、established六种状态。

BGP邻居建立优化:为了增加稳定性,通常建议使用回环口来建立邻居
更新源:建立邻居和邻居学习到的路由的下一跳
多跳:EBGP邻居建立默认需要直连,因为默认TTL=1,如果非直连,必须修改TTL
BGP 邻居建立条件:
邻居关系建立在TCP连接基础上,因此邻居不一定需要直连,可以通过IGP路由协议(OSPF、RIP)或静态邻居路由来提供TCP连接的可达性(区别于其他IGP)
本地配置中的邻居所在AS号=邻居配置中的声明所在AS号
报文源IP=对方配置的邻居IP(这个源IP也叫更新源,也将作为路由的下一跳)。
BGP的邻居是通过单播的方式建立的,所以首先需要在BGP进程下手动配置邻接地址,没有自动发现邻居的机制,只能手动建立(区别于其他IGP)
一台BGP路由器只能运行在一个AS内(区别于其他IGP)
邻居类型分为IBGP和EBGP:
IBGP :内部BGP邻居(建立邻居的双方属于同一AS叫IBGP邻居关系) ,一般使用Loopback接口的IP地址
EBGP:外部BGP邻居(建立邻居的双方属于不同的AS叫EBGP邻居关系),一般使用直连口的IP地址
2、邻居建立过程**:**

(1)Idle状态是BGP初始状态。在Idle状态下,BGP拒绝对等体发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。任何状态中收到Notification报文或TCP拆链通知等Error事件后,BGP都会转至Idle状态。
(2)Connect状态,在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
如果TCP连接失败,那么BGP转至Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
(3)Active状态,在Active状态下,BGP总是在试图建立TCP连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
如果TCP连接失败,那么BGP停留在Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
(4)Opensent状态,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。
如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
(5)OpenConfirm状态:BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
(6)在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。
如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。
如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。
Route-refresh报文不会改变BGP状态。
如果收到Notification报文,那么BGP转至Idle状态。
如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。
在除Idle状态以外的其他五个状态出现任何ERROR的时候,BGP状态机就会回退到Idle状态。在BGP对等体建立的过程中,通常可见的三个状态是:Idle,Active,Established。Idle状态下,BGP拒绝任何进入的连接请求,是BGP的初始状态。
3、BGP 邻居重置的各类情况汇总
4、TTL值对建立邻居关系的影响:
TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
TTL值240~255为UNIX/Linux系统,TTL值100~130为windows系统。
通过TTL值可以推算出数据包已经经过了多少个路由:源地点TTL值减去返回的TTL值。

E、路由表:
1、路由表由来:
BGP路由是通过BGP命令通告而成的,协议本身不发现路由。且BGP 与 IGP 在设备中使用不同的路由表,为了实现不同 AS 间相互通讯, BGP 需要与 IGP 进行交互,即 BGP 路由表和 IGP 路由表相互引入
1、BGP引入IGP路由:BGP 协议本身不发现路由,因此需要将其他路由引入到 BGP 路由表,实现 AS 间的路由互通。当一个 AS 需要将路由发布给其他 AS 时, AS 边缘路由器会在 BGP 路由表中引入 IGP 的路由。为了更好的规划网络, BGP 在引入 IGP 的路由时,可以使用路由策略进行路由过滤和路由属性设置,也可以设置 MED 值指导 EBGP 对等体判断流量进入 AS 时选路。
2、BGP 引入路由时支持 Import 和 Network 两种方式:
Import 方式是按协议类型,将 RIP 路由、 OSPF 路由、 ISIS 路由等协议的路由引入到 BGP 路由表中。为了保证引入的 IGP 路由的有效性, Import 方式还可以引入静态路由和直连路由,其命令格式与在RIP中重分发OSPF差不多。
Network 方式是逐条将 IP 路由表中已经存在的路由(非BGP)引入到 BGP 路由表中,比 Import 方式更精确。和OSPF中使用network命令的方式大同小异,只不过在BGP宣告时,只需要宣告网段+掩码数即可,如:network 12.12.0.0 16。
3、IGP引入BGP路由:当一个 AS 需要引入其他 AS 的路由时, AS 边缘路由器会在 IGP 路由表中引入 BGP 的路由。为了避免大量 BGP 路由对 AS 内设备造成影响,当 IGP 引入 BGP 路由时,可以使用路由策略,进行路由过滤和路由属性设置。
在BGP网络中,本地生成的路由可能存在多种途径,那么当本地存在多种途径学习到相同BGP路由时,优先级次序依次如下:手动聚合>自动聚合>network>Import


2、路由通告原则:
连接建立时,BGP Speaker只把本身用的最优路由通告给对等体。
多条路径时,BGP Speraker只选择最优的路由放入路由表。
BGP Speraker从EBGP获得路由会向它所有的BGP对等体通告(包括EBGP和IBGP)。
通告给EBGP时,下一跳为自己。(注:如果通告路由的EBGP邻居需要接收的的EBGP邻居在同一网段,则通告时不修改下一跳。)
通告给IBGP时,不更改下一跳。防止次优路径。
BGP Speraker从IBGP获得的路由不会通告给其他的IBGP邻居。
IBGP的水平分割原理:从一个IBGP邻居收到的路由条目不会再通告给其他IBGP邻居。
如果想让所有的IBGP邻居都能收到路由,有三种解决方案:全互联(每两台设备之间都建立IBGP邻居)、RP(路由反射器)、联盟
BGP与IGP的同步。从IBGP邻居学来的路由信息,所有厂商同步功能默认关闭。华为不支持开启,思科可以开启:
如果同步关闭:会将从IBGP学到的路由传给eBGP邻居
如果同步开启:BGP不将从IBGP对等体获得的路由通告给它的EBGP对等体,除非该路由信息也能通过IGP获得。先查找自己的IGP。如果IGP里面有这个网络,就把这个网络传给eBGP;如果IGP里面没有这个网络,就不会传给eBGP邻居。
BGP同步规则的目的:防止一个AS(不是所有的路由器都运行bgp)内部出现路由黑洞,即向外部通告了一个本AS不可达的虚假的路由
3、接收路由处理方式:
二、路由属性:
A、路由属性的分类:
BGP路由属性是一组参数,它对特定的路由进行了进一步的描述,使得BGP能够对路由进行过滤和选择。 在 BGP 路由表中,到达同一目的地可能存在多条路由。此时 BGP 会选择其中一条路由作为最佳路由,并只把此路由发送给其对等体。BGP 为了选出最佳路由,会根据 BGP 的路由优选规则依次比较这些路由的 BGP 属性。事实上,所有的BGP路由属性都可以分为以下四类:
公认必须遵循(Well-known mandatory):所有BGP路由器都必须能够识别这种属性,且必须存在于Update消息中。如果缺少这种属性,路由信息就会出错。
公认可选(Well-known discretionary):所有BGP路由器都可以识别,但不要求必须存在于Update消息中,可以根据具体情况来选择。
可选过渡(Optional transitive):在AS之间具有可传递性的属性。BGP路由器可以不支持此属性,但它仍然会接收带有此属性的路由,并通告给其他对等体。
可选非过渡(Optional non-transitive):如果BGP路由器不支持此属性,该属性被忽略,且不会通告给其他对等体。
B、属性解析:
1、源(ORIGIN)属性:
它标识了BGP路由的起源。根据路由被引入BGP的方式不同,存在三种类型的Origin。当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。

2、AS_PATH 属性:
AS_PATH属性按一定次序记录了某条路由从本地到目的地址所要经过的所有AS号。当BGP将一条路由通告到其他AS时,便会把本地AS号添加在AS_PATH列表的最前面。收到此路由的BGP路由器根据AS_PATH属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
当BGP Speaker传播自身引入的路由时:
当BGP Speaker将这条路由通告到EBGP对等体时,便会在Update报文中创建一个携带本地AS号的AS_Path列表。
当BGP Speaker将这条路由通告给IBGP对等体时,便会在Update报文中创建一个空的AS_Path列表。
当BGP Speaker传播从其他BGP Speaker的Update报文中学习到的路由时:
当BGP Speaker将这条路由通告给EBGP对等体时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP设备根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
当BGP Speaker将这条路由通告给IBGP对等体时,不会改变这条路由相关的AS_Path属性。

使用Route-Policy修改BGP路由的AS_Path属性时,可以使用以下三种方式:
3、Next Hop 属性:
Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:
BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。下一跳为指定的EBGP邻居地址
BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。下一跳不变,仍保持为指定的上个AS的EBGP邻居IP地址
BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。

4、Local-Preference 属性:
Local_Pref属性表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由,即大的优先。
Local_Pref属性仅在IBGP对等体之间有效,不通告给其他AS,即不对EBGP邻居传递。Local_Pref属性可以手动配置,如果路由没有配置Local_Pref属性,BGP选路时将该路由的Local_Pref值按缺省值100来处理。
假设Internet 上有这样两条路由:
210.52.83.0/24和210.52.82.0/24,而需求是使到网络83 的流量分布在到ISP1 的链路上,而到网络82 的流量分布在到ISP2 的链路上。
RT5 分别有两个来源获得82 和83 路由,这样只需要在RT3 和RT4 上适当地对来源的属性进行修改,就可以达到目的。
BGP 可以给路由附加一种称为本地优先级的属性,路由器接收到去往同一目的地的多条路由,可以根据本地优先级属性值的高低进行路由选举。

5、MED 属性:
MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。等价于COST
MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。即是MED属性会被传递第一个AS,但不会传递至第二个AS。
MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。
路由时本机发布进BGP或者在本机通过策略修改了MED属性,都属于MED属性在本机被赋予。
这时候AS200 的管理者想达到以下目的,从AS100 来的到82 的数据流通过RT2 路由器到达,而从AS100 来的到83 的数据流通过RT1 到达。
在AS200 的边界路由器RT1 上,当向RT3 发布路由82 和83 时,给83 打上标记50,而给82 打上标记100。
在AS200 的边界路由器RT2 上,当向RT3 发布路由82 和83 时,给82 打上标记50,而给83 打上标记100。

6、Community 属性:
团体属性(Community)用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。每个AS 的管理员都可以自己定义目的地址所属的团体,团体属性由一系列以32 位长度(4字节)为单位的数值所组成。团体属性默认不传递
团体属性分为自定义团体属性和公认团体属性。公认团体属性如下所示:

7、Preferred-Value 属性:
Preferred-Value只能在路由器本地配置,而且只影响本设备的路由优选。该属性不会传播给任何BGP对等体。路由器本地始发的BGP路由默认的Preferred-Value为0,从其他BGP对等体学习到的路由默认Preferred-Value也为0,相当于路由的权重值,取值范围:0~65535;该值越大,则路由越优先。H3C和华为私有属性。
三、路由控制和选择:
A、选路原则:
当到达同一目的地存在多条路由时,BGP依照如下策略顺序进行路由选择:
1、首先丢弃下一跳(NEXT_HOP)不可达的路由;
2、优选Preferred-value值最大的路由;
3、优选本地优先级(LOCAL_PREF)最高的路由;
4、优选聚合路由;
5、优选AS路径(AS_PATH)最短的路由;
6、依次选择ORIGIN类型为IGP、EGP、Incomplete的路由;
7、优选MED值最低的路由;
8、依次选择从EBGP、联盟、IBGP学来的路由;
9、优选下一跳Cost值最低的路由;
10、优选CLUSTER_LIST长度最短的路由;
11、优选ORIGINATOR_ID最小的路由;
12、优选Router ID最小的路由器发布的路由。
13、优选地址最小的对等体发布的路由。
CLUSTER_ID为路由反射器的集群ID,CLUSTER_LIST由CLUSTER_ID序列组成,反射器将自己的CLUSTER_ID加入CLUSTER_LIST中,若反射器收到路由中CLUSTER_LIST中包含有自己的CLUSTER_ID,则丢弃该路由,从而避免群内环路的发生。
如果配置了负载分担,并且有多条到达同一目的地的路由,则根据配置的路由条数选择多条路由进行负载分担。
B、属性控制:
1、属性控制建议:
1、如果希望影响下游所有路由器的路由选择,建议适用AS-Path,
2、如果希望只影响笨AS内部路由器的路由选择,建议使用Local-Preference
3、如果希望只影响下游某一个AS的路由器的路由选择,建议使用MED
4、如果希望只影响某一台路由器的路由选择,建议使用Perferred-Value
2、属性控制方法:
1、对邻居传出或传入的方向调用:使用ACL匹配路由,对匹配的路由使用apply子句修改属性,其他路由使用空节点正常放行。
2、宣告网段是调用:直接使用apply子句修改属性,不需要配置if-match匹配条件,不需要配置空节点。
3、引入路由时调用:如果需要做路由过滤,不需要配置空节点。
C、AS路径过滤:
BGP使用正则表达式进行路由操作和过滤,主要是作用与AS-PATH,下面是一个AS-PATH示例:
AS-PATH由0-9,(),{},[]和空格组成。其中小括号表示联盟有序自治区号序列,中括号标志表示无序自治区号集合,无括号表示有序自治区号序列,大括号表示无序自治区号集合,空格作为分隔符。



32张图详解BGP路由协议:BGP基本概念、BGP对等体、BGP报文类型、BGP状态机等-腾讯云开发者社区-腾讯云
【BGP路径选择】Preferred Value,Local Preference_华为bgp local-preference preference——value默认-CSDN博客
BGP路由协议 - leagueandlegends - 博客园
2022-07-15 网工进阶(十九)BGP-状态机、对等体之间的交互原则、影响对等体关系建立的因素、对等体表、路由表、详细路由表、路由属性_relay ip nexthop-CSDN博客