7.3 负载均衡
Internet 路由结构(第2版•修订版)
负载均衡是指让多条链路共同承担数据流量的能力。一个关于负载均衡的常见误解是,将其等同于负载的平均分配。即便承载流量的网络是由单个实体管理,平均分配负载也难得一见。在绝大多数场景中,流量在沿途还要多次转手,流量的平均分配就愈发难上加难了。负载均衡意在高效利用为实现冗余所布设的多条链路,达成流量分布模式。要想达成这一模式,就必须弄清所需负载均衡的流量,对流入和流出的流量都需加以关注。
切勿孤立地看待流量。应该把流量一分为二来看待——入站流量和出站流量(inbound and outbound)。对自治系统来说,入站流量是接收自其他AS的流量;出站流量是要发送给其他AS的流量。
假定读者连接到了两个ISP,并且与ISP1相连的链路流量过载。读者应首先在脑海中闪现:是什么样的流量过载,出站流量还是入站流量?是从AS1接收的流量,还是发往AS1的流量?
流量的出入站模式与本AS通告自身路由,以及从其他AS学习路由的方式息息相关。AS向外通告本方网络的方式会影响入站流量,接收外部AS路由更新的方式则影响出站流量。流量和路由之间的关系,是本书后续内容的基础,请读者务必完全理解。从现在起,只要本书提到采取措施以影响入站流量,这实际指对出站路由通告施以BGP策略,因为本方通告的路由会影响其他AS如何向本方“路由”入站流量。同理,只要提到采取措施以影响出站流量,这实际上是指对入站路由通告施以BGP策略,因为本方如何“路由”出站流量受所学路由的影响。图7-7所示为出入站流量的运作方式。
正如读者所见,将出站流量送达NetA时所采用的路径,取决于本方从哪条链路学到NetA这条路由。由于从NY和SF都可以收到路由NetA,本方的边界路由器在转发目的地址为NetA的出站流量时,可以选择NY或SF链路。
反过来,目的地址为本地网络NetB和NetC的入站流量所采用的路径,则取决于本方如何通告这两个网络的路由。如果只在NY链路上通告网络NetC,目的地址为NetC的入站流量就会采用NY链路。同理,如果只在SF链路上通告网络NetB,目的地址为NetB的入站流量就会采用SF链路。尽管,这一方案看似对流入AS的流量起到了优化作用,但在通告这两个网络时并未考虑冗余。
7.3.1 具体场景:设计冗余、对称及负载均衡
截至目前,读者应当对总体现状有所认识:冗余、对称以及负载均衡这三个设计指标间既相互关联,又暗伏冲突。如何才能在多条链路分担流量的同时,仍然能够实现流量同点进出AS的要求呢?当多条链路分别终结于自治系统内的多台路由器时,上述要求则更难达到。第6章所述的路由属性是一种工具,只要运用得当就能实现人们梦寐以求的冗余、对称以及负载均衡。为了达到预期的设计目标,选择并配置相应的属性和路由过滤是网络管理员的职责所在。
本节呈现了几种具体场景及相关配置,以期实现冗余、对称、负载均衡三者间的完善、统一。本节所列举的场景以及相应的设计解决方案可能有点儿以偏概全。然而,由这些场景及解决方案所揭示出的原理可以应用与其他场景,并且有助于读者理解和实现更理想,更高效的设计。
在呈现场景时,我们遵循的是由易到难这一原则。请注意,在许多情况下,客户和提供商只是相对而言,这是因为提供商也可以是另外一个提供商的客户。两者之间的主要区别就在于:客户只有连接到提供商才能具备Internet连通性,而客户自己不为其他客户提供Internet连接。提供商则提供Internet连接服务,但自己也可以是其他提供商的客户。
取决于客户是否需要从提供商接收最少量(或不接收)路由、部分路由、完整路由或以上情况间的排列组合,我们对以下几节中的场景做了进一步划分。对于客户接收最少量或不接收路由(亦称为默认路由)的情况,读者可以假设客户仍会学习0/0路由,或几条让客户自己去设置静态默认路由的聚合路由。部分路由一般包括提供商的本地路由以及隶属于提供商的客户的路由。完整路由则是指现有的所有Internet路由——2000年初这一数字约为75000条。在客户需要从同一提供商接受默认路由和部分路由,或从一个提供商接受部分路由而从另一个提供商接收完整路由等情况下,就需要对以上几种场景加以组合。
7.3.2 情景1:单宿主
单宿主客户的站点通过单链路接入提供商,以访问Internet,如图7-8所示。
这样的客户往往通过配置一条指向提供商的默认路由,就能充分享受Internet服务了。此外,提供商也要安装一条指向客户的静态路由以访问客户。这种方法既廉价又高效。从技术上讲,提供商和客户都无需运行BGP。因此,客户路由器不必学习任何Internet路由。这显著降低了设备的内存消耗和处理负担。在这种情况下,路由对称也不成问题,因为流量只能从单点进出。
单宿主站点通常只能依赖于接入Internet的单条连接。客户也没有申请备份链路。如果链路发生故障,在恢复之前,客户只能忍耐。显而易见,这种连接方式无法满足关键性应用的数据通信需求。无备用链路的单宿主站点不适于承载要求高级别可靠性的应用。还需关注的是,在这种情况下,采用标准的静态+默认路由的配置能够更进一步得简化复杂性。
7.3.3 情景2:多宿主连接到单提供商
多宿主连接到单提供商是指客户从同一提供商申请了多条接入Internet的链路。对于这种情况,本节假定使用BGP作为路由协议。当然,并非所有情况都需要使用BGP,但BGP所带来的灵活性是无与伦比的。此外,对于这样的场景(多宿主连接到单提供商),客户很有可能使用的是私有AS号,因为也没有必要去申请正式AS号。如第6章所建议的,参考RFC 2270可以获得更多有关私有AS号的信息。
我们会在后续各节讨论以下主题。
- 只设定默认路由,外加主备链路。
- 默认路由、主备链路外加部分路由。
- 默认路由、主备链路外加完整路由和部分路由。
- 自动负载均衡。
- 共享多链路的两台路由器间的负载均衡。
只设定默认路由加主备链路
在本场景中,客户配置指向提供商的默认路由,不接受部分或完整路由。客户可以针对两条链路分别配置默认路由。如图7-9所示,客户将其中的一条链路作为传输流量的主用链路,如果主用链路失效,另一条作为备用链路取而代之。如果为客户提供接入的提供商多于两个,客户也可以设置分别具有不同优先级的多条默认路由。
提示:
请参见第12章的“只设定默认路由加主备链路”一节。
以下两节,我们会讨论对出入站的流量的控制。
客户的出站流量
在图7-9所示的场景中,客户使用单台路由器分别连接到提供商的多个机房,并设置了具有不同距离值的多条默认路由。主用路由的距离值较低。此外,客户要想设置默认路由,也可以从提供商处动态学习0/0默认路由,或少许聚合路由。客户可以利用本地优先值在默认路由间取舍。
如图7-9所示,假定从NY学到的默认路由优于从SF学到的默认路由。在正常情况下,客户会使用NY链路作为主用链路,将SF链路作为备用链路。
对于出站流量来说,负载均衡只能说是可望而不可及,原因是所有流量只会通过主线路发送,备用线路只是为了防止不时之需。
当然,客户路由器在内存使用量和处理器资源方面的节约,也足以弥补不能实现负载均衡的遗憾了。
客户的入站流量
客户可以通过BGP将自己的网络通告给提供商。提供商可以通过两条路径向客户发送流量。无论提供商选择哪条路径发送流量,都会对客户的入站流量产生影响。通常,提供商的正常行为(假定提供商收到路由的所有BGP属性全都相同)是:将流量从自己距离客户最近的出口点发送出去。如果发往客户的流量离NY链路较近,就会通过NY链路流入客户的AS。如果离SF链路较近,就会从SF链路流入。
以上所有因素都在客户的控制范围之外。想要“逆转”以上因素的影响,客户可以通过通告其路由的不同度量值,来控制入站流量从指定链路上流入。根据客户通告的度量值,提供商就能够引导发往客户的流量。如图7-9所示,客户在NY和SF链路上分别以度量值50和100来通告自己的路由。这样的话,提供商发往客户的流量会选择NY这条路由。
默认路由、主备链路外加部分路由
除了客户可以从提供商接收部分路由以外,本场景与“只设定默认路由加主备链路”场景相同。图7-10所示为这一网络环境。
由于提供商为客户提供了更多的路由信息,因此在选择流量的出口点方面,图7-10所示的方法可以给客户提供更大的灵活性。现在,我们开始讨论出入站流量的模式。
提示:
请参见第12章的“默认路由、主备链路外加部分路由”一节。
客户的出站流量
请考虑客户1通过两台单独的路由器连接到提供商的情况。客户可以根据自己从提供商处接收的部分路由中的每一条,来选择出站流量所采用的路径。一般情况下,客户会为收到的不同路由设置不同的本地优先值来完成上述需求。可以根据AS路径、前缀或同时基于两者来设置本地优先值。如果根据AS路径来设置,那么本地优先值会作用于某特定AS所含的所有前缀。在需要以前缀为基础来做出路由决策时,也可以根据前缀来设置本地优先值。如图7-10所示,根据某个AS的物理位置,或是与提供商AS相关的多条前缀,客户1可以选择使用SF链路来转发目的地址为客户2和客户3(C2和C3)的流量,使用NY链路来转发目的地址为C4和C5的流量。客户1可以使用以下方法来实现上述需求。
对于在NY链路上学到的路由,为路由C4和C5分配本地优先值300。为所有其他路由分配本地优先值250(其中包括路由C2和C3)。
对于在SF链路上学到的路由,为路由C2和C3分配本地优先值300。为所有其他路由分配本地优先值200(其中包括路由C4和C5)。
当BGP表中出现通往同一目的网络的多条路由(通过外部和内部BGP学得)时,客户1会选择NY链路发送目的网络为C4和C5的流量(路由C4和C5的本地优先值为300,大于SF链路的200)。同理,客户1会选择SF链路发送目的网络为C2和C3的流量(路由C2和C3的本地优先值为300,大于SF链路的250)。对于目的地址为C2、C3、C4和C5以外的流量,客户1会选择NY链路来发送(所有其他路由的本地优先值为250,大于SF链路的200)。
由客户1发出的目的地址未知的所有其他Internet流量,会以主备默认路由的方式,遵循默认路由来发送。默认路由0/0既可以通过两条链路从提供商处动态获悉,也可以静态配置指向提供商的某个网络(请见本章的“设置默认路由”一节)。可以使用本地优先值来确立主备用默认路由。根据为路由C2、C3、C4和C5设置本地优先级的方式,客户1会使用NY链路来发送匹配0/0路由的所有其他流量(所有其他路由的本地优先值为250,大于SF链路的200)。
还有一种与此截然不同的方法,则无需在客户站点做如此繁琐的配置,那就是提供商向客户通告路由的度量值。在第6章的“MULTI_EXIT_DISC属性”一节,我们对此进行了讨论。只要提供商通告路由的度量值能够反映出从其AS入口点到其他客户网络(例如C2、C3、C4、C5)的相对距离,客户1就能够相应地对自己的出站流量进行负载均衡。发往C4和C5的流量会“走”客户1的NY链路,发往C2和C3的流量会“走”客户1的SF链路。对于离开C1 AS的其他流量,则要根据C1从每条链路上所学路由的度量值来选择链路。对C1来说,尽管这种方法几乎不用配置,但因为C1的流量发送路线要完全依赖于提供商所通告度量值的精确度,故而具有不确定性。读者还能记得这种被称为最佳出口点(best-exit)的路由选择方案吧?最理想的效果可能需要以上两种方法相结合来获得。
客户的入站流量
在不同链路上通告不同的度量值,客户就能够影响入站流量。有些提供商鼓励客户在通告自己的BGP路由时,将IGP度量值作为BGP度量值一并通告。这样,提供商就可以使用离目的网络最近的链路向客户交付流量。如图7-10所示,客户已决定手动设置路由的度量值,以迫使以下流量行为生效。
对于在NY链路上通告的路由,为前缀为W和Z的路由分配MED值200。为所有其他前缀的路由分配MED值250(包括前缀为X和Y的路由)。
对于在SF链路上通告的路由,为前缀为X和Y的路由分配MED值200。为所有其他前缀的路由分配MED值300(包括前缀为W和Z的路由)。
当BGP表中出现通往同一目的网络的多条路由时,提供商会使用NY链路发送目的地址为W和Z的流量(路由W和Z的MED值为200,小于SF链路的300)。同理,提供商会使用SF链路发送目的地址为X和Y的流量(路由W和Z的MED值为250,小于SF链路的250)。对于目的地址为X、Y、W和Z以外的其他流量,提供商会使用NY链路发送(所有其他路由的为250,小于SF链路的300)。
RFC 1998定义了影响入站流量的另一种方法。尽管我们在这里不会对此方法再加以探讨,但仍然鼓励读者仔细研究这份RFC所推荐的方法。
默认路由、主备链路外加完整和部分路由
对于多宿主连接到单提供商的客户,可以从与提供商的所有连接链路上接受完整路由,或者也可以采用从一条链路上接受完整路由,从其他链路上接受部分或不接收路由(默认路由)。在上一节所讨论的技术在这里同样有效——利用本地优先来控制客户的出站流量,利用度量值(RFC 1998所推荐的方法)来控制入站流量。此外,如果客户和提供商之间能够交换内部路由的度量值,那么还能在一定程度上实现负载均衡。
警告:
处理出站流量时,操弄与某些精确路由相匹配的流量从特定出口流出,这种做法非常危险。若出站流量遵循IGP默认路由而指向客户BGP路由器,随之再遵循BGP默认路由,被引导至另一台BGP路由器,那么就很可能会发生路由环路。换言之,使用默认路由器时,路由进程域内的所有路由器必须“行为”一致,尤其是在故障发生期间。现在,读者可能会对这段描述一头雾水,但在学完下一章之后就会豁然开朗了。
自动负载均衡
前面所讨论的场景可能本就非常直观,但负载均衡的任务可算是比较抽象,因此需要仔细规划。对于由EBGP所学、源于同一AS且目的网络相同的多条路径,Cisco IOS软件支持单台路由器上的动态负载均衡。这也就降低了配置的难度。
注意:
与路由协议一样,负载均衡的实际效果也取决于路由器所启用的底层数据包交换模式。虽然对交换(switching)技术的深入讨论超出了本节的范围,但我们仍强烈建议读者掌握各种交换模式。
在图7-11所示的示例中,单台路由器(NY)通过两条链路接入其提供商,并同时从两条链路上接收相同的路由更新。
Cisco路由器会在本地IP路由表内保持最多6条通往相同目的网络的BGP路由。然而,在将EBGP路由更新通告给IBGP对等体时,路由器只会针对特定目的网络传递单条最佳路由。路由器会自动改变这条最佳路由的下一跳地址,在本例中就是NY路由器自身的IP地址,NY路由器在通告路由时并不会通过IBGP会话来传播路由的EBGP下一跳地址。请注意,只有配置了动态负载均衡的情况下,BGP路由器才会自动改变路由的下一跳。
默认情况下,(在转发流量时)Cisco路由器会针对每个目的地(主机IP地址)逐一执行负载均衡。这种逐个目的地负载均衡是以轮询(round-robin)方式来执行的。一条路径(接口)会“锁定”发往某台主机的流量,另一条路径(接口)会“锁定”发往第二台主机的流量,依此类推。
以图7-11为例,假定客户1获得了通往192.213.10.0/24的两条相同路由。要是不能自动进行负载均衡,BGP进程只会优选其中的一条路由,让路由器发送流量。修改BGP属性让多条路径承担流量是网络管理员的职责所在。
提示:
请参见第12章的“BGP多路径负载均衡”一节。
有了自动负载均衡,BGP便能维护两条目的网络为192.213.10.0/24的“路线(路由)”,一条走SF链路,另一条走NY链路。如果客户所发流量的目的地址为192.213.10.1~192.213.10.6,那么客户网络的出站流量会根据轮询的原则分解到这两条链路上。目的地址为10.1的流量会走SF链路,10.2的流量会走NY链路,10.3会走SF链路,10.4会走SF链路,依次类推。
注意:
如前所述,默认情况下,BGP只会在IP路由表中安装一条通往每个目的网络的最佳路由。可是,如果从同一邻居AS学到了多条路径,就可以使用BGP多径(Multipath)特性在IP路由表中安装多条路由。可以使用router配置命令maximum-paths,令路由器在路由表中安装多达6条通往单个目的网络的路径。第12章会描述与BGP多径有关的配置信息。
注意:
只有在同一台路由器上处理接收自同一提供商的相同路由时,这种方式的负载均衡才能生效。在从多提供商接收路由的环境中,这样的负载均衡就无能为力了。
共享多条路径的两台路由器间的负载均衡
如图7-12所示,在某些情况下,出于备份或提高带宽的目的,两台路由器间会共享多条物理链路。虽然对于出站流量,自动负载均衡使用起来得心应手,但对于本方的入站流量,则需求助于对路由度量值的操纵,以期影响提供商的出站流量。
要在图7-12所示的环境中对流量做负载均衡,方案之一是实施动态负载均衡。这只不过是前述自动负载均衡场景的特例。然而,动态负载均衡会给路由器带来额外的开销。每台路由器都要从另一台路由器接收重复的路由更新消息。在通告完整路由的情况下,每条链路都要传播大约70000条路由更新消息。相反,在图7-12所示的场景中,利用静态路由来实现负载均衡是一种更可取的做法。
在正常运作时,BGP会为所学的每条前缀保留最优的下一跳。如表7-1所示,RTA收到两条通往NetX的相同路由。
BGP会挑选最优路由,并将其安装进IP路由表。在本例中,BGP所选路由的下一跳为10.10.10.2。表7-2所示为RTA的IP路由表,通过链路1就能够将数据包转发给下一跳10.10.10.2。正如该配置所示,所有目的地址为从RTB所学网络(路由)的流量都会通过链路1来发送。因此,根本没有实现负载均衡。
提示:
请参见第12章的“共享多条路径的两台路由器间的负载均衡”一节。
要想实现更为智能化的负载均衡,就要通过将一下跳设置为虚拟地址而非物理链路地址,并以此来“糊弄”BGP。然后,再通过将该虚拟IP地址(下一跳地址)映射为多个直连接口的IP地址,从而利用IP路由表去执行实际的负载均衡。如图7-13所示,RTB配置了一个loopback接口(虚拟接口),并为该接口分配了IP地址,RTA可以利用该地址去建立BGP邻居连接。以这种方式,可以将loopback接口IP地址和非物理链路接口IP地址用作为路由的下一跳。无论是IGP还是静态路由都可以不依赖于BGP,用来在链路间执行负载均衡。
如表7-3所示,RTA会从邻居12.12.12.12接收路由更新,并会通过下一跳12.12.12.12转发目的地址为NetX的流量。
表7-4所示为RTA的路由表。RTA可以通过链路1和链路2将数据包转发给下一跳12.12.12.12。要想将数据包发送到网络12.12.12.0/24(12.12.12.12),RTA既可以通过IGP,也可以在链路1和链路2上各指一条静态路由来实现。现在,这台路由器可以实现负载均衡了。在本场景中,由于要执行递归路由查找,负载均衡的实现是基于逐个网络而非逐个目的地址。现在,发往由RTB所通告网络的流量在多条链路上以轮询方式实现了负载均衡。
7.3.4 情景3:多宿主连接到不同提供商
连接到多个提供商的客户被视为以多宿主连接到不同提供商。冗余和地理方面的限制是这些客户多宿主连接到不同提供商的真正原因。在本场景中,我们会在个案基础上,反复讲解流量的出站行为。对于所有个案,流量的入站行为都是相同的,我们会在本节的末尾加以介绍。
在以下几节中,我们会介绍与多宿主连接到不同提供商有关的主题。
只设定默认路由,外加主备链路。
默认路由、主备链路外加部分路由。
默认路由、主备链路外加完整和部分路由。
客户的入站流量(操纵AS_PATH)。
只设定默认路由加主备链路
对于本例,客户可以遵循默认路由将流量送达提供商。两条链路一主一备。有关情况如图7-14所示。
通过静态设置路由或者两个提供商对默认路由的动态通告,客户可以设置或学到通往两个提供商的默认路由。客户可以利用管理距离或本地优先值来优选其中的一条默认路由。设置默认路由的一个良方是,将默认路由指向从两个提供商接收的同一网络。客户可以根据从提供商处接收的网络来配置默认路由0/0,并利用本地优先值来优选其中的一条默认路由。若因连接某提供商的链路故障,主用默认路由失效,备用默认路由会取而代之。客户可以与提供商协商,并要求其仅通告一条明细路由,或客户可以在本方过滤除那条所需明细路由以外的所有路由更新。
如图7-4所示,该客户将默认路由指向自己从两家提供商接收的网络192.213.0.0/16。NY和SF链路分别为主备链路。为此,客户为从NY链路接收的路由192.213.0.0/16设置了最高本地优先值200。
默认路由、主备链路外加部分路由
一旦在上一节所讨论的网络环境中添加部分路由的接收,出站流量的行为势必会发生改变。图7-15所示为这一新网络环境。客户可以从一个或同时从两个提供商接收部分路由。此外,客户还必须接收或配置指向两个提供商的默认路由,并会优选其中的一条作为主用。
通过从提供商接收部分路由,在向自己的直连提供商转发流量时,客户可以无需知晓所有Internet路由而做出最佳路由决策(对于某些大型提供商来说,即便是部分路由,数量也十分可观)。如图7-15所示,BGP会做出正确的选择,客户自然会选择离目的网络最近的链路(最短的AS路径)转发相应的流量。对于其他所有Internet路由,主备链路(主备默认路由)这一基本原则仍然适用。客户可让默认路由指向接受自两家提供商的某个特定的网络,并利用本地优先来选择其中的一条链路作为主用。
默认路由、主备链路外加完整和部分路由
在多宿主连接到不同提供商的情况下,除非客户有意成为提供商,并准备将完整路由再传递给自己的客户(担当穿越AS),否则不必从一家或同时从两家提供商接收完整路由。有关情况如图7-16所示。
取决于是否需要高效的负载均衡,客户可以从一个或同时从两个提供商接收完整路由。在从两个(多个)提供商接收完整路由的情况下,客户可以利用本地优先属性来确定通过哪个提供商转发目的地址为相应网络的流量。可以根据AS、前缀或团体字串信息来做出流量的转发决策。在某些情况下,客户可能希望从一个提供商接收完整路由,并从另一个提供商继续接收部分/默认路由。这样的话,既省却了在不同链路上管理所收完整路由的麻烦,客户又能通过最佳路径与外部世界通信。读者稍后会了解到,任意由提供商所引起的Internet路由的不稳定,都会极大地消耗路由器CPU资源。
如图7-16所示,客户从NY提供商接收完整路由,从SF提供商接收部分路由。此外,客户还设置了指向SF提供商的默认路由。针对目的地址为SF提供商本地网络及其客户网络的流量,客户会采用SF链路发送,这是因为相应路由的AS路径较短。至于所有目的地址为其他网络的流量,客户会采用NY链路发送,原因是SF提供商只在SF链路上通告部分路由。如果SF链路中断,客户可以通过NY链路访问外部网络。一旦NY链路中断,客户还可以遵循指向SF提供商的默认路由,访问Internet。
提示:
请参见第12章的“多宿主连接到不同提供商”一节。
客户的入站流量
如何将路由通告给提供商会影响到客户自己的出站流量。请注意,在与多提供商互连的场景中,客户向提供商分别通告路由的不同度量值,对自己的出站流量不会有半点影响。这是因为MED是非传递属性。换言之,只有与客户直连的上游提供商才能学到路由的MED值,而提供商之间则不会传递该属性。
为了以动态方式影响提供商的路由选择行为,客户可以在路由的AS路径信息中插入虚构的AS号,以此来操纵AS路径属性,并最终改变路由中AS路径的长度。提供商收到具有不同AS路径长度的相同路由时,会优选具有最短AS路径的路由(假定高优先级的其他BGP属性全都相同)。请注意,在多提供商环境中,由于无法保证只有邻接提供商会从其他提供商接收发往客户网络的流量,故而只影响直连提供商的路由选择行为(比如通告路由的MED)(并以此影响入站流量)是远远不够的。AS路径操纵必须影响从交换点到客户流量路径上所有提供商的路由选择行为,因为就路径长度而言,平衡恰恰是在这里以这样或那样的方式被打破。
图7-17所示为在AS路径信息中利用虚构AS号影响路由选择的方法。客户(AS100)向AS300通告路由时,在路由的AS信息中插入了虚构的AS号。位于NAP的提供商会收到具有不同AS路径长度(“300 100 100”Vs.“200 100”)而目的网络相同的路由,并会挑选由AS200通告的具有最短AS路径的那条路由(假定高优先级的其他BGP属性全都相同)。虚构AS号应该是对生成路由AS的AS号加以重复(在本例中,就是重复AS号100)。
7.3.5 情景4:同一提供商的客户间设有备份链路
某些情况下,为了共同的利益,客户间可能会彼此互连,并且在Internet连接上互为备份。这样的客户全都连接到同一个提供商,并同时以一条私有链路互连。这时,通常会发生以下两种情况。
Internet链路中断时,私有链路可以作为备用链路。
这条私有链路既是客户之间内部流量的主用链路,又是防范Internet链路中断的备用链路。想让这一备份策略生效,客户就必须将各自的网络通告给提供商。一个客户的Internet链路中断时,第二个客户就要变成前一个客户访问Internet的穿越AS。
私有链路作为纯备用链路
如图7-18所示,AS2和AS3都连接到同一提供商AS1。AS2和AS3之间的那条私有链路只作为备用链路使用。AS2和AS3的路由策略相同。
对于图7-18中所示的备用链路环境,针对AS2出站流量的考量耐人寻味。无论AS3从提供商和AS3接收完整路由,还是接收默认、完整加部分路由的组合,AS2都必须为接收自AS1的路由设置更高的本地优先值(200),这要高于从AS3所收路由的本地优先值(100)。这样的话,AS1总是AS2的首选流量出口点,而那条私有链路只作为备用链路。在接收部分路由的情况下,AS2可以设置指向AS1和AS3的默认路由。为前者设置较高的本地优先级值,AS2就能确保通过提供商发送所有的流量。如果从提供商接收完整路由,从AS3接收部分路由,那么AS2可以保留(动态学习或静态设定)一条指向AS3的默认路由,在直连提供商的链路中断时,这条默认路由会令路由使用那条私有备份链路转发流量。对于从AS3动态学到的默认路由,AS2无需为其设置一个比完整路由(从提供商学得)低的本地优先值1。
私有链路作为AS2和AS3间的主用链路
如图7-19所示,使用AS2和AS3间的这条私有链路作为主用链路,发送目的地址为AS3本地及其客户网络的流量。AS2仍会使用直连提供商的链路发送所有其他流量。这两条链路(直连提供商链路和私有链路)还应该互为备份。
假定图7-19所示的网络环境采用的是接收默认、完整以及部分路由的路由策略;以下内容围绕AS2的出入站流量模式做深入探讨。通常,会采用默认的BGP行为来处理本场景的路由策略需求。因为BGP总是优选具有最短AS路径(假定高优先级的其他BGP属性全都相同)的路由,AS2和AS3也总是利用私有链路转发彼此的流量。出于实验的目的,我们会尝试操纵本地优先属性以影响出站流量,从而满足本场景的需求。
提示:
请参见第12章的“同一提供商的客户间设有备份链路”一节。
AS2的出站流量
无论从AS3和提供商接收哪种类型的路由(默认路由、部分路由或完整路由),在为所有不包括AS3的路由更新设置本地优先值时,AS2 的赋值应高于所有其他路由更新的本地优先值。如图7-19所示,AS2为所有非AS3生成的路由(non-AS3-originated)设置了本地优先值300。AS3通过那条私有链路通告给AS2的路由更新(包括了由AS3生成的路由)则被赋予了本地优先值200。提供商通告给AS2的路由(包括了由AS3生成,并由提供商转发给AS2的路由)仍然保留了默认本地优先值100。这也就确保了AS2会采用这条私有链路发送目的地址为AS3本地及其客户网络的流量。
对于所有其他流量,AS2的路由策略是:接收默认路由,或者自行设置指向提供商和AS3的默认路由,但优选指向提供商的默认路由。
AS2还可以只从AS3接收其本地生成的路由,不从提供商接收任何(明细)路由。然后,AS2可以设置(或学习)指向两者的默认路由,并总是优选指向提供商的默认路由。这样,所有发往AS3的流量都会采用私有链路,其他所有流量都会采用直连提供商的链路(其一、明细路由压过默认路由;其二、AS2优选了提供商的默认路由)。一旦AS2直连提供商的链路中断,那条私有链路会承担所有流量的转发。
AS2的入站流量
对于场景4中所讨论的上述所有个案来说,入站流量的行为全都相同——来自Internet的入站流量都会从提供商和AS2之间的那条链路流入,原因是相应路由的AS路径较短;对于源于AS3或其客户的流量,则会选择从那条私有链路流入,这同样因为相应路由的AS路径较短。当然,这也是人们的预期行为。
7.3.6 情景5:不同提供商的客户间设有备份链路
对于接入不同Internet提供商的多个独立的AS来说,要求通过Internet互联也不是什么稀罕事。只要牵扯到多个提供商,并且这些提供商的客户之间还想实现互相备份,维护起来就非常麻烦。本节是对上一节所讨论问题的拓展——论述了提供商是如何完成这种备份连通性的需求。
如图7-20所示,AS1和AS2分别是ISP1和ISP2的客户。此外,AS1和AS2之间还达成了双边协定——两者之中任何一条主用Internet链路中断,两个AS间的那条私有链路就作为备用链路使用。
正常情况下,每个AS都不愿成为另一个AS的穿越AS。在图7-20所示的案例中,AS1会要求ISP1设置路由策略,使得ISP1通过ISP2才能将流量送达AS2;同理,AS2也会要求ISP2设置路由策略,使得ISP2通过ISP1才能将流量送达AS1。在本场景中,为使备用链路发挥作用,AS1要把AS2的网络通告给ISP1;AS2也要把AS1的网络通告给ISP2。
提示:
请参见第12章的“不同提供商的客户间设有备份链路”一节。
与主备链路有关的讨论与上一节“情景4:同一提供商的客户间设有备份链路”的内容相同。私有链路既可以作为纯备份链路,也可用于承载2个AS间内部流量的传递。
向客户发送流量时,要想让提供商不将另一个客户作为“跳板”(作为穿越AS),实现起来非常复杂。ISP1必须分别针对由ISP2和AS1所通告的AS2的路由设置本地优先值,令前者高,后者低。这样的话,在正常情况下,ISP1向AS2发送流量时,会首先将流量发送给ISP2。当然,对于ISP2也要部署相同的路由策略。
提供商都喜欢尽量精简自己的网络配置。对于每天都有多个客户在线的提供商来说,为每个客户手工设置本地优先值可谓是耗时耗力。此外,提供商还倾向于根据AS号而不是具体的网络号来设置自己的策略。
有好几种方法可以用来实现所要求的路由策略。第一种是BGP团体属性法,这需要提供商与客户之间进行协商。第二种是AS路径操纵法。AS路径操纵易于实现,但可能不为所有厂家的产品所支持。此外,如果提供商采用了限制性的AS路径过滤器,那么也需要提供商和客户之间进行协商。
团体属性法
团体属性法的确行之有效。提供商要将某些团体属性值映射为相应的本地优先值(即RFC 1918所载)。对于标以特定团队属性值的客户路由更新,提供商会自动分配相应的本地优先值。
出于简化,本场景只是从ISP1的角度来完成路由策略的设置。对于ISP2来说同样适用。对于图7-21所示案例的流量流动行为,至少可以划分为3种模式。
取决于客户到提供商之间的具体连接数,可能还会有更多的流量流动模式,但只需探讨3种基本流量模式。
对于ISP来说,流量的流动模式可被归纳为以下3种。
模式1——由客户AS1生成的路由,即客户的本地路由。
模式2——经AS1“中转”的路由,这样的路由由AS2通告,包括AS2的路由,以及AS2从ISP2处接收的所有其他路由。如果AS2与ISP2间的链路中断,ISP1会利用这样的路由信息通过AS1将流量送达AS2(AS2将AS1看作Internet的备用“管道”,反之亦然)。该模式也被称为客户的穿越路由。
模式3——由ISP2通告的所有其他路由,即ISP路由。这样的路由可能包括ISP2从AS2学到的路由2。
将路由划分为不同的类别(将流量划分为不同的模式)之后,ISP1会为每种模式分配团体属性值,并将团体属性值动态映射为本地优先值。如表7-5所示。
ISP1会告知其客户及直连提供商:本AS路由的本地优先值会根据表7-5动态设置。于是,客户就可以在通告路由时,设置相应的团体属性,从而影响ISP1的路由决策。如图7-21所示,AS1会将无团体属性值的本地路由,以及团体属性值为400:40的穿越路由通告给ISP1。ISP2会将自己团体属性值为400:60的路由通告给ISP1。
根据表7-5所总结的本地优先值,AS1会使用自己与ISP间的直连链路,转发目的地址匹配AS1本地路由的流量(此类路由的本地优先值为最高的100)。ISP1会将匹配所有其他路由(包括AS2的路由)的流量转发给ISP2(ISP路由本地优先值为60,大于AS1通告的穿越路由的本地优先值40)。
提示:
请参见第12章的“COMMUNITY属性法”一节。
AS路径操纵法
AS路径操纵法与“情景3:多宿主连接到不同提供商”的“客户入站流量”一节所讨论的方法基本相同。这种方法颇为直截了当,业已证明是影响提供商路由决策的有效方法之一。图7-22所示为使用AS路径操纵法影响路由决策的过程。
如图7-22所示,为了避免“压过”AS路径属性,所有路由的本地优先属性均保持其默认设置。有了这一假设,通过对AS路径属性的操纵,ISP1会使用与AS1的直连链路转发目的地址为AS1的流量,使用与ISP2的直连链路转发目的地址为ISP2的流量。根据最短的AS路径,ISP1做出了上述路由决策。
对于目的地址为AS2的流量,ISP1无论通过AS1还是ISP2转发,“路途”都相等。ISP1经AS1到AS2的AS路径为“1 2”;经ISP2到AS2的AS路径为“500 2”。这两个AS路径长度相等。
为了影响ISP1的路由决策,AS1向ISP1通告AS2的路由时,必须在路由的AS路径信息中前置一个额外的AS号,以增加路由的AS路径长度。一般情况下,AS1会重复自己的AS号。这样的话,ISP1经AS1到AS2的新AS路径将会是“1 1 2”,这要长于ISP1经ISP2到AS2的AS路径“500 2”。所以,在正常情况下,ISP1会使用ISP2转发目的地址为AS2的流量。
提示:
请参见第12章的“AS_PATH属性法”一节。
1这是因为明细路由压倒默认路由。——译者注
2为什么作者在“流量模式”里提到的尽是“路由”?请读者一定要明白流量和路由的关系——流量属于数据层面,路由属于控制层面。搭建网络的目的,是为了传递流量,对于超大型网络,不可能直接控制流量。因此,必须以控制路由的方式进而控制流量——通告路由是为了吸引流量;学习路由是为了发送流量。流量的发送方向和相应路由的通告方向始终相反,这是学习BGP,甚至是MPLS/VPN所必须建立的基本概念!——译者注