第六章 防火墙负载均衡

本章介绍防火墙的概念以及它的基本工作方式,然后我们分析推动防火墙负载均衡需求产生的因素,并且讨论几种防火墙负载均衡的网络设计方案。
6.1 防火墙的概念
防火墙是分离外部网络和内部网络一种安全设备。如图6.1所示的网络结构,所有外部网络和内部网络之间的流量必须流经防火墙。防火墙执行所有的安全和访问控制策略,保护内部网络不受恶意用户攻击。
图6.1 防火墙的工作方式
防火墙检查每个数据包,以确认是否允许其通过。大多数防火墙执行状态检测,即防火墙跟踪每个数据流的状态和整个过程,以确定是否允许一个数据包或者一个连接通过。例如,一个TCP数据包,只有当它属于一个已经建立的TCP连接时,它才会被允许通过。比如FTP协议,它在建立控制连接后才开始建立数据连接,防火墙在确认控制连接确实已经建立后才允许数据连接通过。同样地,防火墙只允许已经建立了控制连接的客户端和服务器建立FTP数据连接。防火墙甚至可以检查客户端和服务器之间通过控制连接协商的数据连接的端口号,并且只允许此客户端和服务器在这个端口上建立FTP数据连接。
一个连接可能是由外部网络的主机发起,访问内部网络的主机,也可能是反过来的。防火墙可以用相应的规则分别处理这两种流量。一般来讲,一个企业会严格地控制来自外部网络发起的访问请求,内部网络只有很少的服务器对外开放,允许外部网络访问,然而大多数内部网络的主机发起的访问外部网络的请求是不受限制的。
6.2 防火墙负载均衡的需求
防火墙的产品多种多样,有软件的产品,也有硬件的设备,不管哪种类型的防火墙在性能方面都存在瓶颈。衡量防火墙性能的指标有很多,在这里我们用吞吐量来衡量。防火墙最大的吞吐量跟它的配置有很大关系,比如访问控制策略从10条增加到100条,防火墙的性能都会有不同程度的下降。不管怎么说,大多数防火墙每秒都支持几十兆的吞吐量。虽然有些高端的防火墙每秒可以支持几百兆的吞吐量,但跟中低端防火墙相比,它的性价比并不好。如果我们需要升级改造网络,以支持更高的吞吐量,就必须部署更昂贵的高端防火墙,毕竟单台防火墙无法满足我们所需要的高吞吐量。通过在多台防火墙之间分发负载,防火墙负载均衡能够帮助我们实现目标。进一步说,我们可以使用防火墙负载均衡的方式来部署多台中低端防火墙,在获取跟高端防火墙相同吞吐量的同时,还具有更好的性价比。
从高可用性的角度来看,防火墙是企业网络的单点故障。如果防火墙出现故障,整个内部网络和外部网络之间的连接将中断。
有些防火墙可能支持防火墙集群的特性,集群由两台防火墙构成,一台防火墙作为另一台防火墙的备份。这改善了可用性,但没有扩展性。防火墙负载均衡通过在多台防火墙之间分发负载的方式提高了高可用性,可以允许一台防火墙出现故障,同时也提高了可扩展性。
由于防火墙产品的维护需要一定的工作量,防火墙负载均衡也有助于改善可管理性。网络管理员可以让一台防火墙停止工作来进行维护工作,比如软件或硬件升级,而不需要中断网络访问。负载均衡器可以让一台防火墙平滑下线,首先停止给防火墙发送任何新的连接,并且等待已有的连接正常结束,从而达到无缝切换。
6.3防火墙负载均衡
最基本的防火墙负载均衡的网络结构如图6.2所示,通常称之为“防火墙三明治”。为了实现防火墙负载均衡,我们需要在防火墙两端都放置负载均衡器,因为防火墙任何一端都有可能发起流量。不管流量从哪边发起,它必须首先经过负载均衡器,由负载均衡器在防火墙之间进行负载分发。
图6.2 基本防火墙负载均衡的设计
如果防火墙需要执行状态检测,在做负载均衡时就必须要满足两个条件。首先,一个连接所有的数据包,包括请求和响应,必须发送到同一台防火墙。其次,所有相关的连接,也都必须发送到相同的防火墙。例如,FTP或流媒体等协议,数据连接和控制连接必须发送到相同的防火墙。当一台防火墙执行状态检测时,在允许数据连接通过之前,它会查找是否存在相应的控制连接。这两个条件可以统称为粘性连接或者会话保持。
6.3.1数据包流程分析
防火墙负载均衡时数据包处理流程如图6.3所示。在分析数据包处理流程之前,需要先解决一个关键的问题,负载均衡器是如何识别需要进行负载均衡的数据包的呢?在服务器负载均衡的环境中,所有服务器都通过负载均衡器上配置的VIP对外提供服务。所有目的地址是VIP的数据包都被负载均衡到服务器上,其他的流量只作简单的二、三层交换,当然这还要取决于负载均衡产品本身及其配置。在防火墙负载均衡的情况下,防火墙只是一个中间设备。如果数据包的目的IP地址是防火墙的地址,那么这个数据包确定是到防火墙的。例如,我们需要通过Telnet来管理防火墙,负载均衡器将会收到Telnet请求的数据包,其目的地址是某一台防火墙的IP地址,这样的数据包不能被负载均衡。而是要根据数据包的目的地址,转发到指定的防火墙。但是其他所有的数据包,目的地址不是防火墙的IP地址的,都可以被负载均衡。
图6.3 防火墙负载均衡时的数据流
总的说来,流经负载均衡器的流量可以分为两种类型:流入防火墙的流量和从防火墙流出的流量。如果流量是从防火墙流出的,负载均衡器只需要转发这些流量就可以了。
对于一个流入防火墙的数据包,负载均衡器必须首先确定数据包的目的地址是否是某一台防火墙的IP地址。如果是,负载均衡器必须根据数据包的目的IP地址将数据包转发给指定的防火墙。否则,负载均衡器有两种选择:负载均衡或者会话保持。
如果数据包是一个新的连接,比如一个TCP SYN数据包,负载均衡器必须首先检查它与现有连接的是否相关联,比如FTP的情况。如果这个数据包与现有的连接有关联,负载均衡器必须把数据包发送至同一台防火墙上,这台防火墙就可以正常处理相关的连接。如果这个数据包与现有的连接没有任何关联,负载均衡器就会根据负载均衡算法选择一台防火墙,并将数据包转发到这台防火墙。
如果数据包是现有连接后续的请求或者响应,负载均衡器必须将数据包发送到之前处理这个连接的防火墙。
现在,我们讨论一下两台负载均衡器是如何处理请求和响应的,需要执行那些具体的动作。
更详细点说,我们把流经负载均衡器的流量划分为四种类型,如图6.4所示,不同类型的流量,负载均衡器会采取不同的动作。
图6.4 防火墙负载均衡时请求和回复数据流
由外部网络发起的请求数据包:负载均衡器1根据负载均衡算法选择一台防火墙并转发数据包;数据包被防火墙处理并转发给负载均衡器2,负载均衡器2对数据包不需要做任何处理,只需要简单地转发出去。
由内部网络向外部网络发送的响应数据包:负载均衡器2必须把这些响应数据包发送给之前处理这个连接的防火墙上面。由于防火墙会执行状态检测,只有处理了请求数据包的防火墙才能够处理相应的响应数据包。一旦这些响应数据包被防火墙转发给负载均衡器1,负载均衡器1对数据包不需要做任何处理,只需要简单地转发出去。
由内部网络发起的请求数据包:负载均衡器2根据负载均衡算法选择一台防火墙并转发数据包;数据包被防火墙处理并转发给负载均衡器1,负载均衡器1对数据包不需要做任何处理,只需要简单地转发出去。
由外部网络向内部网络发送的响应数据包:负载均衡器1必须将这些响应数据包发送到之前处理这个连接的防火墙上面。一旦防火墙把这些数据包转发给负载均衡器2,负载均衡器2会把数据包转发到内部网络。
6.3.2负载均衡方法
负载均衡方法和会话保持机制是彼此紧密联系的,下面我们讨论几种不同的负载均衡方法,跟服务器负载均衡一样,主要分为有状态的和无状态的两种。
无状态负载均衡算法
使用无状态的负载均衡算法,负载均衡器只需要对数据包中指定的字段执行哈希计算即可,根据计算结果转发到相应防火墙上面。需要计算的字段至少要包含数据包的源IP地址或者目的IP地址,并且可以选择包含TCP或UDP端口。是否可以选择这些字段进行哈希计算取决于负载均衡产品本身,因不同厂家的产品而异。
假设我们选择源IP地址和目的IP地址来进行哈希计算,如图6.5所示,两端的负载均衡器会对每个数据包的IP地址字段执行哈希计算,并且根据计算结果选择相应的防火墙。使用这种方法,给定的两个IP地址,例如IP1和IP2,它们之间的所有流量都会流经同一台防火墙。因为两端的负载均衡器都使用完全相同的哈希算法,这个方法能同时保证会话保持和负载均衡。
图6.5 无状态负载均衡
负载均衡器1和负载均衡器2采用完全相同的哈希算法是非常关键的,以此来保证会话保持。如果负载均衡器1基于源IP地址和源端口进行哈希计算,而负载均衡器2基于源IP地址和目的IP地址来进行哈希计算,就无法保证会话保持。
在图6.5的示例中,由于哈希算法中没有使用TCP或UDP端口,所以两个IP地址之间的所有流量都将流经同一台防火墙。如果哈希计算时除了计算IP地址还包含端口号的话,流量的负载分发将更加精细。但是必须注意类似FTP之类的协议,数据连接和控制连接使用不用的端口号,需要确保负载均衡器有正常处理此类协议的功能。考虑到防火墙的状态检测,此类协议的相关连接必须被发送到同一台防火墙上。
无状态负载均衡仅提供简单的负载分发,并且通过在两端的负载均衡器上使用相同的哈希算法来保证会话保持。然而,无状态负载均衡不能像有状态的负载均衡那样提供精细的负载分发策略。也就是说,当一台防火墙故障时,无状态负载均衡可能会导致所有流经防火墙的连接中断。假设有四台防火墙,使用无状态的负载均衡算法,也就是简单的哈希计算,正如第二章讲到的那样,当一台防火墙故障时,负载均衡器必须为所有的数据包重新计算哈希值,并且哈希值是在1和3之间的一个数。这将会导致所有的会话在三台正常工作的防火墙之间重新分配。这不仅仅导致第四台防火墙上的会话被重新分配,其他正常工作的防火墙上的会话也会被重新分配。Hash Buckets算法可以解决这个问题,并且能保证正常工作的防火墙上的会话不受影响。
有状态负载均衡算法
使用有状态负载均衡算法,负载均衡器在每一个连接发起的时候就为其选择一台防火墙。
使用这种算法,负载均衡器维护一个会话表,追踪每个TCP和UDP会话,以提供精细的负载均衡。对于TCP和UDP以外的流量,负载均衡器只考虑数据包的源地址和目的地址,将其视为一个特定源IP地址和目的IP地址之间的一个会话。负载均衡器可以使用最少连接数之类的负载均衡算法,来提供精细的负载均衡。和无状态负载均衡不同的是,有状态负载均衡在分配负载的时候会考虑每台防火墙上的负载情况。由于TCP是一个面向连接的协议,负载均衡器能够很容易地追踪到会话的发起和终止。但是UDP是无连接的协议,负载均衡器第一次收到一个源IP、目的IP、源端口和目的端口组合的UDP数据包可以标记为一个UDP会话的开始。对于UDP会话的终止,负载均衡器需要采用一种超时机制来清除UDP会话记录。
当使用有状态负载均衡时,保证会话保持是很复杂的。假设数据流从左边发起,如图6.6所示。当负载均衡器1接收到一个TCP SYN的数据包时,它根据防火墙的负载状况选择了防火墙2。负载均衡器1会在会话表里添加一条会话记录,并把此数据包转发给防火墙2。当负载均衡器2从防火墙2接收到这个TCP SYN的数据包时,它在会话表里创建一条记录以便记住这个会话与防火墙2的关联。当收到这个会话后续的任何一个数据包时(如一个SYN ACK的响应数据包),负载均衡器2会查找会话表,找到这个会话与防火墙2的关联,并将数据包转发到防火墙2。类似地,当收到一个TCP FIN或者TCP RESET数据包时,负载均衡器从会话表里清除相应的会话记录。
图6.6 有状态负载均衡
使用有状态负载均衡时,负载均衡器必须具有特殊的功能,来保证FTP和流媒体之类应用的会话保持。例如,当发起一个FTP数据连接时,负载均衡器必须在会话表里查找相关的控制连接,并且将数据连接转发至处理控制连接的同一台防火墙上。
在有状态负载均衡里,负载均衡器能很容易地应对防火墙故障的情况,因为负载均衡器准确地知道哪些会话被分配到出现故障的防火墙上面,负载均衡器仅在其他正常工作的防火墙中重新分配这些会话即可。
6.3.3 检查防火墙的健康状况
防火墙健康状况检测是负载均衡器功能里很重要的一部分。检查防火墙的健康状况与检查服务器的健康状况稍微有些不同。防火墙实际上是采用访问控制与安全策略的包转发设备。一个好的防火墙健康检查必须能检测出防火墙能否正常转发数据包,也就是说,防火墙两端的网络端口以及网络连接必须都是正常的,才能保证防火墙的正常工作。由于防火墙两端都有负载均衡器,每台负载均衡器都会发起一些专门的健康检测数据包,以探测防火墙是否正常工作。不同厂商的负载均衡产品,具体的检测机制都有所不同。由于防火墙可能有多个网络接口,穿过防火墙的每条可达路径都必须检测到。一台负载均衡器检测防火墙健康状况的频率决定了它需要多久才能检测到防火墙的故障。另一方面,健康检测太频繁也会给负载均衡器和防火墙带来额外的流量和工作负担。跟服务器负载均衡一样,流量的带内健康检查可以帮助负载均衡器有效地监测防火墙地健康状况,而不用产生额外的带外健康检查。
6.4 了解防火墙负载均衡中的网络设计
本节讨论如何设计网络结构才能实现防火墙负载均衡,整个设计中需要合理地配置路由器、负载均衡器、以及防火墙。为了理解这些,我们需要了解防火墙和负载均衡器如何在网络中部署,以及它们是如何跟路由器互联的。
6.4.1 防火墙与负载均衡器的类型
在第四章服务器负载均衡中,我们讨论过负载均衡器在二层或者三层是如何工作的。防火墙负载均衡也类似,存在几种不同类型的防火墙。
一般来讲,防火墙分为三种类型:三层防火墙,二层防火墙和代理防火墙,主要区别在于它们的工作方式、安装在网络中的位置以及在做防火墙负载均衡时不同的要求。
三层防火墙
顾名思义,三层防火墙的网络行为就跟三层交换机一样。需要在防火墙上配置三层的路由信息,这样防火墙才能正常转发数据包。当接收到一个数据包,防火墙首先应用安全和访问控制策略来判断是否允许这个数据包通过。如果是允许通过,防火墙会根据数据包里的目的IP地址决定这个数据包的下一跳。CheckPoint、Nokia以及NetScreen(2004年被Juniper收购)这几个厂商的防火墙都是三层防火墙。
二层防火墙
二层防火墙的网络行为就跟二层交换机一样,不需要配置任何的三层路由信息。二层防火墙在转发数据包时,只根据二层信息来转发,比如目的MAC地址。Lucent公司的Brick就是二层防火墙。
不管是二层防火墙还是三层防火墙,为了安全和接入控制,它都可以检测数据包中任何一层的信息,只不过是类型不同,转发数据包的方式不同。
代理防火墙
代理防火墙会终结客户端的连接,代替客户端与另一端进行通讯。例如,如果内部网络的主机A发起对Internet上主机B的访问,对于主机A来说,代理防火墙就是主机B;反过来也一样。通过终结连接的方式,防火墙明确知道用户想做什么,并且决定是否允许其通过。Network Associates公司的Gauntlet就是一款代理防火墙。
本章我们主要讨论二层防火墙和三层防火墙的负载均衡,可以把代理防火墙看作三层防火墙,只是稍有不同而已。
6.4.2 三层防火墙负载均衡中的网络设计
下面,我们来讨论三层防火墙负载均衡的网络结构,如图6.7所示:
图6.7 三层防火墙负载均衡的网络设计
首先,假设负载均衡器工作在二层模式下。在这种情况下,为了使数据包能到达内网,必须将防火墙的IP地址配置成路由器A的下一跳,因为防火墙是路由器A后下一个三层设备。防火墙将路由器B看作是到达内网的下一跳,将路由器A看作是到达外网的下一跳。
由于存在有多台防火墙,路由器只能指定其中一台防火墙的IP地址作为下一跳。假设路由器指定防火墙1为下一跳。为了路由数据包,路由器使用ARP协议查找防火墙1的MAC地址。路由器使用超时机制来刷新它的ARP表以便发现MAC地址更新。假设ARP表的过期时间是5分钟,路由器会在5分钟后清除防火墙1的ARP记录,并且重新查找。如果防火墙1是正常工作的,不会出现任何问题。但是如果防火墙1发生故障,路由器A将会认为下一跳故障,无法继续转发任何到内网的数据包。即便其他的防火墙还能正常工作,流量也无法正常转发进来。为了避免这个问题,必须在路由器上配置一个静态的ARP记录,也就是说在路由器上手工配置防火墙1的MAC地址的静态记录。采用这种办法,路由器就不必通过ARP方式查找下一跳的MAC地址了。相反地,它使用这个静态配置的MAC地址作为下一跳。即使防火墙1发生故障,路由器A也能正常转发数据包。一旦负载均衡器1接收到数据包,它就会执行负载均衡。也就是说,在保证会话保持的前提下,在正常工作的防火墙之间分发数据包。如果防火墙1发生故障,负载均衡器就会把数据包转发给防火墙2。
由于防火墙在三层模式下工作,路由器A在转发数据包时,它会将目的MAC地址设置为防火墙1的MAC地址。如果负载均衡器决定将数据包发送至防火墙2时,在转发数据包之前,负载均衡器必须将目的MAC地址改为防火墙2的MAC地址。如果防火墙2允许数据包通过,它将数据包的MAC地址改为路由器B的MAC地址,这样数据包就进入内网。
如果负载均衡器在三层模式下工作,为了让数据包到达内网,路由器A将负载均衡器1作为下一跳。由于路由器的下一跳不再指向任何一台防火墙,就没有必要在路由器中配置静态的ARP记录了。
6.4.3二层防火墙负载均衡中的网络设计
我们首先来讨论负载均衡器工作在二层模式下的情况。由于防火墙也是二层的,为了达到内网,路由器A唯一的下一跳是路由器B,如图6.8所示。由于在路由器A和路由器B之间没有三层设备,所以路由器A的下一跳必须配置成路由器B。一旦负载均衡器从路由器接收到数据包,它就会按照惯例执行负载均衡和会话保持。但是在这个拓扑中,在负载均衡器和二层防火墙之间就存在一个二层环路,如图6.9所示。因此,就要求负载均衡器必须具备特殊的功能来避免二层环路。
图6.8 二层防火墙负载均衡的网络设计
图6.9 二层防火墙负载均衡设计中的二层环路
在这种情况下,在将数据包发送到内网的过程中,一旦路由器A将目的MAC地址设置成路由器B的MAC地址,由于在路由器A和路由器B之间没有三层设备,目的MAC地址不会发生改变。
现在让我们考虑一下负载均衡器作为三层设备的情况。这时,路由器A将负载均衡器1看作到达内网的下一跳。负载均衡器1将负载均衡器2看作下一跳,而负载均衡器2将路由器B看作到达内网的下一跳。当负载均衡器1通过防火墙将数据包发送到负载均衡器2时,在它将数据包发送到防火墙之前,它必须将数据包的目的MAC地址设置为负载均衡器2的地址。由于防火墙是一个二层设备,一旦它决定要允许数据包通过,它会根据目的MAC地址对数据包进行二层转发。
6.5防火墙的高级话题
在这个部分,我们会讲到一些防火墙的高级话题,这会影响到防火墙负载均衡的网络设计。
6.5.1 防火墙的同步
当客户发起一个会话时,防火墙会根据安全策略来决定是否允许其通过。如果防火墙允许会话通过,它会为这个会话维持一个状态记录,以便转发后续的数据包,一直到会话结束。但是在任意一个时刻,只有一台防火墙在维护这个会话的信息。如果一台防火墙故障,负载均衡器可以将故障防火墙上的会话转发到其他防火墙。但是其他的防火墙将会阻止这些流量,因为它们没有这些会话的状态记录。必须终止这些会话并且重新建立一次连接,才能够使会话通过防火墙。防火墙同步可以解决这个问题,是否支持同步因不同厂家的防火墙产品而异。在防火墙的同步中,一台防火墙与其他防火墙共享会话的状态记录,以便对于一个特定的会话,任何一台防火墙都可以处理。然而,只要防火墙处于正常工作的状态,基于性能的考虑,对于一个给定会话的所有流量只能通过一台防火墙。如果一台防火墙发生故障,负载均衡器会将流量转发至另外一台防火墙,这台防火墙已经同步了所有的会话信息,所以不会造成连接的中断。随着防火墙数量的增加,每台防火墙都必须处理来自其他防火墙的同步信息,所以同步的开销越来越大,并且性能会不断降低。
如果防火墙都实现了同步,在防火墙负载均衡中,当一台防火墙发生故障时,我们就可以实现有状态冗余,已有的会话可以继续正常通讯而不会被中断。
6.5.2 执行NAT的防火墙
很多防火墙都内置了NAT(网络地址转换)的功能,这样内部网络就可以采用私有的IP地址。但我们关心的是在防火墙负载均衡中的NAT,因为它可能会影响到防火墙的会话保持。当一台防火墙执行NAT时,如图6.10所示,它会根据数据包的方向来改变目的IP地址或者源IP地址。每台防火墙都会配置一个用来做NAT的IP地址。例如:内部客户端10.10.10.20发起一个访问外部网络208.100.20.100的请求数据包,防火墙2收到之后,会把源IP地址从10.10.10.20转换成NAT地址209.157.23.111。
图6.10 NAT模式的防火墙负载均衡
如果我们使用无状态的负载均衡算法,两端的负载均衡器会产生不同的哈希值,因为防火墙的NAT已经改变了数据包的IP地址。假设负载均衡器根据数据包的源地址和目的地址进行哈希计算,从而选择防火墙来转发数据包。负载均衡器1接收到的响应数据包是从208.100.20.100发送到IP地址209.157.23.111,而负载均衡器2接收到的请求数据包是从10.10.10.20发送到IP地址209.157.23.111,这会导致两个负载均衡器为同一个会话选择不同的防火墙,破坏了会话保持。为了避免这个问题,需要负载均衡器进行逻辑判断,如果目的地址是NAT的IP地址,那么就把数据包发送到NAT地址对应的防火墙上面,而不是负载均衡。所以在这个例子里,负载均衡器1只需要把数据包发送给防火墙2即可,因为数据包目的地址是防火墙2的NAT地址。
6.6解决高可用性
到目前为止,我们只提到了解决防火墙单点故障的问题。但是引入负载均衡器之后,使得负载均衡器本身也成为一个单点故障。我们可以在防火墙的每一端都放置两台负载均衡器,负载均衡器可以工作在主-备模式或者主-主模式下。这种方案共需要四台负载均衡器,显然会增加总体的成本并且也会使架构设计变得更加复杂。在进行高可用性防火墙负载均衡设计之前,必须先了解负载均衡器和防火墙自身都能提供哪些高可用的特性。比如,负载均衡器是否提供热插拔冗余电源,热插拔卡或者冗余管理模块?所有这些特征都有利于增加负载均衡器的可靠性,在部件出现故障时能够减少停机时间。一般情况下,负载均衡器的可靠性比基于服务器架构的防火墙要高一个级别。对某些网络环境来说,这已经足够了。但是为了避免负载均衡器的故障,可以在适当的位置使用两台负载均衡器来提高可用性。
现在我们来了解一下高可用的防火墙负载均衡是如何工作的。如图6.11所示,在这个方案中,防火墙的每一端都放置了两台负载均衡器。在实际网络部署中,负载均衡器之外会额外部署两台路由器。虽然负载均衡器也具备路由功能,但是由于其每个端口的成本很高,并且端口数量和支持的路由协议都不及路由器,所以一般不会将负载均衡器当作路由器来使用。而且,很多网络都有路由器。所以,站在保护投资的角度,在部署负载均衡器时,需要充分利用已有的路由器。路由器同样需要部署两台,否则路由器会成为单点故障。很多大型企业的网络已经实现了高可用性,采用两台路由器分别连接到两个不同的服务提供商,同时提供Internet接入。
图6.11 防火墙负载均衡的高可用设计
如图6.11,为了避免路由器的单点故障,在每对负载均衡器一端都部署两台路由器。路由器运行VRRP(虚拟路由器冗余协议)之类的冗余协议,确保在路由器发生故障时能够互为备份。VRRP协议与思科独有的HSRP协议功能类似,在RFC2338中详细定义了VRRP。使用VRRP时,两台路由器共享一个VRRP的IP地址。一台路由器为主控路由器,负责处理所有跟这个VRRP IP地址相关的流量,另外一台路由器作为这个VRRP IP地址的备份。跟路由器相连的设备需要把默认网关或者下一跳指向VRRP的IP地址。通过采用两台路由器共享一个VRRP IP地址的方式,所有把路由器作为下一跳或者默认网关的设备都将可以在这台路由器故障时,切换到正常工作的另外一台路由器上。
6.6.1 主-备模式还是主-主模式
在高可用的方案设计中,防火墙两端的负载均衡器组有两种工作模式可选,主-备模式或者是主-主模式。在主-备模式中,主负载均衡器执行防火墙负载均衡的流量分发,而备用负载均衡器实时监控主负载均衡器的健康状况,一旦主负载均衡器发生故障,随时接管负载均衡分发的工作。主备负载均衡器之间可以同步所有的会话信息,这样就可以提供有状态的冗余切换。主-备模式特点是保证路由器和防火墙将流量发送至主负载均衡器,并且在主负载均衡器发生故障时能够将流量切换至备用的负载均衡器。要实现主-备工作模式,只需要在两台负载均衡器之间运行VRRP之类的协议即可。在这种情况下,路由器的默认网关需要指向负载均衡器上设置的VRRP的IP地址。
在主-主模式的设计中,两台负载均衡器在保证到防火墙的会话保持的同时,必须都执行防火墙负载均衡功能。同一个连接的多个数据包可能会通过任何一台负载均衡器。所以,需要在两台负载均衡器之间保持同步。使用有状态的负载均衡时,负载均衡器之间需要完全同步会话表。如果使用无状态的负载均衡,两台负载均衡器必须采用相同的哈希算法,才能保证负载分发的一致性和会话保持。
显而易见,采用有状态负载均衡,并且让负载均衡器工作在主-主模式下是实现高可用性防火墙负载均衡的最佳方案。有状态的负载均衡可以提供更好的负载分发,并且可以实现有状态的冗余切换,而主-主的工作模式可以同时使用两台负载均衡器,从而使处理能力加倍。
6.6.2 路由器与负载均衡器之间的交互
在高可用设计中,我们需要了解数据流在路由器和负载均衡器之间是如何流动的,当流量到达负载均衡器之后,它又是如何选择防火墙并转发流量的。
路由器、负载均衡器和防火墙之间的路由,可以使用静态路由协议或者动态路由协议,如OSPF(开放最短路径优先)。防火墙上面通常采用静态路由,因为静态路由配置方便,并且容易排查故障。然而,路由器与负载均衡器之间最好使用动态路由,接下来我们就讨论一下使用动态路由的优点。
首先,我们讨论一下负载均衡器在主-备工作模式下使用静态路由的情况。如图6.12所示,路由器1和路由器2将VRRP-IP3作为下一跳,这就是它们到达内部网络的静态路由。假设负载均衡器1是主设备,负责管理VRRP-IP3,所以路由器1和路由器2都将流量转发至负载均衡器1。如果负载均衡器1故障,负载均衡器2接管VRRP-IP3,那么两台路由器就都将流量转发至负载均衡器2。从负载均衡器流向外部网络的流量也一样,负载均衡器有一条静态路由指向VRRP-IP1,这样才能把数据包转发到外部网络。如果路由器1掌管VRRP-IP1,那么负载均衡器1的所有流量都会转发到路由器1。这种方案最大的局限性在于,由于工作在主-备模式下,负载均衡器一半的吞吐能力没有被利用。入向的流量可以通过两台路由器转发到负载均衡器,但是出向的流量只能通过负载均衡器1转发到掌管VRRP-IP1的路由器。
图6.12 主-备模式中路由器和负载均衡器之间的交互
接下来我们讨论负载均衡器在主-主模式下工作的情况,如图6.13所示,两台负载均衡器都对防火墙做负载均衡。为了充分利用每一台负载均衡器的吞吐能力,我们必须将流量分发到两台负载均衡器上。一种实现方法就是在负载均衡器上配置两个VRRP-IP地址,如图6.13所示,每台负载均衡器掌管一个不同的VRRP-IP地址。这很类似于服务器负载均衡,每台负载均衡器掌管不同的VIP。但是在这种情况下,还需要在路由器上面做相应配置才能使得它在负载均衡器之间分发流量。我们可以在每台路由器上都配置两条静态路由,一条路由指向VRRP-IP3,另外一条指向VRRP-IP4,并且让路由器在这两条路径上分发流量。但并不是所有的路由器都支持在多条静态路由之间分发流量。如果不支持的话,我们只能在每台路由器上配置一条静态路由,分别指向负载均衡器上不同的VRRP-IP地址。也就是说,在路由器1上配置一条静态路由到VRRP-IP3,在路由器2上配置一条静态路指向VRRP-IP4。这样来自不同路由器的流量就会被转发到不同的负载均衡器,实现了在两台负载均衡器之间分发流量。
图6.13 主-主模式中路由器和负载均衡器之间的交互
除了使用静态路由,我们还可以使用动态路由协议,比如OSPF。OSPF本身就可以在到达同一个目标的多条路由之间分发流量,也就是ECMP(Equal-Cost Multipath)。使用OSPF,每台路由器配置两条OSPF路由,一条路由指向VRRP-IP3,另外一条指向VRRP-IP4。每台路由器都使用ECMP在两台负载均衡器之间来分发流量。两台负载均衡器工作在主-主模式下,同时对防火墙做负载均衡,可以获得更好的扩展性。
对于从负载均衡器到路由器的流量,也可以使用类似的路由配置,把出向的流量分发到两台路由器上面。
6.6.3 负载均衡器与防火墙之间的交互
在之前的方案中,所有的防火墙的每一端都连接到一台负载均衡器上。采用高可用的设计方案,在每台防火墙的两端,每端都有两台负载均衡器。负载均衡器和防火墙之间有两种连接方式。第一,每台防火墙都连接至两个负载均衡器,如图6.14所示,这样就要求每台防火墙至少有四个网络接口,而以前的设计方案中,只需要两个网络接口就可以了。采用这种方案时,最好采用主-主模式的防火墙负载均衡,这样防火墙上所有网络接口都可以处理流量。使用主-备模式的防火墙负载均衡时,防火墙的网络接口将工作在主-备模式下,这会导致一个问题,当防火墙的一个网络接口故障时,负载均衡器可能不会切换,反之亦然。
图6.14 防火墙和负载均衡器之间的交互
虽然每台防火墙使用四个网络接口可以提供更好的扩展性,但是有些防火墙安装额外网络接口的费用很高。如果只用两个接口的话,防火墙每端只连接到一台负载均衡器,如图6.15所示,四台防火墙分成两组,分别连接到两台负载均衡器。每台负载均衡器既可以在与它直接相连接的防火墙之间分发流量,也可以经由另外一台负载均衡器在其他两台防火墙之间分发流量。这种方案结构简单,而且需要的网络接口也少,不用额外购买网络结构,然而缺点是如果一台负载均衡器故障,就有一半的防火墙无法访问。不过对于某些用户来说,或许这是可以接受的。
图6.15 防火墙和负载均衡器之间的交互
不管选择哪一种高可用防火墙负载均衡的设计方案,都会显著增加复杂性。不过,话又说回来,网络管理员可能会喜欢这种设计方案所带来的高可靠性和容错能力。
6.7 多区域防火墙的负载均衡
到目前为止,我们已经讨论过防火墙通过两个接口连接外部和内部网络的配置。对于内部网络的所有主机防火墙都执行相同的访问控制策略。能否把整个内部网络划分出不同类型的区域呢,让每个区域都有自己的访问控制策略。网络中都有对外部网络提供服务的Web服务器或者FTP服务器,一般网络管理员都会为所有这些主机创建一个单独的区域。在多个互相隔离的区域上同时对防火墙做负载均衡,就称作多区域防火墙的负载均衡。为Web服务器和FTP服务器单独创建的区域,通常被称之为DMZ区,如图6.16所示。
图6.16 多区域防火墙
多区域防火墙负载均衡如图6.17所示,负载均衡器识别每个数据包的目的区域并将数据包转发至相应的防火墙。为了实现上述目标,需要提前在负载均衡器上面配置不同区域网络的IP地址段。
图6.17 多区域防火墙的负载均衡
随着区域数量的增加,多区域防火墙的负载均衡就变得越来越复杂。如果在多区域防火墙的负载均衡结构中实现高可用性,那么方案中设备的数量将会多得无法管理。幸运的是,有些负载均衡产品只要一台设备就可以支持防火墙不同区域的负载均衡,这样就可以显著减少方案中所需要的负载均衡器的数量,从而简化整个方案设计。
6.8 VPN负载均衡
VPN是一种特殊的防火墙设备,在公网上两台主机之间提供安全的连接。一般来说,VPN设备主要用来在互联网上为公司总部和分支之间提供安全的访问通道。VPN设备之间通讯采用工业标准的IPSEC协议。防火墙设备一般都提供VPN功能。对VPN连接做负载均衡需要特殊的配置,并且取决于VPN设备的工作方式。使用IPSEC协议封装的数据包除了包含源地址和目的地址的IP头之外,其他内容都是加密的。如果需要对VPN设备做负载均衡的话,用户需要跟负载均衡器设备提供商确认其产品是否支持此功能。
6.9 小结
由于防火墙是所有企业网络中必不可少的一部分,防火墙负载均衡对网络管理员来说是解决防火墙扩展性、可管理性以及可用性的一个强大的工具。跟服务器负载均衡一样,有状态的防火墙负载均衡可以提供有状态冗余切换,并且能够提供更好的负载分发,是最佳的选择。让负载均衡器工作在主-主模式下,并且让防火墙做到同步,就可以在防火墙或者负载均衡器出现故障时,做到有状态的冗余切换,能够获得最高级别的可用性。防火墙负载均衡的方案设计比较复杂,特别是需要实现高可用性或者要实现多区域防火墙负载均衡的时候。

--------------------------------------------------------------------------------------------------------------------------------------

版权所有,转载请注明出处  京ICP备2021040351号