3.3路由策略

Webster(韦伯斯特)大字典将策略(policy)一词定义为“涵盖了总体目标和可接受措施的高级的、全面的规划”。路由策略(routing policy)就是一种定义了路由器如何接受、如何宣告路由的规划。路由策略所涵盖的目标就是正确地转发或抑制IP包。可接受的措施意味着要以对路由器的CPU和内存资源影响最小、对所连接链路的带宽资源影响最小以及对邻居路由器的策略影响最小的方式来实施路由策略。


注意:请不要将本节及本章所用的术语路由策略(routing policy)与Cisco提供的策略路由(Policy Routes)功能相混淆。有关这些特殊静态路由(通过命令ip policy route-map来实现)的讨论请参见第14章。


路由策略非常重要,尤其在BGP环境中更是如此。从本质上来看,BGP用于互联自治系统,邻居自治系统可能并不受你的管理控制,这就需要非常细致地规划BGP路由策略,必须完全了解应该将哪些数据包转发给邻居、应该从邻居接受哪些数据包以及在什么情况下转发和接收这些数据包。制定了完整的路由规划之后,就需要设计完成这些路由策略的配置脚本,此时就需要彻底理解BGP的各种可用配置选项。实践证明,实验室在这个阶段非常有用,可以在将实施方案应用于生产性网络之前进行设计方案的测试并验证各种假设条件。只有在完全设计、理解和验证了配置方案之后,才能将其付诸于实施。

上述步骤中的任一个差错都会对互联网络产生非常严重的后果,引来用户、客户、服务提供商及管理层的不满。由于可能会破坏流量在Internet某些重要部分的转发,因而许多服务提供商都会停止与经常出现策略配置错误的客户建立BGP对等关系。被拒绝建立BGP对等关系所带来的经济影响将会非常严重(当客户本身也是一个服务提供商时尤其如此)。没有任何一种IP路由策略能提供与BGP相媲美的策略能力,但同时,也没有任何一种协议会带来像BGP一样严重的潜在后果。

本节将讨论各种可用的BGP路由策略配置选项,读者已经了解了一些用于配置路由策略的基础工具。如果学习过《TCP/IP路由技术(第一卷)》中此处的内容,那么就已经知道了如何配置IP路由协议以宣告选定的路由以及如何将路由从一个协议重分发到另一个协议,知道如何使用路由过滤器和路由映射,如何处理不同IP路由协议的管理性距离和度量值,知道 了有多条路径进出一个区域、一个路由域或一个AS时的潜在危险,以及如何避免这些潜在危险的一些基本策略。本节将会给出一些BGP特有工具的应用案例,如处理ORIGIN和 COMMUNITY属性以及过滤来自单个邻居的NLRI。

最后,出站路由宣告会影响入站流量,入站路由宣告会影响出站流量。因而在设计路由策略时,非常重要的一点是必须分别考虑要宣告的路由和要接收的路由,分别设计入站路由策略和出站路由策略。

3.3.1重置BGP连接

BGP发言者的配置发生变更后,通常都需要重置受影响的BGP连接,以便让配置变更生效。Cisco IOS Software Command Summary(软件命令汇总)列出了以下必须重置BGP连接的几种情况。

•增加或更改BGP相关的访问列表;

•更改BGP相关的权值;

•更改BGP相关的分发列表;

• BGP相关的定时器规约发生变化;

•更改BGP的管理性距离;

•更改BGP相关的路由映射。

上面列出的所有内容都会在一定程度上影响路由器的BGP路由策略,这也是需要重置BGP连接的缘由。无论是谁都不会希望自己所做的路由策略变更操作成为“空中楼阁”,不起作用。与其如此,还不如完全配置一个新的路由策略并实施该策略。但需要注意的是,如果允许每输入一条路由策略语句就即刻起作用的话,将会产生路由环路、黑洞路由或其他不期望的结果。

在Cisco IOS的Exec模式下,通过命令clear ip bgp可以重置BGP连接,可以将重置操作应用于指定邻居、对等体组或所有路由器邻居。如果要重置到某个指定邻居的BGP连接,必须要指定该邻居的IP地址。例如,如果要重置邻居192.168.1.253的BGP连接,那么就需要使用命令clear ip bgp 192.168.1.253;如果要重置名为subscribers的对等体组的全部成员的连接,那么就需要使用命令clear ip bgp subscribers;如果要重置某路由器的全部BGP连接,则可以使用命令clear ip bgp*。

在实际应用中,应该仅重置那些确实因配置变更而受影响的BGP连接。在重置连接时,会向其邻居发送一条Cease(终止)消息,以关闭BGP会话和TCP连接,使全部缓存均失效,之后再开始建立一个新的BGP连接。该进程启动后将会中断去往或来自该BGP连接的所有服务。在新配置仅影响一条或两条BGP的情况下,如果重置全部连接,将会给生成性网络带来非常严重的后果。

Cisco提供了一种软重配置(soft reconfiguration)机制,用于替代全部重置机制,软重配置机制不再拆除并重新建立TCP和BGP连接,而是仅触发更新操作以便让新的路由策略生效。软重置操作可以仅应用于出站策略或仅应用于入站策略,也可以同时应用于出站和入站策略;在变更后的策略仅影响出站流量时就可以使用出站软重配置,在变更后的策略仅影响入站流量时就可以使用入站软重配置。与“硬”重置相似,在软重置中也可以指定单个邻居、对等体组或全部BGP连接。

例如,假设在某台BGP路由器上更改了影响去往邻居192.168.1.253的流量的策略,为了触发应用于该邻居的新策略,应使用命令clear ip bgp 192.168.1.253 soft out。

当变更后的策略仅影响入站流量时可以使用入站软重配置。从Cisco IOS Software Release 12.1开始,全面支持入站路由的动态软重配置。但是在这之前的版本,在使用入站软重配置之前,必须首先在BGP配置中加入neighbor soft-reconfiguration inbound语句,之后再为每

个受到新入站策略影响的邻居应用clear ip bgp soft in命令。假设在图3-14的路由器Stowe上更改了入站路由策略,且该策略影响接收自邻居192.168.1.253的流量,那么就需要按照例3-77进行Stowe的BGP配置。

例3-77:配置某邻居进行软重配置。

img168

加入neighbor soft-reconfiguration inbound语句之后,路由器开始存储来自指定邻居的更新消息,这些更新不会受到现有入站策略的任何修改,以便让路由器能在触发软重配置之后正确应用这些新的入站路由策略。在按照例3-77为Stowe配置了新的入站路由策略之后,就可以在Exec模式下输入clear ip bgp 192.168.1.253 soft in命令,之后路由器就可以使用已存储的、未被修改的更新消息来实施新的入站路由策略。

也可以同时为入站策略和出站策略触发软重配置。例如,不带关键字inout的命令clear ip bgp 192.168.1.253 soft将向邻居192.168.1.253发送更新消息,并将入站策略应用于已存储的、来自于邻居的更新消息。

使用入站软重配置的一个明显缺点就是需要一定的内存来存储更新消息。如果邻居宣告了大量路由,或者要存储大量邻居发送来的更新消息,那么对本地路由器的内存消耗将非常大。因而需要采取一定的措施来避免这种内存负荷,当路由器的入站BGP路由策略发生变化后,其邻居将发送出站软重配置,正在从其邻居接收更新的本地路由器将应用新的入站路由策略。只有在无法从受影响的邻居发送出站软重配置或安排好已经发送了出站软重配置时,才应该使用入站软重配置。当路由策略发生变化后会影响很多邻居的流量,当必须将策略变更同时应用于所有邻居时,就需要使用入站软重配置。无论是哪种情况,都必须仔细权衡路由策略对本地路由器内存造成的影响。

3.3.2案例研究:通过NLRI过滤路由

路由过滤几乎是所有路由策略的核心,对入站和出站路由策略来说,最可能的就是要定义路由器应接受哪些路由和应宣告哪些路由。

BGP可用的第一个也是最简单的路由过滤器就是由distribute-list命令定义的路由过滤器。该路由过滤器是针对每个邻居或对等体组所定义的,并指向一个定义了前缀(路由过滤器将要作用的前缀)或NLRI的访问列表。

图3-15所示互联网络就是用来说明这个问题的,并给出了两个案例研究。

AS 50的IGP是RIP, AS 30的IGP是集成式IS-IS, AS 100和AS 200是转接AS,例3-78给出了图3-15中5台路由器的初始配置。

img169a

图3-15 AS 30多归属到不同的转接自治系统

例3-78:通过NLRI过滤路由——初始路由器配置。

img169b

img170

请注意,图3-15中显示的所有数据链路都没有IP地址。由于所有的BGP会话都是在路由器ID(由路由器的环回接口定义)之间定义的,因而数据链路地址与本例无关。这些配置 中的一个重点就是静态路由,将通过这些静态路由告诉路由器如何发现其邻居的路由器ID,如果没有静态路由,将无法建立BGP会话。


注意:为了更清楚地示范路由策略的应用情况,本案例研究以及后续的几个案例研究都使用了IGPBGP间的互重分发。此外需要注意的是,互重分发通常是一种不好的操作方式,尤其是当包含了很多前缀时,将BGP重分发到IGP中永远是不好的。


图3-15中的AS 30出于冗余性目的进行了多归属,但不应该成为转接AS,也就是说,AS 100和AS 200间的流量不应该通过AS 30进行传递。例3-79中Innsbruck的BGP表显示该路由策略并没有生效,Innsbruck显示去往AS 50中的目的地的某个下一跳路由器是Zermatt(172.30.255.254)。原因是Meribel将这些地址同时宣告给了Cervinia和Innsbruck, Cervinia将这些地址宣告给了Moritz,由Moritz将这些重分发到IS-IS中,之后Zermatt就从其AS 30中的IS-IS邻居学习到这些地址,并将这些地址重分发到BGP中,最后又宣告给Innsbruck。

例3-79:Innsbruck显示Zermatt是去往AS 50中目的地的一个可行下一跳。

img171

如果Innsbruck失去了与NAP的连接,那么将会把去往AS 50的数据包转发给Zermatt,使得AS 30成为转接AS。为了防止这种情形的发生,需要在Zermatt和Moritz上实施出站路由策略,仅允许宣告AS 30的内部地址。例3-80显示了Zermatt的BGP配置情况。

例3-80:在Zermatt上实施出站路由策略,仅允许宣告AS 30的内部地址。

img172a

上面仅显示了与本例相关的部分Zermatt配置数据。

除了所引用的邻居不同之外,Moritz的distribute-list配置与此完全一致。对这两台路由器来说,access-list 1都是允许所有内部路由,拒绝所有其他路由。

例3-79中的另一个问题是,Innsbruck列出的去往AS 50中目的地的下一跳不但有Meribel(10.50.250.1),也有Cervinia(10.200.60.1),这样一来Cervinia的BGP表中就存在了两个同样的表项,显示Meribel和Innsbruck是AS 50中地址的下一跳路由器。出现这个问题的原因是Innsbruck和Cervinia不但与Meribel建立了对等关系,而且它们之间也建立了对等关系。

这个问题并不会导致任何路由紊乱——因为Meribel撤销了一条路由之后,该撤销路由也将会在Innsbruck和Cervinia之间进行宣告。这个问题更多的是一个完美性与清晰性问题,无效路由根本就不应该存在于BGP表中。

为了解决这个问题,例3-81给出了Innsbruck的BGP配置情况。

例3-81:消除Innsbruck BGP配置中的冗余下一跳路由器。

img172b

Cervinia有一个与Innsbruck完全相同的路由过滤器,该过滤器阻塞了AS 50的地址在Innsbruck和Cervinia之间的BGP连接上进行宣告。本配置中的一个关注点就是访问列表的第3行,图3-15 显示子网172.29.2.0/24位于AS 50中,但访问列表却要过滤172.29.0.0。这是因为RIP(有类别协议)没有在Meribel上将该子网重分发到BGP中,而是将其汇总为一个主网地址。子网172.29.1.0/24位于AS 30中,而IS-IS是无类别协议,因而在Zermatt和Moritz上将该子网重分发到BGP中。由于访问列表中的第3行必须精确匹配到主网地址,因而Innsbruck的访问列表并没有起作用。

最后,例3-79显示AS 30中的某些地址(如192.168.100.0)正从Meribel被宣告给Innsbruck。这个问题与前一个问题类似,Cervinia将路由宣告给Meribel, Meribel又将这些路由宣告给了Innsbruck。例3-82显示的Innsbruck配置阻塞了来自Meribel的全部入站路由(AS 50的内部路由除外)。

例3-82:配置Innsbruck以阻塞来自Meribel的全部入站路由(AS 50的内部路由除外)。

img173a

例3-83显示了Innsbruck的BGP表情况。与例3-79中的BGP表相比较,可以欣喜地发现,BGP表已经变小了,也变得更有意义。

例3-83:增加了路由过滤器之后的Innsbruck的BGP表。

img173b

(待续)

img174a

3.3.3案例研究:通过AS_PATH过滤路由

在面对大量被宣告地址时,通过NLRI过滤将会显得非常笨拙或完全不适用。图3-15仅宣告了很少的地址,但前面的访问列表就已经显得有些冗长了。

前一小节的各个例子都有一个共同特点,那就是使用访问列表来标识单个AS中的全部地址。在这种情况下,与在访问列表中穷举每个内部地址相比,采取按AS号进行过滤的方式将更加简单。命令ip as-path access-list可以定义多种标识AS号的访问列表。命令neighbor distribute-list调用的是标识NLRI的访问列表,而命令neighbor filter-list调用的是AS_PATH访问列表。

AS_PATH访问列表使用了一种功能强大的被称为正则表达式(regular expressions或简写为regex)的文本解析工具。正则表达式通常用于Perl、Expect、awk、Tcl等编程语言以及搜索引擎和UNIX应用程序(如egrep)中,使用字符串(既可以是元字符,也可以是直接量)在文本中寻找匹配项。当应用于AS_PATH访问列表中时,正则表达式用于在BGP更新消息中的AS_PATH属性中寻找匹配项。

直接量(litera1)是用来描述匹配什么内容的正则字符,而元字符(metacharacter)则用于描述如何进行匹配。例如,regex^[4-7]表示匹配任何以数字4~7开头的文本串,在这个表达式中,4和7是直接量,元字符是^、[]和-。其中,插入记号(^)是一行的起始标志—— “字符串将以以下字符开始”;方括号([])表示一组被称为字符类别(character class)的字符——“任何位于方括号中的字符”;连字符(-)表示区间——“位于第一个直接量和最后一个直接量之间的任何连续值”。表3-1汇总了最常见的元字符。附录B中给出了一个简短的正则表达式使用方法教程,如果对正则表达式不熟悉,建议在继续学习本章内容之前先阅读附录B的相关内容。

其他元字符(以及表3-1所列的部分元字符)匹配的内容要多于它所指示的内容。为了简化起见,表3-1仅列出了与AS_PATH访问列表相关的元字符及其匹配内容。

表3-1与AS_PATH访问列表相关的正则表达式中的元字符

img174b

在前一小节中,路由器Zermatt和Moritz被配置为仅宣告去往AS 30内部地址的路由,其他路由均被过滤,以防止AS 100或AS 200试图将AS 30用作转接AS。为了实现该过滤器,需要在访问列表中分别列出AS 30中的全部地址。例3-84•给出的Zermatt配置中,利用了AS_PATH访问列表来实现前一小节案例研究中的相同目的。

例3-84:利用AS_PATH访问列表配置Zermatt,让其仅宣告去往AS 30内部地址的路由。

img175a

Moritz的配置文件中有一个完全相同的AS_PATH访问列表,此处的正则表达式使用了两个元字符——第一个元字符匹配行起始,第二个元字符匹配行结束。表达式中没有包含直接量。该正则表达式用于匹配不包含AS号的AS_PATH。如例3-85所示,Zermatt的BGP表中AS_PATH为空的路由就是目的地在AS 30内的路由,这些路由与AS_PATH列表语句相匹配,因而被允许。与其他访问列表相似,AS_PATH访问列表在最后也有隐含的”拒绝全部”之意,例3-85中的其他路由都与该隐式拒绝条件相匹配,因而不向外宣告。

例3-85:Zermatt的BGP表中AS_PATH为空的路由就是目的地在AS 30内的路由。

img175b

在前面的案例研究中,路由器Innsbruck和Cervinia在接收来自Meribel的路由时,仅接收被宣告地址位于AS 50内部的路由,此外,这两台路由器不应该相互宣告学习自Meribel的路由。例3-86给出了利用AS_PATH访问列表来实现同样目的的Innsbruck的配置情况。

例3-86:利用AS_PATH访问列表将Innsbruck配置成仅从Meribel接收被宣告地址位于AS 50内部的路由。

img175c

(待续)

img176a

access-list 1被应用于发送给Cervinia的出站更新消息。该访问列表的第一个语句拒绝AS_PATH中带有AS号50的所有更新消息,50前后的元字符确保仅匹配50,如果遗漏了元字符,那么该语句将不但匹配50,还会匹配500、5000、350等数字。正则表达式的第二个语句说明“匹配所有字符,匹配0或多个字符实例”,也就是说,匹配所有内容。这个正则表达式是“允许全部”版本的AS_PATH访问列表,这两行的意思是要求Innsbruck不向Cervinia宣告任何学习自Meribel的路由,但向其宣告其他路由。

access-list 2被应用于来自于Meribel的入站更新消息,该访问列表的第一个语句表示”匹配行起始,然后是50,最后是行结束”,换句话说,匹配那些只有AS号50的AS_PATH,这些路由都是被允许的。对Meribel所宣告的学习自其他AS的路由来说,它们的AS_PATH中不仅仅包含50,因而这些路由被该访问列表最后的隐式“拒绝”所拒绝。

对图3-15所示的拓扑结构来说,Cervinia的AS_PATH访问列表与Innsbruck相同。但是图3-16的拓扑结构做了一些修改,增加了AS 125,并充当AS 200和AS 50间的转接AS,如果Meribel与NAP间的连接出现故障,那么进/出AS 50的流量都要通过AS 125和AS 200进行转接。看一下前面例子中的AS_PATH访问列表,access-list 1拒绝AS_PATH中包含50的全部路由,这就包括了学习自Oberstdorf的去往AS 50的路由,该路由的AS_PATH为(125,50),因而Innsbruck无法从Cervinia学习这些路由,也就无法利用这些替代路由进入AS 50。

img176b

图3-16 AS 125提供了一个去往AS 50的可选路径

为了解决这个问题,例3-87给出了Cervinia的配置情况。

例3-87:配置Cervinia以便将AS 125作为去往AS 50的转接AS

img177a

如例3-87所示,access-list 1拒绝了仅包含AS号50的AS_PATH,而不是像前一个例子中那样拒绝所有包含AS号50的AS_PATH。这样一来,Cervinia直接学习自Meribel的路由都被拒绝了,而学习自Oberstdof的路由则都被允许了。

3.3.4案例研究:通过路由映射过滤路由

还可以利用路由映射来实现路由过滤器。路由映射既可以使用访问列表(通过NLRI进行过滤),也可以使用AS_PATH访问列表(通过AS_PATH属性进行过滤)。例3-88给出了图3-15中Zermatt的一种可能配置。

例3-88:利用路由映射来配置Zermatt进行路由过滤。

img177b

本例中的access-list 1与“通过NLRI过滤路由”案例研究中使用的访问列表一样,但那时的访问列表是通过命令neighbor distribute-list进行调用的,而本例中命令neighbor route-map将出站路由纳入名为Innsbruck的路由映射,再由该路由映射利用命令match ip address调用访问列表。该路由映射允许所有被访问列表所允许的路由,拒绝其他路由。

路由映射也可以调用AS_PATH访问列表,如例3-89所示的Zermatt的配置。

例3-89:Zermatt利用路由映射来调用AS_PATH访问列表。

img178a

例3-89中的Zermatt配置与其在例3-88中的配置基本差不多,惟一的区别就是使用了命令match as-path,而不再是match ip address。这里所说的AS_PATH访问列表与”通过AS_PATH过滤路由”案例研究中的AS_PATH访问列表完全一样,本例中允许AS_PATH属性为空的路由——即源自AS 30的路由,其他路由都被拒绝。

路由映射既可以过滤入站BGP更新,也可以过滤出站BGP更新。在前一个案例研究中,路由器Innsbruck过滤了来自Meribel的入站路由,仅接受AS_PATH属性为50且不包含其他AS号的路由。此外,Innsbruck还过滤了去往Cervinia的路由,仅允许AS_PATH中无AS 30的路由。例3-90显示了利用路由映射实现相同目的的Innsbruck的配置情况。

例3-90:Innsbruck利用路由映射进行路由过滤。

img178b

当需要在单台路由器上配置多个路由过滤器时,使用路由映射要比分发列表(distribute list)或过滤器列表(filter list)要有效得多。这是因为路由映射可以使用名字而不是数字,直观的名字会使配置工作变得简单,也更容易理解。在例3-88和例3-89中,名为Innsbruck的路由映射可以非常清楚地表示出该路由映射关心的是哪些邻居,而例3-90中的路由映射名字则表示出了通达这些邻居的路径。

但使用路由映射的主要原因不仅是其标识特殊路由的能力(利用match语句),还有其更改路由属性的能力(利用set语句)。后面的5个案例研究将示范如何使用路由映射来实现更为复杂的路由策略,这些案例研究将分别示范如何影响以下路由优先级的方法。

•单台路由器内(去往同一目的地的多条BGP路由)

•单台路由器内(去往同一目的地的多条来自不同路由协议的路由)

•本地自治系统内

•邻居自治系统内

•邻居自治系统之外的自治系统内

3.3.5案例研究:管理性权值

通常情况下,BGP路由器都会存在去往同一目的地的多条路由,虽然BGP有默认方法来选择这些路由,但实际情况中可能需要忽略这些默认方法并实施一定的路由策略。尽管RFC并没有提供如何影响单台路由的路由优先级的方法,但Cisco的IOS提供了这方面的方法。

Cisco提供的第一个专用工具就是管理性权值(administrative weight),每台路由器都被分配了一个权值,值在0~65 535之间。当存在去往同一目的地的多条路由时,路由器会优选权值最大的路由。在默认情况下,源自本路由器BGP路由的权值为32 768,而学习自其他邻居的BGP路由的权值为0。

当去往同一目的地存在多条路由时,管理性权值会忽略BGP决策进程中的其他因素;但管理性权值仅在本地有意义,也就是说,不会被宣告给邻居BGP发言者。因而,在某台路由器上为某条路由分配的权值不会影响该路由在其他路由器上的优先级。

如图3-17所示,改善了AS 30的连接关系,Zermatt和Moritz都双归至AS 100和AS 200,以提高冗余性,每台路由器都从Innsbruck和Cervinia收到了去往AS 50中目的地址的路由。第2章有关BGP决策进程的讨论中谈到,当在多条去往统一目的地的多条路径中选择优选路径时,如果所有属性都相等,那么BGP将选择来自路由器ID最小的邻居的路由。这也意味着图3-17中的Zermatt和Moritz将使用Innsbruck来到达AS 50中的目的地,这是因为Innsbruck的路由器ID小于Cervinia,如例3-91输出结果所示。Zermatt和Moritz的BGP表显示可以通过Innsbruck(10.100.83.1)或Cervinia(10.200.60.1)到达AS 50中的目的地,由于Innsbruck的路由器ID小于Cervinia,因而Zermatt和Moritz都将来自Innsbruck的路由标记为最佳路由。

img179

图3-17 Zermatt和Moritz都部署了多归属连接,以提高冗余性

例3-91:图3-17中的Zermatt和Moritz的BGP表。

img180

为了使流量更加均衡,Zermatt应该使用与Innsbruk间的链路去往AS 50,将与Cervinia间的链路作为备份;而Moritz则应该使用与Cervinia间的链路去往AS 50,将与Innsbruk间的链路作为备份。这两台路由器都通过控制路由的权值来实施该路由策略,如例3-92所示。

例3-92:通过控制路由权值来让Zermatt和Moritz遵循既定的路由策略。

img181a

例3-92中的配置使用了命令neighbor weight,该命令根据宣告路由的邻居为路由分配不同的权值。Zermatt为学习自Innsbruck(10.100.83.1)的路由分配了权值50 000,为学习自Cervinia(10.200.60.1)的路由分配了权值20 000,而Moritz则正好相反。这样一来,这两台路由器将优选权值较大的路由,在优选路由失效后将使用备选路径,如例3-93输出结果所示。

例3-93:Zermatt和Moritz将权值最大的路由指派为“最佳”路由,而本地发起的路由的权值仍为默认的32 768。

img181b

(待续)

img182a

如果学习自某个邻居的所有路由的权值均一样,那么命令neighbor weight将非常有用。但有时必须为来自同一邻居的不同路由设置不同的权值,实现该路由策略的一种方式是利用命令neighbor filter-list weight,与命令neighbor filter-list用于路由过滤相似,该命令将调用一个AS_PATH访问列表,以根据AS_PATH属性来标识路由。虽然一个邻居最多可以有一个neighbor filter-list in和一个neighbor filter-list out命令,但命令neighbor filter-list weight的多个实例可能会被分配给单个邻居。可以为命令neighbor filter-listneighbor filter-list weight配置相同的邻居,虽然这两个命令看起来十分相似,但它们的作用和效果却相差甚远。

图3-18给出的拓扑结构与例3-17相似,但增加了其他AS连接到NAP上。Innsbruck和Cervinia都将来自AS 50和AS 75的路由宣告给了Zermatt和Moritz.,此时建立了一个新的路由策略,要求Moritz使用Cervinia去往AS 75中的目的地,而使用Innsbruck去往AS 50中的目的地。

img182b

图3-18将AS 75连接到NAP

例3-94显示了利用命令neighbor filter-list weight配置Moritz的情况。

例3-94:通过命令neighbor filter-list weight配置Moritz优选Cervinia作为去往AS 75的下一跳路由器。

img183a

access-list-2中的正则表达式_75$标识的是以75结尾的AS_PATH的路由,将匹配路径(100,75)和(200,75)。与此类似,access-list-3将匹配以50结尾的AS_PATH的路径。在Innsbruck(10.100.83.1)的邻居配置中,将去往AS 75的路由的权值设置为40 000,而将去往AS 50的路由的权值设置为60 000。在Cervinia(10.200.60.1)的邻居配置中,将去往AS 75的路由的权值设置为60 000,而将去往AS 50的路由的权值设置为40 000。例3-95显示了Moritz的BGP表情况。

例3-95:Cervinia是去往AS 75的优选下一跳路由器,Innsbruck是去往AS 50的优选下一跳路由器。

img183b

(待续)

img184a

如果在同一个邻居配置中同时使用了命令neighbor weightneighbor filter-list weight,命令neighbor filter-list weight将具有优先权。如果没有用命令neighbor filterlist weight为来自对等体的路由设置权值,则将用命令neighbor weight来设置权值。

此外,还可以通过命令neighbor route-map来控制路由权值。例3-96显示了利用路由映射配置Moritz的情况,可以达到与例3-94相同的效果。

例3-96:通过路由映射配置Moritz,将Cervinia作为去往AS 75的优选下一跳路由器。

img184b

当利用路由映射设置权值时,只能匹配AS_PATH;无法利用命令match ip address来匹配单个IP地址。与命令neighbor filter-list weightneighbor weight一样,还可以在同一个邻居配置中使用weight-setting路由映射,但weight-setting路由映射的优先级要高于这两个命令。

3.3.6案例研究:管理性距离和后门路由

Cisco提供的另一个控制单台路由器上路由优先级的专用工具就是管理性距离(administrative distance)。管理性权值是对学习自不同BGP对等体的去往同一目的地的所有路由进行路由优先级的控制,而管理性距离则是对学习自不同路由协议的去往同一目的地的所有路由进行路由优先级的控制。也就是说,管理性权值的控制效果体现在BGP表中,而管理性距离的控制效果体现在IP路由表中。

通常情况下,根据路由所来自的协议或源来为路由分配管理性距离,距离越短,表示该路由越优。表3-2显示了不同协议的管理性距离。可以看出,在一个AS内,如果路由器从RIP和OSPF学习到了去往同一目的地的不同路由,那么将优选OSPF路由,这是因为OSPF的管理性距离(110)小于RIP路由的管理性距离(120)。

img185


注意:当静态路由引用的是接口而不是下一跳地址时,则认为该目的地是一个直连网络。


EBGP的管理性距离为20,小于所有的IGP距离。这看起来似乎对图3-18所示的互联网络产生一定的问题,当Zermatt将AS 30的某个内部地址宣告给Innsbruck时,该地址被传递给Cervinia,之后又会被Cervinia传递回Moritz。由于Moritz是通过EBGP学习到该路由的,因而优选的将是来自EBGP的路由,而不是来自IS-IS的路由(因为IS-IS路由的距离为115)。不过事实上,由于有BGP环路避免机制,因而不会发生这个问题。Moritz在来自Cervinia的路由的AS_PATH中发现了AS号30,因而将丢弃该路由。

另一方面,IBGP不会将AS号加入到AS_PATH中,因而当某条路由学习自IGP之后又通过IBGP对等体在AS内进行传递时,将会产生路由环路或黑洞路由。因而将IBGP路由的距离设置为200,高于所有的IGP路由,对去往同一目的地的路由来说,学习自IGP的路由的优先级总是高于IBGP路由。

本地(local)BGP路由是指那些因使用了BGPnetwork命令而源自本地路由器的路由。与IBGP路由一样,这些路由的管理性距离也为200,因而优先级也低于所有的IGP路由。

《TCP/IP路由技术(第一卷)》第13章中给出了一个案例研究,说明了如何控制IGP路由的默认距离,如果希望更改BGP路由的默认距离,需要使用命令distance bgp,该命令可以分别设置EBGP、IBGP和本地BGP路由的距离。例3-97中的配置将IBGP路由的距离更改为95,使得IBGP路由的优先级高于所有去往同一目的地的IGP路由(EIGRP路由除外)。

例3-97:将IBGP路由的距离更改为95,使得IBGP路由的优先级高于所有去往同一目的地的IGP路由(EIGRP路由除外)。

img186a

与IGP不同,一般很少会有好的理由来更改所有BGP路由的默认距离,但是在某些情况下,需要更改某些BGP路由的默认距离。如图3-19所示,在路由器Meribel和Lillehammer间增加了一条专用链路,路由器在该链路上运行RIP,该链路被称为后门(back door)。也就是说,AS 50和AS 75之间的某些流量需要通过该专用后门路由(而不是公用NAP)进行传递,原因可能是AS 50和AS 75之间拥有商业合作关系,希望他们之间的通信通过专用链路进行疏导,而不是通过公用Internet进行疏导。

img186b

图3-19在AS 50和AS 75之间增加了一条专用后门链路,允许这两个自治系统的IGP进程进行直接通信,而不是通过EBGP会话进行通信

在这个例子中,AS 50中的172.17.0.0与AS 75中的172.18.0.0之间的流量应使用该后门链路,只有当后门路由失效时才使用NAP路由。问题的关键是管理性距离,例如,Lillehammer从Meribel学习到的去往172.17.0.0的路由,一种是通过RIP在后门链路上学习到该路由,另一种是通过BGP在NAP链路上学习到该路由。EBGP路由的距离是20,而RIP路由的距离是120,因而优选EBGP路由,如例3-98输出结果所示。

例3-98:Lillehammer通过RIP和EBGP学习到去往172.17.0.0的路由,由于EBGP路由的管理性权值为20,因而优选该路由。

img186c

(待续)

img187a

一个解决办法就是使用BGPnetowrk命令,如例3-99所示。

例3-99:使用netowrk命令将学习自EBGP的路由当作本地BGP路由。

img187b

在例3-99所示配置中,命令network将学习自EBGP的路由视为了本地BGP路由。例如,网络172.17.0.0通过EBGP被宣告给了Lillehammer,并进入了路由表。虽然172.17.0.0并不是一条真正的本地路由,但仍将命令network 172.17.0.0加入到了Lillehammer的BGP配置之中,由于该地址位于路由表中,因而命令netowrk与其相匹配,并将该路由设置为本地路由。

这个逻辑看起来似乎有些奇怪,但却十分有效。172.17.0.0最初是一条EBGP路由,后来被netowrk命令更改成了一条本地BGP路由。由于去往172.17.0.0的EBGP路由已经被Lillehammer视为一条本地BGP路由,并被分配了管理性距离200,而此时去往172.17.0.0的RIP路由的管理性距离将小于本地BGP路由,因而将成为优选路由,如例3-100输出结果所示。

例3-100:通过让Lillehammer将去往172.17.0.0的EBGP路由视为一条管理性距离为200的本地BGP路由,使得往该网络的RIP路由成为优选路由。

img188

虽然正确控制了管理性距离,但本配置仍有问题。通过network命令将EBGP路由转换为本地路由,那么本地BGP路由器将在其EBGP更新中宣告该路由。例如,Lillehammer将在其EBGP更新中通过NAP向其对等体宣告172.17.0.0。由于Meribel的BGP进程是从重分发中学习到去往172.17.0.0的路由,因而宣告该路由时携带ORIGIN为Incomplete(不完全的)属性。但是,由于配置了network语句,因而Lillehammer宣告该路由时携带的ORIGIN属性为IGP,这样一来,Cervinia和Innsbruck选择Lillehammer为去往172.17.0.0的下一跳路由器,如例3-101所示。去往172.17.0.0的外部流量就被转发到Lillehammer,而Lillehammer又通过后门链路转发这些流量。但是,实际上仅希望172.17.0.0和172.18.0.0之间的流量通过后门链路进行转发,其他流量还是使用NAP进行转发。

例3-101:Cervinia的BGP表显示Lillehammer(10.75.100.1)为去往网络172.17.0.0的最佳下一跳,导致Lillehammer与Meribel间的后门链路成为所有去往172.17.0.0的外部流量的转接网络。

img189a

例3-102显示了利用命令network backdoor解决该问题的方法,该命令是Cisco提供的另一个专用工具。

例3-102:限制外部流量流经Lillehammer与Meribel间的后门链路。

img189b

命令network backdoor与命令network的效果相同:EBGP路由被视为本地BGP路由,而且管理性距离被更改为200。两者的区别是命令network backdoor所指定的地址没有被宣告给EBGP对等体。对网络172.17.0.0来说,新配置在Lillehammer中生成了相同的路由表(如例3-100所示),但Cervinia的BGP中却不再包含学习自Lillehammer的去往该网络的路由。

3.3.7案例研究:使用LOCAL_PREF属性

LOCAL_PREF属性被用于在去往同一目的地的多条路由中设置路由优先级,与管理性权值不同,LOCAL_PREF并不是限制单台路由器,而是在IBGP对等体之间进行传递。LOCAL_PREF属性不会应用于EBGP对等体之间——因为其名字就是本地优先级。

路由器的LOCAL_PREF属性取值范围在0~4 294 967 295之间,值越大,表面该路由越优。在默认情况下,所有被宣告给IBGP对等体的LOCAL_PREF属性值都是100。利用命令ip default local-preference可以更改LOCAL_PREF属性的默认值,利用路由映射和命令set local-preference可以更改单条路由的LOCAL_PREF属性值。

在图3-20中,AS 30被多归属到单一AS上,为了实现冗余性,在Zermatt与Moritz之间以及Innsbruck与Saalbach之间增加了链路,并且在这些链路上均运行了IBGP。

img190a

图3-20 AS 30被多归属到单一AS上

AS 30的路由策略要求所有去往AS 75的出站流量都必须使用Moritz-Saalbach间链路,所有去往AS 50的出站流量都必须使用Zermatt-Innsbruck间链路,只有在优选链路不可用时,才可以使用另一条链路。例3-103显示了Zermatt和Moritz的配置情况。

例3-103:利用LOCAL_PREF属性影响路由优先级。

img190b

(待续)

img191

每台路由器都将来自EBGP对等体的入站路由链接到名为PREF的路由映射上,该路由映射中的序列10标识入站路由的AS_PATH。Zermatt的AS_PATH以50结尾,因而入站路由的LOCAL_PREF为200;Moritz的AS_PATH以75结尾,因而入站路由的LOCAL_PREF为300;而所有不与序列10相匹配的路由都被序列20所允许,从而得到默认值100。


注意:在实际中,两台路由器可能会分配相同的LOCAL_PREF值。本例中使用不同的LOCAL_PREF值,是为了更清楚地观察每个路由映射的影响。


例3-104显示了这两台路由器的BGP表情况。

例3-104:Zermatt为去往AS 50中目的地的路由LOCAL_PREF分配数值100, Moritz为去往AS 75中目的地的路由LOCAL_PREF分配数值300。

img192

(待续)

img193a

请注意,例3-103中的配置与早先案例中的IS-IS配置之间存在很重要的区别。本例中的BGP路由并没有被分发到IS-IS域,相反,每台路由器都宣告了一条默认地址。当向某个外部目的地发送流量时,内部路由器将把数据包转发到最近的默认地址——Zermatt或Innsbruck,之后再由这些路由器依据外部路由的LOCAL_PREF属性,将数据包转发给各自的EBGP对等体或者通过冗余链路转发给各自的IBGP对等体。

不将BGP重分发到IS-IS中并不是一时兴起,对本例的拓扑结构和路由策略来说是必需的。例如,如果Moritz将去往172.17.0.0的EBGP路由重分发到IS-IS,那么该路由将通过IS-IS域重分发给Zermatt, Zermatt接受该路由后又再次重分发回BGP,并进入其BGP表中。由于Zermatt将该路由加入到其BGP表中,因而该路由被认为是本地发起的路由,相应的权值为32 768。管理性权值要优先于LOCAL_PREF,因而Zermatt将通过IS-IS域去往172.17.0.0的路由视为最佳路由,而不是通过直连链路去往Moritz。

3.3.8案例研究:使用MULTI_EXIT_DISC属性

MULTI_EXIT_DISC(即MED)属性用于影响邻居自治系统中的路由决策,MED被称为外部度量值(external metric),并且在BGP表中被标记为“度量值”。与LOCAL_PREF相似,MED是一个4个(8位组)数值,因而取值范围为0〜4 294 967 925。

当BGP发言者从对等体学习到路由后,可以将该路由的MED传递给任意IBGP对等体,但不会传递给EBGP对等体,因而MED仅在邻居自治系统之间具有相关性。如果图3-20中的路由器Zermatt向Innsbruck宣告携带了某MED值的路由172.16.0.0,Innsbruck可以将该MED值再宣告给Saalbach;但是当Innsbruck和Saalbach将该路由宣告给AS 50和AS 75中的EBGP对等体时,则无法在路由中携带MED。

MED是一个相对比较弱的属性,在BGP决策进程中,在去往同一目的地的多条路由中进行决策时,权值、LOCAL_PREF和AS_PATH长度以及ORIGIN都优先于MED,但是当这些变量均相同时,将选择MED值最小的路由。


提示:读者可能会感到有些糊涂了,不过一定要记住,优选LOCAL_PREF值最大的路由,而优选MED值最小的路由。MED的另一个术语是度量值(metric),而度量值的另一个术语是距离(distance),因而只要记住“最高的优先级、最短的距离”即可。


可以在路由映射下使用命令set metric来控制MED属性。如图3-20所示,AS 30希望AS 100通过Saalbach-Moritz链路向网络172.16.0.0发送入站流量,通过Innsbruck-Zermatt链路向网络172.31.0.0发送流量,而AS 100则可以通过任一条链路发送其他流量。例3-105显示了Zermatt和Moritz的配置情况。

例3-105:配置Zermatt和Moritz以控制MED属性。

img193b

(待续)

img194

每台路由器都将去往EBGP对等体的出站路由链接到名为MED的路由映射上,该路由映射中的序列10调用access-list 1并分配了一个MED值,以匹配相应的路由。Zermatt为去往172.31.0.0的路由分配的MED值为100,Moritz为去往172.16.0.0的路由分配的MED值为100,任何不与序列10中的访问列表相匹配的路由都被序列20所允许,并且分配的MED值为200。例3-106显示了Innsbruck的BGP表情况。

通常情况下,只有当去往同一目的地的多条路由均源自同一AS时,才比较这些路由的MED值。这是因为MED的作用就是在去往邻居AS存在多条链路时,允许AS为入站流量传达其优先级。通常来说,比较两个不同自治系统的优先级毫无意义,但是在某些特定场合下却另当别论。

例3-106:基于不同路径的度量值,Innsbruck将去往172.16.0.0的数据包转发给Saalbach(10.100.65.1),将去往172.31.0.0的数据包转发给Zermatt(172.30.255.254)。

img195a

图3-21给出的AS 50和AS 75之间存在一条后门链路。与“管理性距离和后门路由”案例研究类似,网络172.17.0.0和172.18.0.0都被RIP经后门链路对外进行宣告,并用于这两个自治系统间的专用通信。

img195b

图3-21应该将AS 50和AS 75间的后门路由也作为备用路由

由于使用了命令network backdoor,因而AS 75不再宣告172.17.0.0, AS 50也不再宣告172.18.0.0,但是在这个例子中,AS 50和AS 75希望AS 100中的路由器使用后门链路作为备用路由。例如,当Meribel去往NAP的接口失效时,Innsbruck和Saalbach应该将去往172.17.0.0的数据包转发给Lillehammer,再经后门链路转发给AS 50。这就需要Meribel和Lillehammer向外宣告不存在于其AS中的路由,并明确将这些路由标识为备用路由。在这种情况下,由于去往同一目的地的路由都是源自不同自治系统中的路由器,因而比较这些不同自治系统的MED值就显得很有意义了。

有两个命令与图3-21的应用场景相关。第一个命令是set metric-type internal,该命令 被用作路由映射的一部分,用于将BGP路由的MED设置为与去往同一目的地的IGP路由的度量值一致。例如,Meribel去往172.17.0.0的RIP路由是一跳,Lillehammer去往同一目的地的RIP路由(学习自后门链路)是两跳。命令set metric-type internal可以让这些路由器的BGP路由在宣告网络时继承这些度量值,因而AS 100中的路由器将优选Meribel的路由(因为其MED为1),而不是Lillehammer去往同一目的地的路由(因为其MED为2)。

第二个相关命令用于接收端(即图3-21中AS 100中的路由器),命令bgp always-compare-med的作用是让路由器比较去往同一目的地的多条路由(即便这些路由源自不同的自治系统)的MED值。例3-107示范了如何使用这两个命令来配置Meribel、Lillehammer和Saalbach。

例3-107:配置图3-21中的Meribel、Lillehammer和Saalbach,以便让Saalbach比较来自不同自治系统的MED值。

img196

(待续)

img197a

请注意,在Meribel的配置文件中,虽然网络172.17.0.0被重分发到了BGP中,但仍然对该网络使用了network语句。由于network语句被用于Lillehammer上的路由,因而需要利用该语句将ORIGN属性确定为IGP,如果没有该语句,则来自Meribel的该路由的ORIGIN属性将为Incomplete(不完全的)。在BGP决策进程中,ORIGIN的优先级要高于MED,这就意味着虽然Lillehammer路由的MED值较大,但仍然会成为AS 100的优选路由。

Meribel配置中另一个重要细节是过滤来自路由器Lillehammer的入站NLRI的分发列表,该过滤器允许去往192.168.75.0和172.18.0.0的路由,并拒绝所有其他路由。尤为重要的一个事实是,由Lillehammer宣告的去往172.17.0.0的路由被该过滤器拒绝了,否则,管理性权值为20的该EBGP路由将优先于Meribel的RIP路由,从而产生路由环路。

例3-108给出了Saalbach的BGP情况,Meribel去往172.17.0.0的路由(MED为1)优于Lillehammer的路由(MED为2)。由于172.18.0.0直连在Lillehammer之上,因而相应的本地度量值和MED均为0。之后通过RIP将该路由宣告给了Meribel,在路由器Meribel上的本地度量值为1,这同时也反应在Meribel的路由的MED中。当任一条优选路由失效后,将选择备用路由,去往该目的地的流量也将使用后门链路。

例3-108:去往172.17.0.0和172.18.0.0的路由的MED与AS 50和AS 75的内部RIP度量值相匹配。

img197b

(待续)

img198a

3.3.9案例研究:预附加AS_PATH

MULTI_EXIT_DISC属性会影响来自邻居自治系统的入站流量,但无法影响更远端的自治系统的路由决策。

图3-22再次给出了在前面案例研究中已经遇到过的拓扑结构。研究一下例3-109中的Meribel的BGP表,可以发现路由器Meribel拥有两条去往AS 30中同一目的地的重复等价路径。由于这两条路径的所有其他属性值均完全一样,且Innsbruck的路由器ID比较低,因而Meribel的BGP决策进程选择Innsbruck作为去往AS 30的全部流量的下一跳路由器。如此一来,AS 50去往AS 30的流量根本就不会使用Cervinia-Moritz间的链路,从而导致该可用带宽的利用率极低。

img198b

图3-22 AS 50与AS 30之间存在两条等价路径

例3-109:Meribel的BGP显示去往AS 30中的目的地存在两条路径。由于Innsbruck的路由器ID(10.100.83.1)小于Cervinia的路由器ID(10.200.60.1),因而被选择为所有流量的最佳路径。

img199a

由于AS 30与AS 50不是直接相连的邻居自治系统,因而AS 30无法利用MED来影响AS 50的路由决策,但是通过命令set as-path prepend修改所宣告路由的AS_PATH属性之后,AS 30就可以影响AS 50的路由决策了。假设AS 30希望AS 50将所有去往172.16.0.0和172.31.0.0的流量都转发到Cervinia,并将所有去往10.30.0.0、172.29.1.0/24和192.168.100.0的流量都转发到Innsbruck。例3-110给出了Zermatt和Moritz的配置情况。

例3-110:配置Zermatt和Moritz以预附加AS_PATH。

img199b

(待续)

img200a

每台路由器都通过名为PATH的路由映射来过滤出站数据包。路由映射中的语句10使用access-list 3来标识特定路由(通过NLRI),以匹配那些在AS_PATH中增加了AS号30的路由。请注意,此处所说的AS号30是在正常加入AS_PATH的AS 30之外额外加入的。路由映射的语句20允许所有与access-list 3不匹配的路由。

例3-111显示了Meribel上的BGP表情况,可以看出预附加后的路由要比来自优选路径的路由长,而路由器将选择AS_PATH较短的路由。

例3-111:Meribel的BGP显示了来自Zermatt和Moritz的预附加AS_PATH,路由器将选择AS_PATH较短的路由。

img200b

(待续)

img201a

在使用AS_PATH预附加策略时需要特别谨慎,如果不能完全了解所做配置的影响,则将可能会出现无法预料或蹩脚的路由选择结果。例如,假设在Moeritz的配置中应用了命令set as-path prepend 30 30,该命令在AS_PATH中增加了两个AS号为30的实例(而不是一个实例)。检查一下该命令对去往10.30.0.0的路由所产生的影响,图3-22中的Cervinia从Moritz接收到一条携带了AS_PATH为(30,30,30)的路由,从Meribel接收到一条去往同一目的地但携带了AS_PATH为(50,100,30)的路由,由于这两条路由的AS_PATH长度完全一样,所以Cervinia将选择下一跳地址较小的路由,即来自Meribel的路由。原来的目的是希望仅影响AS 50的路由选择,但这种配置却导致AS 200也选择了较长路径去往目的地。

另一个需要注意的是,在预附加AS_PATH时应该总是使用被预附加路由器的AS号。如果使用了其他AS号,而该AS号又被某AS所使用,那么该路由被宣告给这个AS时,这个AS将不接收该路由。

3.3.10案例研究:路由标记

可以将路由标记字段理解为路由选择更新消息中用于跨越路由域来传送信息的“口袋”。标记所表示的信息与路由协议本身无关,路由协议也不会对标记做任何操作。当路由从协议A被重分发到协议B,然后又从其他点被重分发回协议A时,标记将十分有用。转接路由协议更新消息中的标记字段允许协议A在转接路由域的另一侧向其对等体发送信息,通常该信息对转接路由协议来说是前后矛盾或没有任何意义的。

RIP-2、EIGRP、集成式IS-IS、OSPF和BGP都支持路由标记,RIP-1和IGRP不支持路由标记。《TCP/IP路由技术(第一卷)》的第14章介绍了路由标记,并给出了一些应用示例,而本案例研究将集中阐述BGP环境中的路由标记应用策略。

图3-23给出了一个路由标记非常有用的应用场景。AS 1300为多个自治系统间的流量提供转接功能,3个外层自治系统的每条路由都通过EBGP被宣告给了AS 1300中的3台边界路由器中的某一台,之后这些路由被重分发到OSPF中,接着又在其他两台边界路由器上被重分发回了BGP,然后又被宣告给了它们的EBGP对等体。

img201b

图3-23 AS1300是其他3个自治系统的转接AS


注意:本应用场景所描述的配置情况(将BGP重分发到IGP中)可能会应用于某些大型企业网,但是正如本章反复声明的那样,不应该在服务提供商的AS中或拥有大量BGP前缀的AS中将BGP重分发到IGP中。


图3-23所示拓扑结构的问题是,3个外层自治系统的BGP进程必须通过OSPF来共享路由信息,而OSPF却不了解BGP的路径属性,因而将丢失所有的路径信息。例3-112显示了路由器Turoa的BGP情况,可以看出,所有的路由看起来都似乎源自AS 1300。如果AS 1400有一条可选路径去往AS 1100或AS 1200,但是由于该信息已被丢失,因而将无法做出准确的路由决策。

例3-112:来自AS 1100和AS 1200的路由AS_PATH信息在穿越AS 1300中的OSPF域时都丢失了,因而所有学习自AS 1300的路由似乎都源自AS 1300。

img202a

BGP可以利用OSPF包中的路由标记在穿越OSPF域时携带AS_PATH信息。实际上,Cisco的BGP实现自动完成了该功能。例3-113给出了去往192.168.1.0(位于AS 1200中)的Zao的路由细节(穿越OSPF域),请注意查看被标记为1200的标记字段。

例3-113:当路由器Naeba将其去往192.168.1.0的EBGP路由重分发到OSPF时,将路由的AS_PATH信息写进OSPF AS-External LSA的外部路由标记字段,可以看到该标记存在于OSPF域另一侧的路由器Zao的路由表项中。

img202b

请参考《TCP/IP路由技术(第一卷)》第9章,以了解OSPF AS-External LSA的详细格式及使用方式。

但是,当IGP路由被重分发到BGP中时,BGP进程并不能自动假定IGP的路由标记字段中包含了AS_PATH信息,因而必须配置BGP进程来恢复AS_PATH信息。一种从重分发路由中恢复AS_PATH信息的方法是使用命令set as-path tag,例3-114示范了如何使用命令set as-path tag来配置路由器Zao。

BGP配置中的语句redistribute ospf调用了名为GET_TAG的路由映射,该路由映射将重分发后的路由的AS_PATH属性设置为OSPF标记字段中的值。例3-115显示了该配置结果,现在Turoa的BGP表中已经包含了去往AS 1100和AS 1200中路由的准确的AS_PATH信息。

例3-114:配置Zao从重分发路由中恢复AS_PATH信息。

img203a

例3-115:Turoa的BGP表中包含了准确的AS_PATH信息。

img203b

Zao利用命令set as-path tag从OSPF标记字段中拾取AS_PATH信息时,无需配置Happo或Naeba,但是自动进入标记字段的惟一信息只有AS_PATH。请注意,在例3-115中,来自AS 1100和AS 1200的路由的ORIGIN属性都被标记为Incomplete(不完全的)。路由器Thredbo和Yangii使用BGPnetwork命令来宣告ORIGIN属性为IGP的内部路由,但是由于Happo和Neaba并没有将该信息加入到OSPF标记字段中,因而Turoa看见的ORIGIN代码将是Incomplete(不完全的),从而路由器Zao将会把该路由从OSPF重分发到BGP中。

这是否是一个问题,与Turoa是否有备用路径去往AS 1100和AS 1200有关,并且与路由的ORIGIN属性是否影响BGP决策进程有关。Cisco还提供了一种可选的配置方式,被称为自动标记(automatic tag),该功能不但加入AS_PATH信息,还加入ORIGIN代码。自动标记是由命令set automatic-tag完成的,由命令table-map从BGP进程中调用包含该命令的路由映射。与命令set as-path tag(该命令应用于将路由从IGP重分发到BGP中的路由器)不同,命令set automatic-tag应用于将路由从BGP重分发到IGP中的路由器。

图3-23中的3台AS 1300路由器将被配置成一致,以设置自动标记。例3-116显示了路由器Naeba的配置情况。

例3-116:配置Naeba以加入AS_PATH信息和ORIGIN代码。

img203c

(待续)

img204a

例3-117显示了Turoa的BGP表情况,可以看出该BGP表几乎与例3-115中的表完全相同,只不过现在来自AS 1100和AS 1200的路由已经能正确地反应IGP的ORIGIN属性了。

路由标记的另一种用途是标识一定的路由组,可能是用于路由过滤。在图3-23中,路由器Naeba和Happo可能被配置成在将EBGP路由重分发到OSPF之前,标记这些EBGP路由的某些子网,之后Zao(从OSPF域中检索这些路由)就可以通过它们的公共标记(而无需再通过NLRI进行路由过滤)来识别这些路由。第2章曾经说过,BGP COMMUNITY属性也被设计用来标识公共路由组中的路由,但是,在图3-23所示拓扑结构中,无法穿越OSPF域传达COMMUNITY属性。有关使用路由标记完成此功能的案例请参见《TCP/IP路由技术(第一卷)》第14章中的“案例研究:路由标记”。

最后,可以仅在将IGP重分发到BGP中时使用路由标记。使用了network命令之后,BGP路由被认为是源自本地路由器,因而不会继承IGP路由的任何属性(包括标记在内)。

例3-117:Turoa的BGP表中不但包含了正确的AS_PATH信息,也包含了正确的ORIGIN代码。

img204b

3.3.11案例研究:路由阻尼

如第2章所述,路由阻尼是一种为翻动路由分配惩罚值的进程。当某路由的惩罚值在一定时期内累积到一定程度后,将抑制该路由,也就是说,不再宣告该路由。在默认情况下,路由每发生一次翻动,就要被分配惩罚值1 000,当路由的惩罚值累积超过2 000后,就会被抑制,直至惩罚值降低到750以下。惩罚值的上限和下限阈值分别被称为抑制门限(suppress limit)和重用门限(reuse limit)。累积的惩罚值每5s减少一次,并以某种速率(如15分钟)降低到一半,该速率是一种指数函数,通常被称为半衰期(half-life)。如果惩罚值是3 000,那么经过15分钟后将减小到1 500;如果惩罚值是300,那么15分钟后将减小到150。此外, 路由在经过一个被称为最大抑制门限(maximum suppress limit)的最长时间之后也能被抑制,通常该时间是半衰期的4倍,即60分钟。

在BGP进程配置中,可以使用命令bgp dampening来启用路由阻尼机制,如果希望更改默认值,可以使用bgp dampening halflife reuse suppress max-suppress。

在图3-24所示的拓扑结构中,路由器Colorado被归属到5个其他自治系统,如果远程自治系统宣告的路由出现翻动现象,那么Colorado必须将该变化情况宣告给所有EBGP对等体。虽然这对本例所示的拓扑结构不会造成很严重的负担,但是假想一下,如果Colorado有150个EBGP对等体(而不是图中所示的5个)时,将会产生什么样的后果?任何一次普通的路由翻动都会给中心路由器造成非常严重的处理负担。

img205a

图3-24任一个“Spoke(星型)”自治系统中的路由出现翻动现象,“Hub(中心)”路由器Colorado都要向其所有的EBGP对等体宣告该路由变化情况

例3-118给出了Colorado的BGP配置情况。

例3-118:让Colorado在出现路由翻动时向其EBGP对等体发送更新消息。

img205b

例3-119给出了Colorado的BGP表情况。请注意,10.1.4.0/24被标记了d,表示该路由 已经被阻尼或抑制,10.1.7.0/24被标记了h,表示曾经出现过路由翻动。也就是说,虽然该路由的惩罚值没有大到被抑制的程度,但是仍然有惩罚值。

例3-119:路由10.1.4.0/24和10.1.7.0/24都有惩罚值,第一条路由的惩罚值超过了2 000,从而被阻尼。

img206a

由于例3-119中BGP表的路由项不是很多,因而可以很容易地看出不稳定路由。但是,当BGP路由项达到成千上万条时会是什么样子呢?通过查看标记dh来寻找不稳定路由的方法是行不通的,需要利用命令show ip bgp flap-statisticsshow ip bgp dampened-paths来寻找不稳定路由。顾名思义,第一条命令显示所有出现翻动现象的路由以及翻动的次数,第二条命令仅显示那些已经被抑制的路由。例3-120显示了这些命令在路由器Colorado上的应用情况,对被抑制路由来说,两条命令的输出结果都表示了何时会再次宣告这些路由,该时间是暂时不再为路由继续分配惩罚值的时间。请注意,只有配置了BGP阻尼之后,才能记录路由的翻动统计情况。也就是说,无法利用命令show ip bgp flap-statistics检查未运行阻尼进程的路由器的不稳定路由。

例3-120:仅显示BGP表中出现翻动的路由或仅显示已经被抑制的路由。

img206b

仔细查看例3-120中的路由情况,可以看到不但显示了统计情况,还显示了累积的惩罚值。在例3-121中,去往10.1.4.0/24的路由的惩罚值为1 815,虽然半衰期衰退进程已经将惩罚值降低到了抑制门限2 000以下,但仍然未达到重用门限750。从输出结果可以看出,需要 19分10秒就可以达到重用门限。

例3-121:如果使用命令show ip bgp指定某条不稳定路由,将会显示该路由的惩罚值。

img207

在某些情况下,可能希望被抑制路由在到达重用门限之前就重新使用该路由。例如,AS 30的管理员可能会保证已经鉴别了子网10.1.4.0/24的翻动原因并已经解决了该问题,从而希望恢复流量。此时就可以使用以下两条命令:clear ip bgp flap-statisticsclear ip bgp dampening。这两条命令在清除某条路由或全部路由(依赖于是否在命令中指定路由)的惩罚值方面的效果完全一致,只是第二条命令仅清除被抑制路由的惩罚值。命令clear ip bgp flap-statistics还可以通过路由的AS路径来标识一组路由(或者指定过滤器列表,或者使用正则表达式),例如,命令clear ip bgp flap-statistics regexp30将清除AS_PATH属性中有AS号30的所有路由的翻动统计信息。在AS 30是转接AS,且某条故障链路导致通过该AS 30可到达所有目的地的路由都累积惩罚值时,该命令将非常有用。