三角传输的在链路均衡项目中的灵活应用

首先需要解释一下三角传输的概念,该概念正常情况下适用于特定应用类型的服务器均衡项目中。为了明晰基本概念,我们先以正常环境下的数据流向示范。
常见的服务器部署方式中,最多的为旁路部署,因为该方式不需要用户改变网络拓扑结构,而旁路部署的特点就是,负载均衡设备的接口ip地址与服务器ip地址处于同一个网段(而根据vip地址是否也是属于同一个网段,分为了单臂旁路和双臂旁路)。为了简单起见,我们假设为单臂旁路方式。

在单臂旁路模式中,有2个关键设置:

1、服务器的默认路由是否指向负载均衡设备的接口地址
2、负载均衡在分发请求的时候是否改变请求的源IP地址。这两个设置是互斥的,设置了一个就不需要设置另一个。

假设源IP和端口为172.16.0.1:8000的客户端,,向目标ip为10.0.0.1:80的负载均衡设备上配置的虚拟IP发起请求;负载均衡上与这个虚ip关联的服务器真实ip为10.0.0.2,负载均衡设备资深IP为10.0.0.100;服务器的默认网关指向3层交换机的接口地址10.0.0.254。这个时候上面提到的2个关键都未设置,既负载均衡上未做snat,服务器网关也未指向负载均衡设备的接口ip,见图一:

从上图中可以看出,当172.16.0.1的请求通过三层交换机到达负载均衡的虚IP 10.0.0.1:80的时候,负载均衡设备将该请求的目标IP从10.0.0.1:80转换成10.0.0.2:80,并发给10.0.0.2,而该请求源IP由于未启用snat,所以仍旧为172.16.0.1:8000。可以看到,服务器10.0.0.2收到请求之后,因为请求的源ip为172.16.0.1,所以服务器应答的时候,会直接将应答通过自己设置的默认网关10.0.0.254直接发回给客户端(请求源地址为10.0.0.2)。
这个时候会发生什么情况?客户端是向10.0.0.1:80发起的请求,而应答确是来自10.0.0.2:80,tcp连接都无法建立。所以通信自然失败。。
如果上述2个关键点2选其一,既负载均衡设备上启用snat或者服务器的网关指向负载均衡设备接口10.0.0.100(以启用snat,既用10.0.0.100的接口ip做源地址转换为例),见图二:

由上图所示,服务器接到的请求,源IP为10.0.0.100,因此服务器的应答也会丢回给负载均衡设备,而负载均衡设备将应答修改成为源ip为10.0.0.1,目标ip为172.16.0.1的应答,然后返回给客户端,则这个时候连接建立。
一句话,正常情况下,从A10分发出去的请求是经过修改的,服务器如果直接将应答返回给客户端,连接时无法建立的,只有将应答返回给A10,A10进行修改以后返回给客户端才能建立连接。
上面洋洋洒洒写了这么多,只是为了介绍正常单臂旁路场景下的数据流向。下面进入正题,三角传输。
之所以上面要写那么多,是因为三角传输和正常场景下是有区别的。
见图三:

该图和第一张图非常相似,唯一的区别在于,服务器在发送响应客户端的请求的应答的时候,源IP采用的是10.0.0.1,而非第一章图中的自己的接口ip 10.0.0.2。这个时候,客户端收到的应答,源ip就成了10.0.0.1:80,目标IP为172.16.0.1:8000,所以连接成功建立。这种成功建立的方式,像一个三角形,所以称为三角传输。

从网络技术的角度来总结,三角传输既是负载均衡设备在分发请求到真实服务器上的时候,不改变请求的目标IP和源IP,直接通过2层通过mac地址将请求转发到服务器上。而服务器上启用loopback地址,该地址和负载均衡设备上虚拟IP一样。在服务器上启用该loopback地址的目的,在于让服务器能够接受从负载均衡设备转发来的目标ip为虚拟IP的请求包(服务器只接受目标IP为自己IP的包,所以必须有这个一个配置让服务器认为这个数据包是发给自己的。为什么启用loopback地址而不直接将该ip配置在服务器接口上呢?因为如果直接将ip配置在服务器接口上,则服务器就会响应该网络中对该ip地址的arp查询,而该ip地址已经配置在负载均衡设备上了,因此如果服务器和负载均衡设备同时配置该IP,典型的ip地址冲突。。。而loopback地址则不然,这个地址即使配置也不会响应外接的arp查询,因此不会冲突)。

好了,步入正题。其实在很多链路均衡项目中,客户原有网络出口设备很多都是防火墙,而防火墙上往往配置了很多应用,包括或者其他比较复杂的应用。这些应用无法迁移到链路均衡设备上,所以只能将原本出口的防火墙接在链路均衡设备之后,配置私有地址,公网映射建立在链路均衡设备上,然后在链路均衡设备上配置映射将公网来的对复杂应用的的访问转发到后端防火墙现在的私有地址上面去。一般情况下这样没问题,但是如果碰到某些特殊应用,这些应用不允许经过地址转换(可能有校验方面的需求),所以原本公网ip直接配置在防火墙上没有问题,但是一旦防火墙地址改为私网地址,通过新出口设备做映射时候就会发生问题。
这个时候,通过活用三角传输可以帮我们解决问题。前面我们提到了服务器负载均衡单臂旁路部署时候的三角传输,只需要服务器上启用loopback地址并配置成跟虚拟IP一样,同时负载均衡设备在转发请求的时候不改变请求的源和目标IP。而在链路均衡的时候,可以认为是双臂旁路的三角传输。
见图四:

如上图所示,客户端从公网来的请求到了链路均衡设备公网接口上,访问220.220.220.2:80,源ip为110.110.110.1:8000,然后链路均衡设备将这个请求转发到内网接口10.0.0.1对应的网段,并通过mac地址发往10.0.0.2对应的mac地址,请求包的源ip端口和目标ip端口均不作任何改变。内部防火墙上在接口上配置Secondary ip,该IP和映射的公网ip一致,既220.220.220.2,这样便于接受链路均衡设备通过mac地址发来的包(这里就是和单臂旁路的三角传输的区别了。单臂旁路结构的三角传输必须启用loopback地址来配置映射的公网ip,而双臂旁路三角传输,则可以直接将ip配置在接口上,因为不会发生ip地址冲突)。当设备收到请求以后,直接用公网ip为源ip,客户端ip为目标ip进行应答,因为设备默认网关指向链路均衡设备的内网口(这里也是和单臂旁路三角传输的区别,直接指回到链路均衡设备),10.0.0.1,所以应答会回到链路均衡设备,然后链路均衡设备将该应答直接转发给出口链路对端的网关。这样,一个活用三角传输就成功了,当然,从结构上来看,已经不算是三角了。