本文主要讲述一下LVS转发数据的原理。

1. NAT模式

1.1 NAT模式工作原理

lvs-nat-theory

1) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP;

2) PREROUTING检查发现数据包的目标IP是本机,将数据包发送至INPUT链;

3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发送至POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP;

4) POSTROUTING链通过选路,将数据包发送给Real Server;

5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server,此时报文的源IP为RIP,目标IP为CIP;

6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应客户端。此时报文的源IP为VIP,目标IP为CIP

1.2 NAT特性

  • RIP 最好是内网IP

  • RS的网关必须指向DIP

  • DIP和RIP必须在同一个网段内

  • 请求和回应的报文必须经过Director,因此Director容易成为瓶颈

  • NAT支持端口转发

2. DR模式

2.1 DR模式工作原理

lvs-dr-theory

1) 首先用户用CIP请求VIP

2) 根据上图可以看到,不管是Director Server还是Real Server上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求的数据包源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,因为我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发送给谁,这样一来我们的集群系统是不是没意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Server。

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore             ## 忽略收到的ARP请求
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce           ## lo接口不对外广播ARP数据
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

3) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP

4) PREROUTING检查发现数据包的目标IP是本机,将数据包发送至INPUT

5) IPVS比对数据包请求的服务是否为集群服务,若是,则将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发至POSTROUTING链。此时的源IP目标IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址

6) 由于DS和RS在同一网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server

7) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成后,将响应报文通过lo接口传送给eth0网卡然后向外发出。此时的源IP地址为VIP,目标IP为CIP

8) 响应报文最终送达至客户端

2.2 配置DR的三种方式

1) 方式1

在路由器上显式说明VIP对应的地址一定是Director上的MAC,只要绑定,以后再跟VIP通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由器设备必须有操作权限能够绑定MAC地址,万一这个路由器是运营商操作的,我们没法操作怎么办? 第一种方式固然很简便,但未必可行。

2) 方式2

在有些主机(例如: RedHat)上,它们引进了一种程序arptables,它有点类似于iptables,它肯定是基于arp或者MAC做访问控制的,很显然我们只需要在每一个real server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予响应,或者响应的报文不让出去,很显然网关(gateway)是接收不到的,也就只有director的响应报文才能到达gateway。

3) 方式3

在相对较新的版本中新增了两个内核参数,第一个是arp_ignore定义接收到ARP请求时的相应级别; 第二个是arp_announce定义自己的地址向外通告时的通告级别。

arp_ignore: 定义接收到ARP请求时的相应级别
            0 -- 只要本地配置有相应地址,就给予响应
            1 -- 仅回应目标IP地址为接收网卡本地地址的ARP请求
            2 -- 只响应目标IP地址为接收网卡本地地址的ARP请求,并且arp请求的源IP必须和接收网卡同网段
            4~7 -- 保留未使用
            8 -- 不回应所有ARP请求


arp_announce: 定义将自己的地址向外通告时的通告级别
            0 -- 将本地任何接口上的任何地址向外通告
            1 -- 试图仅向目标网络通告与其网络匹配的地址
            2 -- 仅向与本地接口上地址匹配的网络进行通告

2.3 DR模式特性

  • 保证前端路由将目标地址为VIP的报文统统发给Director Server,而不是RS

  • Director和RS的VIP为同一个VIP

  • RS可以使用私有地址,也可以是公网地址。如果使用公网地址,此时可以通过互联网对RIP进行直接访问

  • RS跟Director Server必须在同一个物理网络中

  • 所有的请求报文经过Director Server,但响应报文必须不能经过Director Server

  • 不支持地址转换,也不支持端口映射

  • RS可以是大多数常见的操作系统

  • RS的网关决不允许指向DIP(因为我们不允许响应经过Director)

  • RS上的lo接口绑定VIP地址

  • DR模式是市面上用的最广的

3. TUN模式

3.1 TUN模式工作原理

lvs-tun-theory

1) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP。

2) PREROUTING检查发现数据包的目标IP是本机,将数据包发送至INPUT

3) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文。封装的源IP为DIP,目标IP为RIP。然后发送至POSTROUTING链。此时源IP为DIP,目标IP为RIP。

4) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层多封装了一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP为DIP,目标IP为RIP。

5) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成后,通过lo接口发送给eth0接口,然后向外传递。此时的源IP地址为VIP,目标IP地址为CIP

6) 响应报文最终送达至客户端

3.2 Tunnel模式特性

  • RIP、VIP、DIP全是公网地址

  • RS的网关不会也不可能指向DIP

  • 所有的请求报文经过Director Server,但响应报文必须不能经过Director Server

  • 不支持端口映射

  • RS的系统必须支持IP隧道



[参看]

  1. LVS负载均衡之一:LVS-NAT、LVS-DR模式的原理详细介绍

  2. LVS系列—负载均衡之工作原理说明