文/张宇弟
如何优化的利用网络带宽资源,是流量负载分担的关注重点。BGP(Border Gateway Protocol, 边界网关协议)选择单条最优路径的这一特征往往会出现流量负载不均衡的流量模型, BGP流量负载均衡从两个角度出发解决这个问题:通过BGP强大的策略控制流量的负载均衡;通过多路径选路实现负载分担。本文就要从这两个角度来展开分析BGP在流量负载分担方面的技术应用。
在实际网络中进行负载均衡需要综合考虑链路和设备节点的负载情况,在满足业务的实际需求前提下,可以通过BGP的策略工具对流量进行均衡的规划和调整。对于一个AS来说,流量的方向分为入境和出境两个方向,这种区分对应到实际的网络有不同的规划,所以我们在此通过不同的场景进行介绍。
图1 多宿主到不同的上游的负载均衡
我们先分析一下图1的场景,AS100希望流量能够在AS200和AS300间进行负载均衡,也就是说根据业务分别映射到Link1和Link2上。
在规划中我们有如下思路:
1 AS100可以在RA和RB上通过策略只向各自的对等体通告部分路由前缀,这样可以起到不同的业务对应由不同的AS承载。如172.168.1.0/25通过RA通告给RC,172.168.1.128/25通过RB通告给RD。这种规划能够满足流量分担的效果,但是一旦出现链路或节点的失效,就会导致部分流量无法切换,业务中断。
2 通过步骤1我们可以看到简单的通过路由过滤无法很好的实现需求。我们可以通过对不同的前缀进行策略区分。接着步骤1的思路,AS100希望172.168.1.0/25优先通过AS200进入,希望172.168.128.0/25优选通过AS300进入。可以在RA上通过策略将172.168.128.0/128通告的AS-PATH加一个AS-Number,如:1000 100。RB上通过策略将172.168.1.0/25通告给RD的AS-PATH加一个AS-Number,如:2000 100。
RE上关于172.168.1.0/25的前缀从RC通告过来的AS-PATH是: 200 100,通过RD通告过来的AS-PATH是:300 2000 100,因此优选走AS200。关于172.168.128.0/25同理会优选AS300。该规划可以在满足需求的同时解决路由备份的问题。但是我们考虑下面一个场景,当RC和RD建立BGP连接,RD上关于172.168.1.0/25的前缀从RC通告过来的AS-PATH是100 200,从RB上通告过来的AS-PATH是2000 100,也就是说RD上关于172.168.1.0/25无法很好的进行路由选路控制。
3 团体属性是进行本地进行路由控制的重要属性,但是团体属性需要BGP对等双方有属性处理的共识。在步骤2的基础上,RB在通告172.168.1.0/25时,可以将团体属性值修改为100:120,在RD上将团体属性的前缀预定义Local-preference为120,这样对于RD来说在收到RC和RB的前缀AS-PATH相同长度的情况下,RB通告的前缀Local-preference高,优选RB。
分析完图1所示的场景,我们可以继续看看多宿主相同上游的场景,如图2:
图2 多宿主相同AS的负载均衡
对于相同的上游AS,我们更多的需要考虑上游AS内部的选路,对于跨过上游AS的远端AS的选路我们很难控制,因此本文讨论的重点就在本地和上游AS的选路策略部署。先分析需求,本地AS希望172.168.1.0/25通过RB进入,172.168.128.0/25通过RC进入。存在下述三种方式:
1 借鉴上文中多宿主不同AS的做法,将172.168.128.0/25通告给RB时,将AS-PATH设置为1000 100,将172.168.1.0/25通告给RC时,将AS-PATH设置为2000 100。由于RB和RC之间是IBGP邻居,因此对于RB来说,172.168.1.0/25从RA学习到的AS-PATH是100,从RC上学习到的AS-PATH是2000 100,优选RA的路由。对于172.168.128.0/24来说,从RA学习的路由AS-PATH为1000 100,从RC学习的路由AS-PATH为100,优选RC。这满足了需求。
2 同样,在AS间协商进行策略部署的前提下,可以在RA上对不同的业务前缀进行属性赋值的区分,在RB/RC对不同的属性设置不同的本地优先级进行业务的分担均衡。
3 还是针对图2,对于AS200进行入方向的流量负载分担部署,最直接的方法就是通过修改MED值的方法,使得RA通过MED值直接进行路由的优选。
我们还是先分析图1的场景,AS100希望出方向的业务流量能够在RA和RB间进行合理的负载均衡:
1 可以通过在RA和RB上进行入境路由前缀过滤,通过前缀在不同的出口路由器的通告分担来实现业务流量出方向的负载均衡。
2 入境的过滤适用于对端AS的业务负载分担,但是对于远端Internet的业务,无法通过入境路由前缀过滤的方法实现,否则会出现单点故障导致业务中断的情况。对于Internet业务就需要进行入境路由前缀策略控制,例如通过添加AS-PATH或者对特定前缀设置不同的本地优先级等。
3 对于单点故障导致业务中断的考虑还可以通过出口路由器发布缺省路由的方式作为路径的备份,一旦出现某个出口路由器故障,路径可以通过缺省路由切换至其他出口路由器,起到备份的效果。
4 同样可以和上游AS协商,通过通告来的前缀携带不同的团体属性进行相应的策略控制。
对于图2的场景,单出口路由器上进行负载分担可以借助路由策略的方法更为灵活:
1 针对不同对等体进行入境路由前缀过滤,使业务自然分担到不同的出口链路上。同时配置缺省路由指向对等体,防止单点故障业务中断;
2 通过针对特定前缀设置多种属性,如Local-preference、Origin、MED等,在本地进行路由优选。
AS内部的负载均衡相对容易部署,通过策略对业务进行区分,对不同的业务使用不同的BGP属性进行控制。如图3,RB和RC同时向RA通告172.168.1.0/25和172.168.128.0/25,RA希望172.168.1.0/25业务从RB走,172.168.128.0/128从RC走。满足这种需求,可以直接在RA上对业务进行区分,对RB通告的172.168.1.0/25的Local preference设置为120,将RC通告的172.168.128.0/25的Local preference设置为120,本地优选结果能够满足需求。
图3 AS内部负载均衡
上文介绍的是多宿主情况下的负载均衡规划思路,本章节需要关注的是通过等价路由在路由器之间进行负载分担的部署方式。
图4的场景是两台出口路由器之间通过环回口建立EBGP邻接,我们知道对于EBGP邻接超过1跳建立邻接需要通过命令peer x.x.x.x ebgp-max-hop <Maximum hop>,其中Maximum hop设置大于1。对每一个链路接口对应配置静态路由,指向对端环回口地址,路由下一跳为链路对端接口地址。这种方法通过路由下一跳地址的迭代,将流量负载分担到不同的链路上,实现多跳的EBGP对等体间的多链路负载分担。
图5的场景和图4类似,区别在于两个出口路由器通过链路接口地址建立了多个EBGP会话,每一个会话对应于特定的链路。
图5 多链路多EBGP对等体负载分担
RA和RB通过两条链路的物理接口地址建立两个单跳EBGP邻接关系,以RA举例,从两个EBGP会话均收到关于172.16.1.0/24的路由信息,在其他属性都相同的前提下,两个EBGP对等体通告的路由形成等价。
比较上述两种负载分担方式,第一种方式,建立了一个EBGP会话,会话直接绑定在两个出口路由器的环回地址,通过直连路由迭代下一跳的方式在链路间实现负载分担。这种方式EBGP会话属于多跳会话,需要两个AS间进行环回地址的路由部署,适用性有一定的限制。第二种方式,需要建立多个会话,对资源有一定的消耗,同时对于EBGP等价路由的配置,是针对本设备所有BGP对等体适用,无法区分对等体,因此,缺少一定的灵活性。
AS内部的负载分担规划同样可以采用下一跳迭代的方式在同一个IBGP会话间进行多链路的负载分担。对于多IBGP对等体通告的路由在优选属性相同的前提下能够形成负载分担。对于图6中的场景,RB和RC向RA通告172.168.1.0/24的路由前缀,在ORIGIN,LOCAL-PREFERENCE以及AS-PATH路径属性均相同的前提下能够形成负载分担。
图6 AS内部负载分担
多链路的负载分担还是可以通过下一跳迭代到等价IGP路由或者默认路由来实现,例如图7所示场景:
图7 IGP路由的下一跳迭代
RD和RA 建立IBGP邻接关系,RD向RA通告路由172.168.1.0/24,RA上关于172.168.1.0/24的路由下一跳是RD的环回口地址,在RA上针对RD环回口地址有两条等价的IGP路由:RA-RB-RD和RA-RC-RD,通过下一跳迭代,在RA上针对172.168.1.0/24的BGP路由也形成等价。
ORIGIN,LOCAL-PREFERENCE,MED以及AS-PATH路径属性均相同是形成负载分担的前提,在此前提下还要遵循一定的原则进行负载分担规划。以图8举例,
RB/RC均与RA通过广播网络建立单跳EBGP对等体,RA向RB/RC通告路由前缀172.168.1.0/24,RB和RC同时向RD通告,RE上收到RB和RC的路由不会形成负载分担,为什么?
缺省情况下,边界路由其器向IBGP对等体通告EBGP路由时,不会修改下一跳,因此RB和RC向RE通告的路由下一跳均为RA的接口地址,在RE上由于下一跳相同,因此不会形成负载分担。
可解决的办法是:
l 在RB和RC上针对IBGP对等体通过配置修改为:peer x.x.x.x next-hop-local,将下一跳修改为本地地址,这样RE上收到的路由下一跳不同,可以形成负载分担。
l 同样利用图8举例,RD是RR,RB和RE是其RR Client,同时RB和RE间建立IBGP邻接关系,RB通告路由172.168.1.0/24,RD反射至RE。RR在反射路由时缺省不会修改下一跳,因此在RE上关于172.168.1.0/24的路由下一跳均为RB的环回地址,可以利用前文的路由迭代,将RE-RB和RE-RD-RB的IGP路由Metric设置相同,此时能否形成负载分担?此时无法形成负载分担,原因是因为非反射路由和反射路由间无法形成负载分担。在图8中,可以将RC/RD均配置为RR,RB/RE为RR Client,RC和RD反射RB的路由172.168.1.0/24至RE,这样RE可以在两个反射路由间形成负载分担。
负载均衡和负载分担均是BGP通过策略控制达到流量在网络中不同节点、不同链路间的平衡,起到合理利用网络资源的效果。本文介绍的是对具体网络负载均衡或分担的需求进行规划的思路,实际中满足需求的手段多种多样,需要根据实际情况做相应的规划调整,因此在实际的网络规划时不要拘泥于本文提及的方法,更多的是思路上的借鉴。同时,负载均衡和分担往往需要经过多次尝试才能尽可能接近均衡的,过于精确的均衡往往会带来策略上的复杂度,同时在考虑均衡的同时还要兼顾路径的备份。