【Calico系列】2 BGP入门笔记

本文是 Calico 系列的第二篇文章,在第一篇中对 Calico 官网 Blog 做了个回顾,了解团队和项目的开发情况。这一篇文章了解 BGP 协议的基础,以便更好理解地 Calico。这篇文章记录 BGP 的基本概念、原理和它的基本配置。

由于网络的水深与个人能力有限,本文不免存在错误之处。如有疑问,请查阅文末参考资料或与我线上/线下讨论。

目录:

  1. BGP 基本概念
  2. BGP工作原理
  3. BGP 路由属性
  4. BGP路由选择策略
  5. BGP安全性
  6. 路由反射器(RR)
  7. BGP联盟

一、BGP 基本概念

动态路由协议可以按照工作范围分为IGP以及EGP。

IGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换;而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换。

BGP则是EGP的一种。边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。

一个概念伴随着N个概念而来。下面来看这几个概念又是什么意思:

  1. AS(Autonomous system):自治系统,在一个实体管辖下的拥有相同选路策略的IP网络。BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。AS号分为2字节AS号和4字节AS号,其中2字节AS号的范围为1至65535,4字节AS号的范围为1至4294967295。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。

    • 中国电信163 AS号:4134

    • 中国电信CN2 AS号:4809

  2. IGP(Interior Gateway Protocol):内部网关协议,在一个AS内部所使用的一种路由协议。一个AS内部也可以有多个路由器管理多个网络。各个路由器之间需要路由信息以知道子网络的可达信息。IGP就是用来管理这些路由。代表的实现有RIP和OSPF。

  3. EGP(Exterior Gateway Protocol):外部网关协议,在多个AS之间使用的一种路由协议,但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。现在已经淘汰,被BGP取而代之。

使用BGP的理由:

  1. BGP能够承载大批量的路由前缀
  2. 支撑MPLS/VPN应用,传递客户VPN路由
  3. 支持多协议的扩展
  4. BGP采用认证和GTSM的方式,保证了网络的安全性。
  5. BGP提供了丰富的路由策略,能够灵活的进行路由选路,并且能指导邻居按策略发布路由。
  6. BGP提供了路由聚合和路由衰减功能由于防止路由震荡,有效提高了网络的稳定性。
  7. BGP使用TCP作为其传输层协议(目的端口号179),并支持与BGP与BFD联动、BGP Tracking和BGP GR和NSR,提高了网络的可靠性。
  8. 在邻居数目多、路由量大且大部分邻居具有相同出口的策略的场景下,BGP使用按组打包技术极大的提高了BGP打包发包性能。

BGP 协议特征

  1. BGP使用TCP传输层协议,179端口,BGP的对等体无需直连(MPLS点了个赞👍)。
  2. 存在两种类新的 BGP 对等体关系——EBGP和IBGP。
  3. 对等体关系建立完成后,BGP路由器只发送增量更新或触发更新(不会周期性更新,对链路带宽影响小!)。
  4. BGP具有丰富的路径属性和强大的策略工具
  5. BGP能够承载大批量的路由前缀,用于大规模的网络中。
  6. 目前主要的BGP版本为V4以及MP-BGP。

TCP 连接的窗口是65K字节,也就是说TCP连接允许在没有确认包的情况下,连续发送65K的数据。而其他的路由协议,例如EIGRP和OSPF的窗口只有一个数据包,也就是说前一个数据包收到确认包之后,才会发送下一个数据包。当网络规模巨大时,需要传输的数据也相应变大,这样效率是非常低的。这也是它们不适合大规模网络的原因。而正是由于TCP可以可靠的传输大量数据,且互联网的路由信息是巨大的,TCP被选为BGP的传输层协议,并且BGP适合大规模网络环境。

BGP 分类

BGP按照运行方式分为EBGP(External/Exterior BGP)和IBGP(Internal/Interior BGP)。

EBGP:运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。

IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。为了解决IBGP对等体的连接数量太多的问题,BGP设计了路由反射器(RR)和BGP联盟。

BGP 协议报文类型

1578916372518

BGP报文交互中的角色

BGP报文交互中分为 Speaker 和 Peer 两种角色。

Speaker:发送BGP报文的设备称为BGP发言者(Speaker),它接收或产生新的报文信息,并发布(Advertise)给其它BGP Speaker。

Peer:相互交换报文的Speaker之间互称对等体(Peer)。

BGP Router ID

BGP的Router ID是一个用于标识BGP设备的32位值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router ID,否则对等体之间不能建立BGP连接。BGP的Router ID在BGP网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router ID。如果设备上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router ID。一旦选出Router ID,除非发生接口地址删除等事件,否则即使配置了更大的地址,也保持原来的Router ID。

常见问题:路由黑洞

BGP只传路由不传数据,控制层面(路由)源、目的地址每过一路由器都变;而数据层面源、目的地址一直不变,若中间路由器没有该目的地址,数据层面可能会造成路由黑洞。

解决办法:物理线路全互连、BGP邻居逻辑全互连、MPLS(最好)

常见问题:路由环路

BGP的水平分割原则:

  1. EBGP:不接受包含自己AS号的BGP路由
  2. IBGP:从IBGP学到的路由不会通告给其他的IBGP邻居(BGP路由在AS内部只传一跳),所以IBGP邻居需要全互连(路由反射器、联邦)

二、BGP工作原理

BGP对等体的建立、更新和删除等交互过程主要有5种报文、6种状态机和5个原则。

报文

1578916431415

BGP状态机

img

1578916469203

  1. Idle状态是BGP初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
  2. 在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
    • 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
    • 如果TCP连接失败,那么BGP转至Active状态。
    • 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
  3. 在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状态。

BGP对等体之间的交互原则

BGP设备将最优路由加入BGP路由表,形成BGP路由。BGP设备与对等体建立邻居关系后,采取以下交互原则:

  • 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。
  • 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP和IBGP对等体。
  • 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。
  • 路由更新时,BGP设备只发送更新的BGP路由。
  • 所有对等体发送的路由,BGP设备都会接收。

三、BGP 路由属性

路由属性是对路由的特定描述,所有的BGP路由属性都可以分为以下4类,常见BGP属性类型所示:

  • 公认必须遵循(Well-known mandatory):所有BGP设备都可以识别此类属性,且必须存在于Update报文中。如果缺少这类属性,路由信息就会出错。
  • 公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中,即就算缺少这类属性,路由信息也不会出错。
  • 可选过渡(Optional transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。
  • 可选非过渡(Optional non-transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。

BGP常见属性类型:

属性名 类型
Origin属性 公认必须遵循
AS_Path属性 公认必须遵循
Next_Hop属性 公认必须遵循
Local_Pref属性 公认任意
MED属性 可选非过渡
团体属性 可选过渡
Originator_ID属性 可选非过渡
Cluster_List属性 可选非过渡

Origin属性(重要!):

Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:

  • IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
  • EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。
  • Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。

AS_Path属性(重要,防EBGP环路):

AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。在接收路由时,设备如果发现AS_Path列表中有本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属性。

Next_hop属性(重要!):

Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:

  • BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
  • BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
  • BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。

Local_pref属性(只在本地配置):

Local_Pref属性表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。Local_Pref属性仅在IBGP对等体之间有效,不通告给其他AS。Local_Pref属性可以手动配置,如果路由没有配置Local_Pref属性,BGP选路时将该路由的Local_Pref值按缺省值100来处理。

MED属性(仅在相邻两个AS之间传递):

MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。

MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。

团体属性:

团体属性(Community)用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。

团体属性分为自定义团体属性和公认团体属性。公认团体属性如下所示:

团体属性

Originator_ID属性和Cluster_List属性:

Originator_ID属性和Cluster_List属性用于解决路由反射器场景中的环路问题

四、BGP路由选择策略

当到达同一目的地存在多条路由时,BGP依次对比下列属性来选择路由:

  1. 优选协议首选值(PrefVal)最高的路由。

    协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。

  2. 优选本地优先级(Local_Pref)最高的路由。

    如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。

  3. 依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由。

  4. 优选AS路径(AS_Path)最短的路由。

  5. 依次优选Origin类型为IGP、EGP、Incomplete的路由。

  6. 对于来自同一AS的路由,优选MED值最低的路由。

  7. 依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。

    PE上某个VPN实例的VPNv4路由的ERT匹配其他VPN实例的IRT后复制到该VPN实例,称为LocalCross;从远端PE学习到的VPNv4路由的ERT匹配某个VPN实例的IRT后复制到该VPN实例,称为RemoteCross。

  8. 优选到BGP下一跳IGP度量值(metric)最小的路由。

  9. 优选Cluster_List最短的路由。

  10. 优选Router ID最小的设备发布的路由。

  11. 优选从具有最小IP Address的对等体学来的路由。

五、BGP安全性

BGP使用认证和通用TTL安全保护机制GTSM(Generalized TTL Security Mechanism)两个方法保证BGP对等体间的交互安全。

BGP认证:

BGP认证分为MD5认证和Keychain认证,对BGP对等体关系进行认证是提高安全性的有效手段。MD5认证只能为TCP连接设置认证密码,而Keychain认证除了可以为TCP连接设置认证密码外,还可以对BGP协议报文进行认证。

BGP GTSM:

BGP GTSM检测IP报文头中的TTL(time-to-live)值是否在一个预先设置好的特定范围内,并对不符合TTL值范围的报文进行允许通过或丢弃的操作,从而实现了保护IP层以上业务,增强系统安全性的目的。

例如将IBGP对等体的报文的TTL的范围设为254至255。当攻击者模拟合法的BGP协议报文,对设备不断的发送报文进行攻击时,TTL值必然小于254。如果没有使能BGP GTSM功能,设备收到这些报文后,发现是发送给本机的报文,会直接上送控制层面处理。这时将会因为控制层面处理大量攻击报文,导致设备CPU占用率高,系统异常繁忙。如果使能BGP GTSM功能,系统会对所有BGP报文的TTL值进行检查,丢弃TTL值小于254的攻击报文,从而避免了因网络攻击报文导致CPU占用率高的问题。

六、路由反射器(RR)

为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接关系。假设在一个AS内部有n台设备,那么建立的IBGP连接数就为n(n-1)/2。当设备数目很多时,设备配置将十分复杂,而且配置后网络资源和CPU资源的消耗都很大。在IBGP对等体间使用路由反射器可以解决以上问题。

路由反射器相关角色:

在一个AS内部关于路由反射器有以下几种角色:

  • 路由反射器RR(Route Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
  • 客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
  • 非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
  • 始发者(Originator):在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。
  • 集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。

路由反射器原理:

同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立IBGP连接,不需要与其他客户机建立IBGP连接,从而减少了IBGP连接数量。

RR突破了“从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。”的限制,并采用独有的Cluster_List属性和Originator_ID属性防止路由环路。RR向IBGP邻居发布路由规则如下:

  • 从非客户机学到的路由,发布给所有客户机。
  • 从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
  • 从EBGP对等体学到的路由,发布给所有的非客户机和客户机。

Cluster_List属性:

路由反射器和它的客户机组成一个集群(Cluster),使用AS内唯一的Cluster ID作为标识。为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。

  • 当一条路由第一次被RR反射的时候,RR会把本地Cluster ID添加到Cluster List的前面。如果没有Cluster_List属性,RR就创建一个。
  • 当RR接收到一条更新路由时,RR会检查Cluster List。如果Cluster List中已经有本地Cluster ID,丢弃该路由;如果没有本地Cluster ID,将其加入Cluster List,然后反射该更新路由。

Originator_ID属性

Originator ID由RR产生,使用的Router ID的值标识路由的始发者,用于防止集群内产生路由环路。

  • 当一条路由第一次被RR反射的时候,RR将Originator_ID属性加入这条路由,标识这条路由的发起设备。如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID属性。
  • 当设备接收到这条路由的时候,将比较收到的Originator ID和本地的Router ID,如果两个ID相同,则不接收此路由。

备份路由反射器:

为增加网络的可靠性,防止单点故障对网络造成影响,有时需要在一个集群中配置一个以上的RR。由于RR打破了从IBGP对等体收到的路由不能传递给其他IBGP对等体的限制,所以同一集群内的RR之间中可能存在环路。这时,该集群中的所有RR必须使用相同的Cluster ID,以避免RR之间的路由环路。

路由反射器

图:备份路由反射器

如上图,路由反射器RR1和RR2在同一个集群内,配置了相同的Cluster ID。

  • 当客户机Client1从EBGP对等体接收到一条更新路由,它将通过IBGP向RR1和RR2通告这条路由。
  • RR1和RR2在接收到该更新路由后,将本地Cluster ID添加到Cluster List前面,然后向其他的客户机(Client2、Client3)反射,同时相互反射。
  • RR1和RR2在接收到该反射路由后,检查Cluster List,发现自己的Cluster ID已经包含在Cluster List中。于是RR1和RR2丢弃该更新路由,从而避免了路由环路。

多集群路由反射器:

一个AS中可以存在多个集群,各个集群的RR之间建立IBGP对等体。当RR所处的网络层不同时,可以将较低网络层次的RR配成客户机,形成分级RR。当RR所处的网络层相同时,可以将不同集群的RR全连接,形成同级RR。

分级路由反射器:

分级路由反射器

图:分级路由反射器

在实际的RR部署中,常用的是分级RR的场景。如上图,ISP为AS100提供Internet路由。AS100内部分为两个集群,其中Cluster1内的四台设备是核心路由器,采用备份RR的形式保证可靠性。

同级路由反射器:

同级路由反射器

图:同级路由反射器

如上图,一个骨干网被分成多个集群。各集群的RR互为非客户机关系,并建立全连接。此时虽然每个客户机只与所在集群的RR建立IBGP连接,但所有RR和客户机都能收到全部路由信息。

七、BGP联盟

解决AS内部的IBGP网络连接激增问题,除了使用路由反射器之外,还可以使用联盟(Confederation)。联盟将一个AS划分为若干个子AS。每个子AS内部建立IBGP全连接关系,子AS之间建立联盟EBGP连接关系,但联盟外部AS仍认为联盟是一个AS。配置联盟后,原AS号将作为每个路由器的联盟ID。

这样有两个好处:

  1. 一是可以保留原有的IBGP属性,包括Local Preference属性、MED属性和NEXT_HOP属性等;
  2. 二是联盟相关的属性在传出联盟时会自动被删除,即管理员无需在联盟的出口处配置过滤子AS号等信息的操作。

联盟示意图

图:联盟示意图

如上图所示:AS100使用联盟后被划分为3个子AS:AS65001、AS65002和AS65003,使用AS100作为联盟ID。此时IBGP的连接数量从10条减少到4条,不仅简化了设备的配置,也减轻了网络和CPU的负担。而AS100外的BGP设备因为仅知道AS100的存在,并不知道AS100内部的联盟关系,所以不会增加CPU的负担。

路由反射器和联盟的比较:

路由反射器 联盟
不需要更改现有的网络拓扑,兼容性好。 需要改变逻辑拓扑。
配置方便,只需要对作为反射器的设备进行配置,客户机并不需要知道自己是客户机。 所有设备需要重新进行配置。
集群与集群之间仍然需要全连接。 联盟的子AS之间是特殊的EBGP连接,不需要全连接。
适用于中、大规模网络。 适用于大规模网络。

八、更多高级BGP特性

本章节转自: BGP基础知识

路由聚合

在大规模的网络中,BGP路由表十分庞大,给设备造成了很大的负担,同时使发生路由振荡的几率也大大增加,影响网络的稳定性。

路由聚合是将多条路由合并的机制,它通过只向对等体发送聚合后的路由而不发送所有的具体路由的方法,减小路由表的规模。并且被聚合的路由如果发生路由振荡,也不再对网络造成影响,从而提高了网络的稳定性。

BGP在IPv4网络中支持自动聚合和手动聚合两种方式,而IPv6网络中仅支持手动聚合方式:

  • 自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,BGP将按照自然网段聚合路由(例如非自然网段A类地址10.1.1.1/24和10.2.1.1/24将聚合为自然网段A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。
  • 手动聚合:对BGP本地路由表中存在的路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。

为了避免路由聚合可能引起的路由环路,BGP设计了AS_Set属性。AS_Set属性是一种无序的AS_Path属性,标明聚合路由所经过的AS号。当聚合路由重新进入AS_Set属性中列出的任何一个AS时,BGP将会检测到自己的AS号在聚合路由的AS_Set属性中,于是会丢弃该聚合路由,从而避免了路由环路的形成。

路由衰减

当BGP应用于复杂的网络环境时,路由振荡十分频繁。为了防止频繁的路由振荡带来的不利影响,BGP使用路由衰减来抑制不稳定的路由。

路由振荡指路由表中添加一条路由后,该路由又被撤销的过程。当发生路由振荡时,设备就会向邻居发布路由更新,收到更新报文的设备需要重新计算路由并修改路由表。所以频繁的路由振荡会消耗大量的带宽资源和CPU资源,严重时会影响到网络的正常工作。

路由衰减

图:BGP衰减示意图

路由衰减使用惩罚值(Penalty value)来衡量一条路由的稳定性,惩罚值越高说明路由越不稳定。如上图所示,路由每发生一次振荡,BGP便会给此路由增加1000的惩罚值,其余时间惩罚值会慢慢下降。当惩罚值超过抑制阈值(suppress value)时,此路由被抑制,不加入到路由表中,也不再向其他BGP对等体发布更新报文。被抑制的路由每经过一段时间,惩罚值便会减少一半,这个时间称为半衰期(half-life)。当惩罚值降到再使用阈值(reuse value)时,此路由变为可用并被加入到路由表中,同时向其他BGP对等体发布更新报文。从路由被抑制到路由恢复可用的时间称为抑制时间(suppress time)。

路由衰减只对EBGP路由起作用,对IBGP路由不起作用。这是因为IBGP路由可能含有本AS的路由,而IGP网络要求AS内部路由表尽可能一致。如果路由衰减对IBGP路由起作用,那么当不同设备的衰减参数不一致时,将会导致路由表不一致。

BGP与BFD联动

BGP协议通过周期性的向对等体发送报文来实现邻居检测机制。但这种机制检测到故障所需时间比较长,超过1秒钟。当数据的传输速度达到Gbit/s级别时,这种机制的检测时间将导致大量数据丢失,无法满足网络高可靠性的需求。BGP与BFD (Bidirectional Forwarding Detection)联动可以利用BFD的毫秒级快速检测机制解决上述问题。

BGP Rracking

BGP Tracking可以为BGP提供快速的链路故障检测,加速BGP网络的收敛速度。当使能了BGP Tracking功能的BGP对等体之间的链路发生故障时,BGP Tracking将快速感知到达邻居的路由的不可达,并由路由管理模块通知到BGP,从而实现快速收敛。

与BFD特性相比,BGP Tracking配置简单,只需在本地配置而不需要全网配置。但是由于BGP Tracking是路由层面的感知方式,而BFD是链路层面的感知方式,所以BGP Tracking收敛速度比BFD慢,不适用于对收敛时间要求较高的语音等业务。

BGP GR

BGP的平滑重启GR(Graceful Restart)作为高可靠性的解决方案,其根本目的都是为了保证用户业务在设备故障的时候不受影响或者影响最小。

BGP GR技术保证了在设备重启或者主备倒换过程中转发层面能够继续指导数据的转发,同时控制层面邻居关系的重建以及路由计算等动作不会影响转发层面的功能,从而避免了路由震荡引发的业务中断,提高了整网的可靠性。

GR相关概念:

  • GR Restarter:指由管理员触发或故障触发后,以GR方式重启的设备。
  • GR Helper:GR Restarter的邻居,协助GR Restarter进行GR的设备。
  • GR Time:是GR Helper检测到GR Restarter重启或者主备倒换后,保持转发信息不删除的时间。

BGP GR的过程是:

  1. 利用BGP的能力协商机制,GR Restarter和GR Helper了解彼此的GR能力,建立有GR能力的会话。
  2. 当GR Helper检查到GR Restarter重启或者主备倒换后,不删除和GR Restarter相关的路由和转发表项,也不通知其他邻居,而是等待重建BGP连接。
  3. GR Restarter在GR Time超时前与重启前的所有GR Helper新建立好邻居关系。

BGP ORF

RFC5291、RFC5292规定了BGP基于前缀的ORF(Outbound Route Filtering)能力,能将本端设备配置的基于前缀的入口策略通过路由刷新报文发送给BGP邻居。BGP邻居根据这些策略构造出口策略,在路由发送时对路由进行过滤。这样不仅避免了本端设备接收大量无用的路由,降低了本端设备的CPU使用率,还有效减少了BGP邻居的配置工作,降低了链路带宽的占用率。

BGP按组打包

目前现网路由表的快速增长,以及网络拓扑的复杂性导致BGP需要支持更多的邻居。特别是一些邻居数目多且路由量大的场景下,针对路由器需要给大量的BGP邻居发送路由,且大部分邻居具有相同出口策略的特点,要求较高的打包发包性能。

按组打包技术将所有拥有共同出口策略的BGP邻居当作是一个打包组。这样每条待发送路由只被打包一次然后发给组内的所有邻居,使打包效率指数级提升。例如,一个反射器有100个客户机,有10万条路由需要反射。如果按照每个邻居分别打包的方式,反射器RR在向100个客户机发送路由的时候,所有路由被打包的总次数是10万×100。而按组打包技术将这个过程变为10万×1,性能相当于提升了100倍。

MP-BGP

传统的BGP-4只能管理IPv4单播路由信息,对于使用其它网络层协议(如IPv6、组播等)的应用,在跨AS传播时就受到一定限制。BGP多协议扩展MP-BGP(MultiProtocol BGP)就是为了提供对多种网络层协议的支持,对BGP-4进行的扩展。目前的MP-BGP标准是RFC4760,使用扩展属性和地址族来实现对IPv6、组播和VPN相关内容的支持,BGP协议原有的报文机制和路由机制并没有改变。

MP-BGP对IPv6单播网络的支持特性称为BGP4+,对IPv4组播网络的支持特性称为MBGP(Multicast BGP)。MP-BGP为IPv6单播网络和IPv4组播网络建立独立的拓扑结构,并将路由信息储存在独立的路由表中,保持单播IPv4网络、单播IPv6网络和组播网络之间路由信息相互隔离,也就实现了用单独的路由策略维护各自网络的路由。

扩展属性

BGP使用的报文中,与IPv4相关的三处信息都由Update报文携带,这三处信息分别是:NLRI字段、Next_Hop属性、Aggregator属性。

为实现对多种网络层协议的支持,BGP需要将网络层协议的信息反映到NLRI及Next_Hop。因此MP-BGP引入了两个新的可选非过渡路径属性:

  • MP_REACH_NLRI:Multiprotocol Reachable NLRI,多协议可达NLRI。用于发布可达路由及下一跳信息。
  • MP_UNREACH_NLRI:Multiprotocol Unreachable NLRI,多协议不可达NLRI。用于撤销不可达路由。

知乎有篇文章《EBGP vs IBGP》下的讨论很有意思,转载过来:

Toby 探讨个问题,在VXLAN的数据中心网络里,什么时候选择ebgp,什么时候选择ibgp,有没有什么依据呢?

灵剑 内部只能用IBGP吧,EBGP需要AS号,号是要申的

Eric 非也非也…有用eBGP直接做互联的,AS号有私有范围的,再说不和运营商直接对接AS,用公有的问题也不大,而且有local-as/fake-as这种特性在,as冲突完全不怕

灵剑 这就不太了解了,学习了

迷路的石头 数据中心内部全EBGP设计挺多的,不用考虑反射器,联盟等一堆东西。ECMP相较IBGP也有优势。至于重复AS问题,私有加4字节AS搞定内部,在边界路由器上配置路由汇总后只用公有AS向外分发汇总路由即可

肖宏辉 bgp主要还是用于IP网络吧,vxlan可以用MPBGP作控制层,这个是bgp

肖宏辉 不接入互联网,是可以用ebgp,但是接入互联网的话,私有AS号也是有限的,没记错的话应该只有20多个。用ebgp作内部互联,收敛时间需要考虑,做一个大的ibgp,因为只有1-2跳,路由更新时间更短。

肖宏辉 全ebgp,那在边界要做特殊处理吧。相当于是做了两套独立的路由系统,一套内部,一套外部,中间自己做bgp进程隔离。其实bgp 联盟的sub-AS之间就是ebgp peer的(比真实的ebgp稍有变化),相比刚刚说的特殊处理,bgp联盟应该是更标准的数据中心内部连接方式。

ECMP是data plane的东西,IBGP是control plane的东西。可以用IBGP配置ECMP,不清楚这部分说的是什么。

迷路的石头 ibgp的ECMP需要单独开启,如果用了路由反射器的话,即使开启了ibgp多路径,反射器也只会反射最优的一条路径。

迷路的石头 2字节的as号是1024个,从64512到65535,4字节更多,具体数量还得查下。

惰惰猴 underlay网络搭建,当然EBGP更方便,underlay网络的leaf和spine之间是胖树结构,即代表spine和spine之间、leaf和leaf之间是不会有连线的。如果用iBGP那必然做不到underlay网络全互联,那么由于iBGP的水平分割(缺失AS-Path防环属性)和下一跳的限制,配置起来就相当麻烦,楼下的老大,BGP的AS号是有私有的,64512-65535你都可以用(这是路由交换起码的常识)。再说楼下的老大,您确定您的underlay网络能有一千多个以上的胖树vtep节点?回到Toby楼主的问题,vxlan只不过是运行在underlay网络之上的overlay,它与BGP不存在选择依据(BGP只作用在underlay网络),只要你underlay通,vtep之间的通信没问题,那vxlan隧道你想怎么建就怎么建,vxlan的瓶颈在VNI的自动分配和vtep之间隧道的自动化(隧道根据vtep的需求自动建立自动拆除)而不在于纠结底层overlay网络联通需要用什么动态路由。

肖宏辉 4字节的as还涉及到设备兼容的问题吧

迷路的石头 主流设备商新版本系统基本都支持,白盒就不好说了

肖宏辉 打了一大段话,切出来都没有了,重新打。。。。

嗯,对于vxlan来说,BGP主要用于构建underlay的IP网络,这个时候,vxlan是不感知BGP。当然,MPBGP也可以作为vxlan的控制层,在vtep之间传递vxlan数据,这个时候可以实现vtep的隧道自动化。但这是evpn地址族,跟这篇文章说的不是一个方向。

对于underlay,可以在spine跑BGP RR(路由反射器),leaf跑RR client,这个时候用来在leaf间传递路由还是比较方便的。如果spine、leaf规模较小,那这种配合BGP RR的iBGP连接方式也够用了。

如果规模大,会在spine-leaf上再加一层super-spine,成为5级clos结构,这个时候,原来的spine-leaf成为一个pod,pod之间,可以用ebgp,或者ibgp连接。ebgp的peer管理简单,但是路由分发复杂点,ibgp的peer复杂(受限于一跳),但是路由分发简单。

这篇文章,最开始就是想简单比较一下ebgp和ibgp,dc内的ebgp和ibgp组合应用更加多样,还涉及一些其他技术,但是的确非常有意思。如果大家有实际案例+技术实现细节,希望能够分享出来。

Eric 一般我做iBGP的话,肯定够会起一层IGP去收敛路由器之间的互联和环回口地址,ibgp用环回口去建立邻居,然后ecmp最后是递归到igp去做掉的,而互联网公司用eBGP则是最为追求简单形成ecmp的目的吧。另外不太同意文中iBGP属于IGP一种的说法。

惰惰猴 是的,这篇文章就IBGP和EBGP的不同点写的很生动,很喜欢你的创作风格,哈哈~~~

希望作者大大能坚持更新,嘿嘿~~

肖宏辉 是的,通常是IGP(OSPF,eigrp)建立AS内部的IP路由网路,IBGP建立点对点连接。点对点之间可以通过IGP做ECMP,所以IBGP与一般的IGP应用起来不一样。但是,从名字上来看,只能分到IGP了,毕竟这是AS内部用到的路由协议。

尽管BGP的multipath通常用来在eBGP间建立负载均衡,但是IBGP的multipath也没有禁止,思科和juniper都有支持。思科甚至还有multipath eibgp的支持。

迷途小羔羊 看BGP的种类 就看AS号码的范围就OK了

九、参考资料


【Calico系列】1 Calico官网文章列表 【Calico系列】3 Calico的组件、架构与原理