站点图标 Linux-技术共享

彻底搞懂 BGP 动态路由

什么是 BGP?

BGP 的历史

BGP 在 Internet 历史中发挥的关键作用,1989 年,互联网的技术才慢慢兴起,但是此时互联网的商业行为还不被允许,直到 1995 年 NSFNET 退役,才慢慢放开口子。

NSFNET,英文全称:National Science Foundation Network,即国家科学基金会网络,这个是由美国的一个基金会成立的计划。

以前的互联网是只给政府机构和大学使用的,普通民众想都不敢想,自从 NSF 取消了访问限制,商业版的运营商网络才逐渐走入普通老百姓的家里。

BGP 是在 1989 年 6 月首次被标准化,在这之前,所谓的 Internet 网关是通过外部网关协议 (EGP)交换网络的,EGP 是为由核心 AS 和直接连接到该核心的多个其他较小 AS 组成的,完全依赖于 AS 的树形结构拓扑,没有循环。

在早期阶段,根网络的网关是通过 ARPANET 主干相互通信,但随着商业实体和多个主干(例如 NSFNET)的出现,其不足之处变得越来越明显。

BGP 的出现,解决了早期 EGP 的弱点,并且支持路由策略,是的 BGP 的地位越来越高,我们来看下 BGP 的成长路线:

这是网站https://bgp.potaroo.net/对 BGP 增速的统计,可以很直观的看出其发展是指数级的,非常之快!

BGP 的特点

有人喜欢把 BGP 比作是现实生活中的邮政服务,但是在我看来,BGP 就是地图:

谈到 BGP,首先想到的是 BGP 被分成各种自治系统 AS,那么我们联想到地图就是各个国家,每个国家都有自己的实体网络,其内部就是一个大型的 ISP,从一个国家到另外一个国家,点对点铺路或者建跨海大桥不太现实,不考虑坐飞机,我们从中国的北京到俄罗斯的莫斯科,BGP 会告诉你得先经过蒙古国才能进入莫斯科:

因为地图也会变化,所以相应的线路也会变化,所以各个自治系统(中国、蒙古国、俄罗斯)会去共享它们的地图,来达到路由更新。

BGP 路由就跟 GPS 一样,有时候由于某些原因不准确,会带错路,这个时候轻则返航,重则就会车毁人亡,这个在 BGP 中也是一样的,BGP 可能会将流量引导到不应该去的地方,从而导致问题的出现。

BGP 的工作原理

自治系统

自治系统就是 BGP 中的 AS,英文全称:autonomous system。

自治系统的概念源于互联网的基本定义,即互连计算机网络的全球系统。Internet 上的自治系统 (AS)是使用相同路由策略的网络或一组网络,通常由同一 Internet 服务提供商 (ISP) 提供服务。

刚刚我们也提到了,将 BGP 比作是地图,那么每个国家都可以看做是一个 AS:

如图所示,自治系统中的每一个都被分配了一个 ASN(自治系统编号),这允许 BGP 单独识别每个系统,可以唯一标识一个系统。

互联网号码分配机构(IANA)在全球范围内管理和分配 ASN,当网络管理员想要创建一个新的 AS 时,他们必须向其相关的区域互联网注册机构(RIR) 申请。

ASN 通过帮助识别数据到达目的地的最短 BGP 路由,使路由协议更加高效。

外部 BGP 和内部 BGP

一句话解释:外部 BGP 相当于国与国,内部 BGP 相当于某个国际的省与省,或者市与市,这个根据自己的情况来。

对等互联

已建立连接以交换 BGP 信息的两个路由器称为 BGP 对等体。

这个就跟地图的邻国一样,接壤的国家都是邻国,两国可以达成很多合作协议。

对等互联的优点

BGP 路由选择

我们直接上图:

如图有四个 AS,分别是 AS 101、AS 102、AS 103、AS 104,其中:

BGP 允许每个对等点从其相邻对等点收集路由信息,然后进一步完整地通告该信息。

因此,AS 101 中的 ASBR 知道它如何将数据包路由到 AS 104,即使它们没有直接连接。

BGP 是一种路径矢量路由协议,因为 ASBR 中的路由表包含网络前缀到组成路径的自治系统列表的映射。

假设位于中国的设备想要连接到位于俄罗斯的设备,中国端的设备订阅了网络自治号为 101 的 ISP 的服务,俄罗斯端的设备订阅了网络自治号为 104 的 ISP 的服务。

在连接俄罗斯端的设备时,中国端的设备发送带有源的数据包 IP 是它自己 IP 地址,目标 IP 是俄罗斯端设备的 IP 地址,数据包首先到达 AS 101 的网关,那里的路由器判断数据包的目的地不在它自己的网络中,然后它通过 AS 101 的内部路由器路由此数据包。

自治系统内部的路由过程是使用内部网关路由协议,比如 OSPF、RIP、IS-IS 等协议来实现的,与 BGP 不同,内部网关路由协议不能在外部使用。

所以从中国端设备到俄罗斯端设备有两条路径:

当 BGP 路由中,当有多条路径时,BGP 会进行最优路径选择,会从负载、延迟、可靠性、成本等因素去判定,下面我们来谈一下 BGP 的选路原则。

BGP 选路原则⭐

先给出结论,一共有 13 条选路原则!非常重要,牢记❗❗❗

1、权重

优先选择权重最高的路线,权重是 Cisco 专有属性,仅对本地路由器有效,本地 BGP 路由的默认权重为 32768,从其他对等方(内部或外部)学习的 BGP 路由的默认权重为零。

在华为设备中,权重一般是 Preferred-Value,这是华为的专有属性,值越大越优。

2、本地优先级

当权重一样的时候,本地优先级越大的越优,本地是针对在一个 AS 内的。

3、本地始发

当本地优先级一样的时候,则首选由本地路由发起的路由,本地发起的路由在 BGP 表中的下一跳为 0.0.0.0。

4、AS-Path

假如没有任何路由时本地发起的时候,这个时候有限选择 AS 路径最短的。

5、Origin

Origin 标识路由的来源,一般有三个:

因此优先级就是i>e>?

6、MED

首选 MED 最低的路径,MED 在自治系统之间交换。

MED 英文全称:MultiExit Discriminator,中文意思就是多出口鉴别。

通过 MED 可以通知其他 AS 应该采取怎样的路径进入目标 AS。

7、 eBGP 优于 iBGP

这个是由路径协议决定的,没啥好说。

8、优先考虑 NEXT_HOP 的最低 IGP 度量

这个也很好理解,没啥解释的。

9、集群列表

优先选择最短的 cluster-list,仅适用于路由反射器客户端。

10、路由器 ID

首选具有最低 BGP 邻居路由器 ID 的路径,路由器 ID 基于最高 IP 地址,如果有环回接口,则将使用环回上的 IP 地址,路由器 ID 也可以手动配置。

11、对等体 IP 地址

如果通过以上 10 种规则也没有选出最佳路径,那么可以用最后大招:对等体 ip 地址最小的最优。

⭐ 重要的事情再说一遍,BGP 选路原则一定要牢记,很重要,特别对于考证的童鞋,这块技术点都是变了法的考!

BGP 邻居状态 ⭐

这一小节也非常重要!

在传输任何路由信息之前,BGP 会与其他路由器建立邻居邻接关系,类似于 OSPF 和 EIGRP,BGP 不使用广播或多播进行 BGP 邻居发现,邻居是手动配置的,并通过 TCP/179 进行通信。

直接上图:

首先我们要给出结论:BGP 邻居状态一共有 6 种,分别是:

下面,我们来详细说明:

1、Idle 空闲状态

在 BGP 空闲状态下,路由器在路由表中搜索邻居 IP 地址的有效路由。

如果它没有针对其邻居 IP 地址的路由,则它保持在空闲状态,在这种状态下没有分配或分配很少的 BGP 资源。

还有一种情况也会让 BGP 状态保持在空闲状态,那就是关闭连接到邻居的物理接口或关闭 BGP 邻接关系进入 BGP 进程时。

2、Connect 连接状态

在连接状态下,BGP 等待三次 TCP 握手完成。

如果成功,连接重置计时器将由已建立的 BGP 会话进程重置,并向邻居发送一个 OPEN 消息,并将进入 OpenSent 状态。

如果失败,状态将继续到 Active 状态。如果连接重置计时器归零并且 Connect 阶段尚未完成,则连接重置计时器将被重置并且 BGP 将尝试新的三次 TCP 握手。

3、Active 激活状态

在 Active 激活状态下,发起 TCP 连接,建立 BGP 对等体关系。

如果成功,BGP 将其 OPEN 消息发送给对等方并进入 OpenSent 状态。

如果失败可能会导致进入活动或空闲状态。

4、OpenSent 打开发送状态

在向邻居发送 OPEN 消息后,BGP 也会等待来自 BGP 邻居的 OPEN 消息,检查和比较 OPEN 消息是否存在错误。

如果发现错误,BGP 将使用通知消息进行响应并跳回空闲状态。

如果收到成功的回复,BGP 状态将变为 OpenConfirm,并向对等方发送 keepalive。

5、OpenConfirm 打开确认状态

BGP 在 OpenConfirm 状态下等待来自对等体的 keepalive 消息。

如果成功,则状态变为已建立。

如果失败或者保持计时器耗尽,状态会根据错误返回空闲状态。

6、Established 已建立状态

在 Established 状态,路由器之间成功建立 BGP 对等会话,并在此阶段开始发布更新消息、保活消息(默认每 60 秒)或通知消息的交换。

根据从每个 BGP 对等体接收到的更新消息,形成一个 BGP 表,并将该表中的最佳路由发送到路由表。

如果任何更新消息包含错误,BGP 对等体将发送 NOTIFICATION 消息并进入空闲状态。

BGP 消息

BGP 使用各种消息来建立连接、交换路由信息、检查远程 BGP 邻居是否仍然存在和发生任何错误通知远端。

一般有四种 BGP 消息:

每种消息类型都有一个 BGP 标头:

分别是:

比较重要的是 length 和 type,length 表示消息的长度,type 表示消息的类型:

BGP open 消息

BGP open 消息用于建立 BGP 邻接关系,双方在建立 BGP 对等互连之前协商会话能力。

BGP update 消息

BGP update 消息用于在 BGP 对等体之间传递路由信息,update 消息用于通告共享公共路径属性的可行路由,或从服务中撤消不可行路由,两者都可以在单个 update 消息中完成。

BGP Keepalive 保活消息

为了确保即使长时间不需要发送更新,定时器也不会过期,每个对等体都会定期发送 BGP Keepalive 消息,用于确保 BGP 邻居仍在运行。

BGP Notification 通知消息

当检测到错误情况时发送 BGP Notification 消息,BGP 连接在发送后立即关闭。

BGP 会话建立过程

如图,有两台路由器:

左边是状态,中间的时间序列是消息,整体过程总的来说可以分成四步:

  1. 建立 TCP 连接

  2. 交换 BGP Open 消息。

  3. 开始定期交换 Keepalive 消息。

  4. 与 BGP 更新消息交换路由信息。

图中标红的过程就是 TCP 三次握手,握手成功就是建立完 TCP 连接了。

BGP 定时器

在 BGP 状态中我们提到了 BGP 定时器,那么 BGP 中一共有哪些定时器呢?

首先,我们给出结论,BGP 有以下定时器:

保活定时器

也叫心跳定时器,定期向远程邻居发送 BGP 心跳数据包,检查可达性和可用性,默认为 30 秒。

存活定时器

默认为 90 秒,即 Keep-Alive 时间的 3 倍。

如果 BGP 在存活时间内没有收到来自另一方的任何保活或更新消息,那么它将宣布另一方“死亡”并终止 BGP 会话。

通告间隔

通告间隔用于确定在通告的路由与从 BGP 对等体删除之间必须经过多长时间。

BGP 团体属性

BGP 团体是一个可选的、可传递的 BGP 属性,它被识别并传递给其他 BGP 对等体。

每个标准团体都是一个 32 位的值,它们通常被分成两个 16 位值,前 16 位编码源自团体的 AS 编号,后 16 位表示由 AS 分配的唯一编号,因为每个 AS 编号都是唯一的,所以每个团体在 Internet 上也是唯一的。

BGP 中一共有四种知名的团体,分别是:

1、No-Export

路由器不会将路由通告给外部对等体,仅向内部对等体通告。

如图显示了 AS 1 中的 R11、R12、R13 向外部区域的 AS2 对等体 R21 通告 No-Export 路由。

2、No-Advertise

BGP 发言者不会将该路由通告给任何对等体,包括内部和外部。

如图显示了 AS 1 中的 R11 向对等体 R12、R13、R21 发布了 No-Advertise 路由。

3、Internet

BGP 发言者将这些路由通告给所有邻居。

如图显示了 AS 1 中的 R11 向对等体 R12、R13、R21 发布了 Internet 路由。

4、Local-AS

可用于 BGP 联盟,它与 No-Export 基本相同,但它适用于联盟的子自治系统,被标记为 Local-AS 的路由仅被通告给同一子自治系统中的其他邻居,而不是通告给其他子自治系统或 eBGP 路由器。

如图所示,从 AS3 发出的 Local-AS 通告给 AS1 时,只能在 AS1 的子在自治系统 AS 102 中传播,不能通告给其他子自治系统 AS101 和 eBGP 路由器 AS2.

BGP 路由聚合

为了减少 BGP 路由表中的路由信息量,可以使用路由聚合。

Cisco 一般提供 3 种类型的 BGP 汇总:

举个例子:

如图,AS10 有网络 172.16.0.0/22,AS20 有网络 172.16.4.0/22,通过 AS30 的 R3 将此两条路由通告进 AS40 的 R4,现在为了节省 AS40 的 R4 的路由表,决定在 R3 上进行路由聚合:

1、聚合地址

通过聚合命令aggregate-address进行聚合:

2、手动聚合

手动汇总的工作原理是简单地为汇总网络添加一个静态空路由(null),这样可以存在于路由表种,然后可以通过 network 命令将此聚合路由添加到 BGP 种。

当流量进入路由器时,路由器会选择更精确的路由,确保不命中空路由。

3、自动汇总

Cisco 默认禁用自动汇总,我们只需要一条命令即可开启自动汇总:

BGP 过滤

路由过滤可以排除从邻居发布或接收的路由,从而达到操纵流量、降低内存利用率并提高安全性的效果。

BGP 过滤一般有三种方法:

1、前缀列表

前缀列表匹配的是路由而不是流量,通常与路由映射和其他过滤方法(一般结合 ACL)一起使用,前缀列表可以匹配前缀(网络本身)和前缀长度(子网掩码的长度)。

2、AS 路径

AS 是只有 BGP 才有的概念,可以设置成只运行某个 AS 通过或者拒绝某个 AS 的路由:

如图,在 R21 上可以拒绝来自 AS1 的路由。

3、路由策略 ⭐

路由策略最为丰富,既支持前缀列表过滤,又支持 AS 路径过滤,还支持好多高级特性的过滤,比如团体等。

这块不展开,内容太多,有兴趣可以自行研究一下,也可以配置的时候,按照厂商去查询相关手册,记得有出站策略和入站策略。

总结

退出移动版