天天看点

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

本节书摘来自异步社区《ccie路由和交换认证考试指南(第5版) (第2卷)》一书中的第1章,第1.4节构建ip路由表,作者 【美】那比克 科查理安(narbik kocharians) , 特里 文森(terry vinson) , 瑞克 格拉齐亚尼(rick graziani),更多章节内容可以访问云栖社区“异步社区”公众号查看

1.4 构建ip路由表

到目前为止,本章已经解释了如何构建bgp邻居关系、如何将路由注入到bgp表中以及bgp路由器如何选择将哪些路由宣告给邻居路由器等内容。有些内容与bgp选择去往每个前缀的最佳路由的bgp决策进程有关,在特定路由成为最佳路由之前还必须满足一个附加约束条件,那就是next_hop必须可达。

本节将解释实现bgp终极目标(向ip路由表添加恰当的路由)的最后一步。虽然简单来说,就是bgp为每个前缀选择已识别的最佳bgp路由并将这些路由添加到ip路由表中,但是该过程需要满足一些约束条件,主要与ad(针对ebgp和ibgp路由)以及bgp同步(仅针对ibgp路由)有关。本节将详细讨论这些约束条件。

1.4.1 将ebgp路由添加到ip列表中

cisco ios软件在确定将哪些ebgp路由添加到ip路由表中时的规则很简单,只要满足以下两个条件即可:

关键

bgp表中的ebgp路由是“最佳”路由;

如果从其他igp或静态路由学到相同的前缀,那么bgp外部路由的ad必须小于其他路由源的ad。

在默认情况下,cisco ios认为ebgp路由的ad值为20,因而ebgp路由的ad优于(小于)其他动态路由协议的默认ad(eigrp汇总路由除外,其ad 值为5)。之所以会有这样的默认值,是因为从bgp学到的路由不应该是来自as内部的前缀。虽然在正常情况下很少将学自ebgp的前缀视为学自igp的路由,但如果确实如此,那么将默认优选bgp路由。

bgp为ebgp路由、ibgp路由以及本地(本地注入的)路由设置不同的ad,这三类路由的默认ad值分别为20、200和200。利用以下两种方法可以更改默认ad(有关这两种方法的详细内容请参考第9章的ad部分):

利用bgp子命令distance bgp external-distance internal-distance local-distance设置从ebgp学到的前缀的ad、从ibgp学到的前缀的ad以及本地注入的前缀的ad;

利用bgp子命令distance distance { ip-address { wildcard-mask }} [ ipstandard-list | ip-extended-list ]更改ad。

对于bgp来说,ip地址及子网掩码指的是为指定邻居配置的neighbor命令中使用的ip地址,而不是该路由的bgp rid或next_hop。acl负责检查从邻居接收到的bgp路由,并为所有与该acl允许语句相匹配的路由分配指定的ad值。

最后,需要对添加到ip路由表中的实际ip路由做进一步解释。该路由包含的前缀、前缀列表以及下一跳ip地址与bgp表列出的完全相同(即使next_hop pa不是直连网络中的ip地址),因而ip转发进程可能需要执行递归查询。例1-12给出了相应的配置示例,例中的r3拥有三条bgp路由,每条bgp路由的下一跳地址均为1.1.1.1,该地址正是r1的环回接口地址。从图1-4可以看出,r3与r1之间没有公共接口,去往1.1.1.1的路由列出了实际的下一跳ip地址(数据包将被转发到该地址)。

例1-12 r3的下一跳为1.1.1.1的路由,需要递归路由查询

1.4.2 后门路由

ebgp路由默认ad值(20)较低对于某些拓扑结构来说可能会产生一定的问题(如图1-6所示),图中的企业1通过ebgp路由到达企业2的网络99.0.0.0,但这两个企业希望使用从ospf学到的路由经企业间专线进行通信。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

由于ebgp路由的ad(20)小于ospf路由的ad(110),因而r1使用其ebgp路由去往99.0.0.0。此时一种解决方式是配置distance命令以减小ospf路由的ad值,但bgp为此类场景提供了更好的解决方案,即使用network backdoor命令。对于本例来说,如果r1配置了路由器bgp子命令network 99.0.0.0 backdoor,那么将会达到如下效果:

r1将为从ebgp学到的到达网络99.0.0.0的路由使用本地ad(默认200);

r1不通过bgp宣告网络99.0.0.0。

按照该解决方案,如果r1需要使用该私有链路去往企业2,那么就可以为每条前缀都配置network backdoor命令。如果去往每条前缀的ospf路由都处于正常运行状态,那么r1将优选ospf路由(ad为110),而不会选择从ebgp学到的经internet的路由(ad为20)。如果ospf路由丢失,那么这两个企业仍然能够通过internet进行通信。

1.4.3 向ip路由表添加ibgp路由

对于cisco ios来说,将ibgp路由添加到ip路由表也要满足与ebgp路由相同的两个条件:

该路由必须是最佳bgp路由;

与其他路由源相比(根据ad进行比较),该路由必须是最佳路由。

此外,对于从ibgp学到的路由来说,ios还要考虑bgp同步问题。

如果使用no synchronization命令禁用了bgp同步机制,那么将ibgp路由添加到ip表中与将ebgp路由添加到ip列表中的处理方式完全相同。如果启用了bgp同步机制(配置了bgp子命令synchronization),那么就可以避免出现一些ip路由问题。从图1-7可以看出,asn 678错误地禁用了bgp同步机制,从而产生了路由黑洞。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

下面列出了图1-7中的bgp处理过程。

第1步:r5通过两条network命令将两条前缀(21.0.0.0/8和22.2.2.0/24)添加到自己的bgp表中。

第2步:r5将这两条前缀宣告给r7,但r7并没有将这些前缀重分发到自己的igp中。

第3步:r7将这两条前缀宣告给r6。

第4步:由于r6(禁用了bgp同步)认为这些路由是“最佳”路由,因而r6将这些路由添加到自己的ip路由表中。

第5步:r6将这两条前缀宣告给r1。

上述过程出现了两个路由问题(如图中标示的a、b)。首先是路由黑洞问题(标示为a),出现路由黑洞的原因是r8没有去往bgp宣告的这两条前缀的路由,r8没有运行bgp(对于不与ebgp对等体直连的路由器来说很常见),r7也没有将这两条前缀重分发到igp中,因而r8无法为这些前缀路由数据包。因此,虽然r6(可能还包括as 123中的路由器)试图通过as 678来转发去往这两条前缀的数据包,但r8却丢弃了这些数据包(因为路由黑洞)。

第二个路由问题(标示为b)出现在第5步,由于r6向其他as(as 123)宣称其能够到达这些前缀,从而进一步加剧了路由黑洞问题。r6认为其bgp表中去往21.0.0.0/8和22.2.2.0/24的路由是最佳路由,因而r6将这些路由宣告给r1。根据拓扑结构以及pa设置情况,r1会将这些路由视为最佳路由,从而将去往这些前缀的数据包发送给as 678。但是根据前面的示例配置,r1应该将经r3去往as 45的as_path视为最佳路径。

虽然可以采用多种方案解决上述路由问题,但所有解决方案归根结底都必须让内部路由器(如r8)学到去往这些前缀的路由,从而解决路由黑洞以及宣告这些路由所带来的负面影响。针对这类问题的最原始解决方案是使用bgp同步并将bgp路由重分发到igp中,不过目前可以提供两种更好的解决方案。

bgp路由反射器;

bgp联盟。

有关这两种解决方案的详细信息将在后面的章节进行讨论。

1.使用bgp同步并重分发路由

理解bgp同步的最好方式是结合希望使用该机制的场景进行分析。顾名思义,bgp同步就是将bgp路由重分发到igp中,目前的isp很少使用该方法,主要原因是担心将大量bgp路由注入到igp中。但是将bgp同步与重分发结合使用,就可以解决与上述路由黑洞相关的故障问题。

理解bgp同步的关键就是必须知道重分发解决的是路由黑洞问题,而bgp同步解决的是将黑洞路由宣告到其他as中的问题。例如,为了解决上述路由黑洞问题,r7需要将这两条前缀重分发到rip中(如图1-7所示),此时r8就拥有了去往这些前缀的路由,从而解决了路由黑洞问题。

r6的同步特性处理的是上述路由问题的第二个问题,要求r6在特定条件下才能将这些前缀宣告给其他ebgp对等体(如r1)。bgp同步通过控制bgp表项是否是“最佳”路由来完成其功能。需要记住的是,仅当bgp表中的路由是“最佳”路由时,才能将该路由宣告给bgp对等体。bgp同步机制通过如下方式来确定最佳路由问题:

不将bgp表中的ibgp路由视为“最佳”路由,除非通过igp学到了完全相同的前缀,并且该前缀目前位于路由表中。

从本质上来说,bgp同步机制为路由器提供了一种了解as内部非bgp路由器是否有能力将数据包路由到指定前缀的方法。需要注意的是,该路由必须是从igp学到的路由,因为r6上的静态路由无法为其提供其他路由器(如r8)是否已经学到或未学到该路由的任何提示信息。再次以图1-7为例,r6通过rip学到这些前缀之后,rip会将这些路由安装到ip路由表中,此时r6的同步机制就可以将bgp表中从bgp学到的这些相同前缀视为最佳路由的候选路由,如果被选为最佳路由,那么r6就可以将这些bgp路由宣告给r1。

例1-13从r6的角度显示了路由黑洞问题。例中的r6利用bgp子命令no synchronization禁用了bgp同步机制。例1-13的后半部分则显示了r7将bgp路由重分发到igp之后的r6操作情况(此时r6已经启用了bgp同步机制)。

例1-13 路由黑洞(禁用同步)与解决方案(启用同步)

如果igp是ospf,那么bgp同步机制还有一些古怪的要求:如果宣告前缀的路由器的ospf rid与宣告相同前缀的bgp路由器的rid数值不同,那么同步机制不允许bgp将该路由器视为最佳路由。虽然ospf与bgp使用相同的优先级及规则来选择自己的rid,但是使用了同步机制之后,对于将bgp重分发到ospf的路由器来说,最好将其ospf和bgp的rid显式配置为相同值。

2.禁用同步并在as内的所有路由器上运行bgp

解决路由黑洞的第二种方法就是简单地利用bgp将所有从bgp学到的前缀都宣告给as中的所有路由器。这样一来,所有的路由器都能知道这些前缀,从而可以安全地关闭同步机制。但是该解决方案的缺点是需要在所有路由器上都引入bgp,而且要求每对路由器之间都必须建立ibgp邻居连接(如果as中有n台路由器,那么就需要建立n(n-1)/2条邻居连接)。对于大型自治系统来说,这样做会存在大量对等连接,从而严重影响bgp的性能及收敛时间。

由于bgp不会将ibgp路由(从ibgp对等体学到的路由)宣告给其他ibgp对等体,因而bgp要求在as内部建立全网状的ibgp对等连接。虽然该要求能够避免路由环路,但是也带来了全网状ibgp对等连接问题(否则只有部分ibgp对等体能够学到所有前缀)。

bgp提供了两种有效工具(联盟和路由反射器)来减少as内的对等连接数量,同时还能预防路由环路并允许所有路由器都学到所有前缀。下面将逐一介绍这两种工具。

3.联盟

根据rfc 5065的定义,可以将部署bgp联盟(confederation)机制的as划分为多个联盟子自治系统,并将as内的每台路由器都划分到其中的一个联盟子自治系统中。位于同一个sub-as(sub-autonomous system,子自治系统)中的对等体是联盟ibgp对等体(confederation ibgp peers),位于不同sub-as中的路由器是联盟ebgp对等体(confederation ebgp peer)。

联盟可以将路由传播给所有路由器,而不需要在整个as内建立全网状的对等连接。为此,可以在一定程度上将联盟ebgp对等连接视为真正的ebgp对等体。在sub-as内部,联盟ibgp对等体之间必须建立全网状连接,因为它们与普通的ibgp对等体操作特性完全相同,即联盟ibgp对等体之间不会相互宣告ibgp路由。联盟ebgp对等体与ebgp对等体相似,因为联盟ebgp对等体可以将从联盟sub-as学到的ibgp路由宣告给其他联盟sub-as。

联盟利用as_path pa来防止在联盟as内部产生环路,联盟内的bgp路由器负责将sub-as添加到as_path中并作为as_path字段的一部分,称为as_confed_seq(as_path最多包含四个组件[称为字段]:as_seq、as_set、as_confed_seq以及as_confed_set。有关as_seq和as_set的详细信息可参见前面的“手动汇总与as_path路径属性”一节)。

注:

术语as与sub-as指的是自治系统与子自治系统的概念,asn与sub-asn指的则是实际使用的as号。

与as_seq和as_set能够避免自治系统间环路一样,as_confed_seq和as_confed_set也能避免在联盟自治系统内部出现环路。联盟ebgp对等体在将ibgp路由宣告给其他sub-as之前,该路由器必须确保目的sub-as不在as_path as_confed_seq字段中。以图1-8为例,sub-asn 65001中的路由器学到一些路由之后将这些路由宣告给sub-asn 65002和65003,然后这两个sub-asn中的路由器又将这些路由宣告给对方,但是由于as_confed_seq(标注在图中)的缘故,这两个sub-asn中的路由器始终不会将这些路由宣告给sub-asn 65001中的路由器。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

图1-8给出了一个非常详细的联盟as_path案例,图中带圆圈的数字标识的步骤如下。

第1步:r45注入并通过ebgp将路由21.0.0.0/8宣告给as 123,该路由的as_path为45。

第2步:r3通过自己的两条ibgp连接宣告该前缀,但是根据sub-as内部的ibgp规则,r1与r2之间不会相互宣告该前缀。

第3步:sub-as 65001中的路由器按照ebgp规则将21.0.0.0/8宣告给它们的联盟ebgp对等体,但是首先要将自己的sub-asn添加到as_path的as_confed_seq字段中(这部分as_path显示在show ip bgp命令输出结果中的括号内[如图1-8所示])。

第4步:其他两个子自治系统均重复第2步所描述的相同操作。

第5步:r6和r9将各自的asn添加到as_confed_seq中之后,会将该路由宣告给对方。

第6步:r9删除了as_path中的sub-as信息之后,通过真正的ebgp连接宣告该前缀。

完成上述步骤之后,asn 123中的所有路由器都将学到前缀21.0.0.0/8,而且asn 678(对于本例来说就是r77)也将学到该相同前缀的路由,并且该路由工作正常,不存在路由黑洞问题。从asn 678的角度来看,它看到的路由实际上就是经asn 123和45的路由。需要注意的是,sub-as 65002和65003中的路由器不会将该前缀宣告回sub-as 65001,因为as 65001已经位于联盟as_path中了。

本例的sub-as 65001、65002、65003并不是随便选择的。asn 64512~65535属于私有asn,如果不需要将asn宣告给internet或其他自治系统,那么就可以使用这些私有asn。联盟使用了私有asn之后就可以避免如下问题:假如sub-as 65003使用的是asn 45,由于as_path环路校验会检查整个as_path,因而根本就无法将图1-8中的前缀宣告给sub-as 45,也就无法宣告给asn 678。使用私有asn就可以避免出现该问题。

联盟的技术要点如下。

sub-as内部必须建立全网状连接,这是因为sub-as内部需要满足所有的ibgp规则。

联盟ebgp连接在宣告ibgp路由的时候与常规ebgp连接完全相同(只要as_path校验结果显示该路由宣告不会产生环路即可)。

联盟ebgp连接在ttl(time to live,生存时间)的处理上也与常规ebgp连接完全相同,这是因为所有数据包都默认使用ttl 1(可以通过neighbor ebgp-multihop命令更改ttl)。

联盟ibgp连接在各种问题的处理上与常规ibgp连接完全一致,如默认不更改next_hop。

路由器基于最短as_path选择最佳路由时,联盟as不在as_path的长度计算之列。

由于联盟路由器会从发送到联盟外部的更新消息的as_path中删除联盟asn,因而其他路由器并不知道联盟的存在。

4.配置联盟

虽然只要在本章前面介绍过的命令之外增加少量命令即可完成联盟配置工作,但是将网络迁移到联盟机制却非常麻烦,这是因为此时不是在router bgp命令中配置真实的asn,而是在bgp子命令bgp confederation identifier中配置真实的asn,因而迁移过程会导致一条或多条路由不可用。表1-10列出了常见的联盟命令及其功能。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

例1-14给出了图1-9所示拓扑结构的简单配置示例。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表
《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

只有充当rr的路由器才使用修改后的操作规则,其他路由器(包括客户端与非客户端)甚至都不知道rr的存在,而且也不改变操作规则。表1-11列出了rr的操作规则,其操作规则与rr从哪种类型的bgp对等体收到前缀有关。表中列出了可以学习前缀的源端以及rr将前缀信息反射给哪些类型的路由器。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

有一种情况rr不会反射路由,即rr从非客户端路由器收到路由后,rr不会将该路由反射给其他非客户端。其原因在于rr与非客户端及ebgp邻居之间的操作规则完全遵从常规的ibgp对等体规则。也就是说,rr不会将学自ibgp的路由反射给其他非客户端ibgp对等体。rr操作规则差异与客户端何时向rr发送前缀或者rr何时决定将前缀反射给客户端有关。

一个(或多个)rr及其客户端可以组成一个rr簇(cluster),采用rr的bgp设计方案允许:

多个rr位于同一个rr簇中;

多个rr簇(虽然多个rr簇仅在拥有物理冗余时才有意义)。

在多簇场景下,每个簇至少要有一个rr必须与其他簇中的至少一个rr建立对等连接。通常在所有的rr之间都应建立直接对等连接,从而在所有的rr之间建立全网状的rr ibgp对等连接。此外,如果有些路由器是非客户端路由器,那么也必须将这些路由器包含在rr的全网状连接中(如图1-11所示)。图中的每台rr不但与其他簇中的rr建立了全网状连接,而且也与非客户端路由器建立了全网状连接。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

对比表1-11和图1-11后可以看出,这种设计方案不但可能存在路由环路,而且可能性非常大。不过,rr可以通过以下工具来有效防止路由环路。

cluster_list:rr在发送更新消息之前,会将自己的簇id添加到称为cluster_list的bgp pa中,因而rr收到更新消息之后,如果在其中发现了自己的簇id,那么就会丢弃接收到的前缀。与联盟的as_path相似,该特性可以帮助rr避免在簇之间产生环回宣告。

originator_id:该pa列出的是将路由宣告到as中的第一个ibgp对等体的rid。如果路由器在接收到的路由中发现originator_id是自己的bgp id,那么就不会使用或传播该路由。

仅宣告最佳路由:仅当rr认为指定路由是其bgp表中的“最佳”路由时,rr才反射该路由。该规则进一步限制了rr所要反射的路由(与联盟相比,该规则还有一个明显好处,那就是路由器一般只能看到较少的路由,特别是无用、冗余的路由)。

例1-15给出了一个使用rr的简单示例。该设计方案包括两个簇,有两个rr(r9和r2)和两个客户端(r1和r3)。此时的前缀传播过程如下(如图1-12所示)。

《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.4节构建IP路由表

第1步:r3通过ebgp从as 45(r4)学到前缀21.0.0.0/8。

第2步:r3通过ibgp将该前缀宣告给r2(使用标准规则)。

第3步:r2(rr)从rr客户端收到前缀之后,通过ibgp将该路由反射给r9(对r2来说是非客户端)。

第4步:r9(rr)从非客户端收到ibgp路由之后,将该路由反射给r1(其rr客户端)。

例1-15 as 123的rr配置:两个rr和两个客户端