掘金 后端 ( ) • 2022-06-19 15:59

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

你好,这里是网络技术联盟站。

在之前的文章中,我们介绍了网络基础知识,之前基本上已经将路由协议讲完,每篇文章可以说是呕心创作,也得到了大家的支持,现在还剩最后一个动态路由协议:BGP。

今天铁定要安排一下的。之前的文章中实验涉及的比较少,就算有也只是demo,在IS-IS的文章留言中,就有小伙伴提出要放一下实验,那么这里统一做个解释:不是不能放,本身这次连载文章的主题就是介绍理论,理论方面非常晦涩难懂,我用很多易于理解的例子和生活中的术语去解释,既然是理论的,那么大家通过一篇文章能够将每个技术点的理论掌握好,我的目的就达到了。如果一篇文章中既有大篇幅的理论、又有大篇幅的实验,首先篇幅就很长很长,绝大部分人是看不到底的,有个成语叫做”望而却步“,而且不利于大家去记忆。所以在结束最后一篇BGP文章后,接下来的连载就是实验配置了,届时每个技术点实验都会介绍三家厂商:华为、思科、瞻博网络。

H3C的命令和华为99%类似,锐捷的命令和思科的也是99%类似,没必要冗余讲解。

那么还是回到今天的BGP主题,啥话也不说了,直接开始!

什么是BGP?

  • 英文全称:Border Gateway Protocol
  • 中文意思:边界网关协议
  • 是一种外部网关协议EGP
  • 是一种路径矢量协议
  • 基于TCP/IP,在OSI传输层(第 4 层)上运行以控制网络层(第 3 层)

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的成长路线:

BGP成长路线

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

BGP的特点

  • BGP 支持下一跳特性
  • BGP支持策略
  • BGP 支持 CIDR
  • BGP 支持安全性
  • BGP 节省网络带宽

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

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

北京到莫斯科

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

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

BGP 的工作原理

自治系统

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

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

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

国家就是一个AS

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

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

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

外部BGP和内部BGP

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

外部BGP和内部BGP

  • BGP 会话发生在不同 AS 的两个 BGP 邻居之间,则称为外部 BGP,简称eBGP
  • BGP 会话发生在同一 AS(内部网络)内的两个相邻设备时,则称为内部 BGP,简称iBGP

对等互联

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

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

对等互联的优点
  • 安全性:虽然对等互连并不能阻止所有类型的网络攻击,但可以一定程度上降低基于数据嗅探攻击的风险。
  • 性能:由于对等是直接连接,所以延迟和带宽是可控的,性能一般比其他连接方式好。
  • 可靠性:对等网络不会被诸如针对 ISP 基础设施的 DDoS 攻击等问题所破坏。
  • 节省成本:虽然对等互连可能需要大量投资来实施,但可以减少持续的运营费用,这个对于后期的盈利是非常有帮助的。

BGP路由选择

我们直接上图:

BGP路由选择

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

  • AS 101与AS 102建立了BGP对等体
  • AS 102与AS 103建立了BGP对等体
  • AS 101与AS 103建立了BGP对等体
  • AS 103与AS 104建立了BGP对等体

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 不同,内部网关路由协议不能在外部使用

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

  • 线路一:中国 -> AS 101 -> AS 102 -> AS 104 -> 俄罗斯
  • 线路二:中国 -> AS 101 -> AS 103 -> AS 104 -> 俄罗斯

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

BGP 选路原则⭐

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

BGP 选路原则

1、权重

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

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

2、本地优先级

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

3、本地始发

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

4、AS-Path

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

5、Origin

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

  • IGP:表明路由源自内部网关协议,如 RIP 或 OSPF,“i”是最优选的。
  • EGP:表明该路由源自外部网关协议,EGP 是一种已不再使用的过时路由协议。
  • Incomplete:如果 BGP 表显示不完整或未知来源,“?”是最不受欢迎的。

因此优先级就是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 邻居状态

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

  • Idle
  • Connect
  • Active
  • OpenSent
  • OpenConfirm
  • Established

下面,我们来详细说明:

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消息

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

分别是:

  • marker
  • length
  • type

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

  • 1:BGP Open消息
  • 2:更新消息
  • 3:通知消息
  • 4:Keepalive消息

BGP open消息

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

BGP open消息抓包

BGP update消息

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

BGP update消息抓包

BGP Keepalive 保活消息

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

BGP Notification 通知消息

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

BGP Notification 通知消息抓包

BGP 会话建立过程

如图,有两台路由器:

  • Router A
  • Router B

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

  1. 建立 TCP 连接
  2. 交换 BGP Open 消息。
  3. 开始定期交换 Keepalive 消息。
  4. 与 BGP 更新消息交换路由信息。

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

BGP定时器

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

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

BGP定时器

保活定时器

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

存活定时器

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

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

通告间隔

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

  • eBGP默认值为 30 秒
  • iBGP默认值为 5 秒

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 汇总:

  • 聚合地址:命令aggregate-address可以实现。
  • 手动聚合:通过空路由将汇总网络添加到 RIB,然后使用network命令宣告进BGP网络。
  • 自动汇总:Cisco 默认禁用自动汇总,可以开启进行自动汇总。

举个例子:

如图,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路径过滤,还支持好多高级特性的过滤,比如团体等。

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

总结

BGP在数通这块还是比较难的,本文差不多写了5000多字,但是也只是粗略的概括了BGP的技术点,适合大家收藏去入门理解和归纳,对于详细的介绍,还希望大家去好好读读思科的书,彻底理解BGP这个协议,读英文版有困难的童鞋可以去看看华为的文档,或者H3C的文档,看起来稍微轻松点,不过还是建议读思科的书。

好了,所有的路由部分的理论部分已经完毕,接下来就是介绍各大厂商的配置命令,大家也可以追更哦。

下期再见!