LVS工作原理

LVS工作原理

  • ipvsadm:用户空间的命令行工具,规则管理器用于管理集群服务及RealServer。可以用来配置LVS的调度功能

  • ipvs:工作在内核空间netfilter的INPUT钩子上的框架

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT

  • lvs-dr:操纵封装新的MAC地址

  • lvs-tun:在原请求IP报文之外新加一个IP首部

  • lvs-fullnat:修改请求报文的源和目标IP

如果对于 iptables5 条链不了解的同学,麻烦先去看下这个知识点。这5条链是当数据包流向这台服务器的时候,数据包在服务器内核中的流向。可以参考下面:

iptables工作原理链接

LVS工作原理:

1、当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。

2、当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。

3、LVS 由用户空间的 ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。

4、如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。

5、最后经由POSTROUTING链发往后端服务器。

2.3.1 NAT 模式

lvs-nat:

本质是多目标 IP 的 DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的 RS 的 RIP 和 PORT 实现转发

(1)RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址;RS 和 DIP 如果在一个网段的网关要指向 DIP 而且 LVS服务器需要开启路由转发功能(也可以不在同一个网络,只需中间加一个交换机即可)

(2)请求报文和响应报文都必须经由 Director 转发,Director易于成为系统瓶颈

(3)支持端口映射,可修改请求报文的目标PORT (RS服务器的端口号可以不用标准端口只需在LVS服务器中定义规则指定相对应的端口)

(4)VS必须是Linux系统,RS可以是任意OS系统

LVS 有很多种模式来供我们选择,生产场景中一般使用的都是 NAT 模式和 DR 模式,当然,也并不是说其他模式并不会使用,还是要根据实际的生产场景来决定选择什么样的方案。

Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法 IP 地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省 IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的数据包经过调度器。

2.3.1.2 NAT 数据报文流转过程示意图

数据包流转的过程如上图所示:

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

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

  • (3) IPVS 比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至 POSTROUTING 链。 此时报文的源 IP 为 CIP ,目标 IP 为 RIP ,在这个过程完成了目标 IP 的转换。

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

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

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

LVS 在 NAT 工作模式中潜伏在 input 这个链中。一但发现用户数据包发到了 input 这个链中我就将其拦截,而这时 LVS 中定义了调度策略访问我VIP的请求就是往我rs服务器上发送的,然后将其截住在通过 postrouting 链发送到我们的 RS 服务器上。

2.3.1.3 NAT 工作模式访问过程图文解析

请求时:现在有一个客户端主机CIP来访问vip希望VIP能提供服务,这是CIP为请求发起者就是SRC源,他的目标是VIP所以VIP就是dest(目标)。但是VIP不提供任何服务所以只能通过调用后端RS主机服务,所以这时候就是CIP为源访问,而rs服务器就是目标地址dest(目标)。

然后响应时:当rs服务器收到了cip的服务访问请求现在将自己的服务发送出去,所以这时候rsip就是源,而cip就是目标地址,但是呢rsip是内网所以还得需要vip(LVS的外网ip)把他实现地址转换,这时候vip就是源而cip就是dest(目标)

这就是通过NAT模式实现了对LVS服务器的调度

2.3.1.1 NAT 模式优缺点

如下图所示,NAT模式中的一大缺点就是无论是请求的数据包,还是返回的数据包,都必须要经过负载的这个点,请求的数据包一般内容较少,问题不是很大,而返回的数据包,一般都是图片,视频等等,这会给中间的调度器带来巨大的负担。

LVS中NAT模式的优势:

只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。

LVS中NAT模式的缺点:

因为不论是客户请求还是响应客户,都得需要通过LVS服务器,所以就会导致LVS单台服务器压力过大,并发数不能过大。

2.3.2 DR 模式

Virtual Server via Direct Routing (VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。

LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标 MAC 是某挑选出的 RS 的 RIP 所在接口的 MAC 地址;源 IP/PORT,以及目标 IP/PORT 均保持不变

直接路由:请求报文和响应报文并不是同一个路径,请求报文经过LVS发送给RS。当RS收到请求报文在回应的时候不需要原路返回,可以直接返回给客户端。DR工作模式带来的好处就是将LVS服务器的压力变小了。

(1)Director和各RS都配置有VIP

(2)确保前端路由器将目标IP为VIP的请求报文发往Director

在前端网关做静态绑定VIP和Director的MAC地址

(3)RS的RIP可以使用私网地址(最好就应该是私网),也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director

(4)RS和Director要在同一个物理网络

(5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往 Client

(6)不支持端口映射(端口不能修败)

(7)RS可使用大多数OS系统

在RS上使用arptables工具

arptables -A IN -d $VIP -j DROP 

arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP 

(最常用的)在RS上修改内核参数以限制arp通告及应答级别

/proc/sys/net/ipv4/conf/all/arp_ignore 

/proc/sys/net/ipv4/conf/all/arp_announce

arp_Ignore(不响应):

这个参数的功能是忽略:我们在RS服务器上修改这个内核参数,从而实现当CIP在找VIP的mac地址的时候,这两太RS服务器不会做以响应,因为这两台RS服务器上也有VIP的ip地址

arp_announce(不宣称):

这个内核参数的功能是,因为RS这两台服务器上都有vip服务器的ip地址,因为在第一次启动主机的时候,RS这两台主机会通过同一个网段的ARP免费广播向外宣传他们有这个ip地址的mac,但是修改arp_announce这个内核参数就会实现RS服务器不会自动发起ARP广播。

修改了这两个内核参数之后就实现了RS服务器不会自动宣传他们有VIP的mac地址,也不会去响应ARP广播说自己有vip的mac地址。就会默默拥有此地址,自然不会产生冲突

2.3.2.1 DR 模式工作原理

如上图所示,Director 和 REAL SERVER 都配置同一个 IP(VIP),Director 将该 IP 配置到对外的网卡上,Real server 将该 IP 配置到 lo 网卡上。配置 arp_ignore 为 1(目的是让数据包发出 apr 请求时,只有 Director 会响应该arp请求),所有 REAL SERVER 对本身这个 IP 的 ARP 请求保持静默。而 Director 收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为 REAL SERVER 的 MAC 并发给这台 REAL SERVER 。这时REAL SERVER 通过网卡 eth0 收到这个数据包,由于 Real Server 上的 lo 网卡配置的也有 VIP, 所以 R S接收该数据包。处理后直接返回给客户端(这里要配置 arp_announce ,目的是修改返回数据包的源 ip 地址。)。由于DR要对二层包头进行改换,所以 DR 和 REAL SERVER 之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

2.3.2.2 内核参数详解

  • arp_ignore

  • arp_announce

不修改的话,回答数据包源 ip 地址为 VIP,mac 为发送网卡的 mac 即途中的 eth0 ,那么交换机上更新 mac 表之后,就会发现 VIP 对应两条 mac 记录,一条对应 Director 的mac地址,一条对应Real Server的mac地址。就会使真正的VIP得不到正确的请求了

相对于 NAT 模式来言,DR 模式能够较好的解决上述问题,其数据在服务器集群中的流向如上图所示,请求报文经过LVS到达后端真实的WEB服务器,而响应报文,则直接发给客户端,并不需要通过调度器,而是通过RS服务器来进行响应。

数据包流转过程图:

1、 用户请求目标网站时,经过 dns 查询得到目的 IP 为 VIP ,目的端口为 80 ,于是客户端和我们 VIP ,端口80建立连接。当数据包到达VIP所在的局域网时,在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,因此需要将 IP 地址转换为MAC地址,因此会发出apr请求,查询VIP对应的mac地址。Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求。==我们在Real Server的lo网卡上配置了VIP,但是我们只想让Director上的网卡来响应我们的这个arp请求。因此就需要更改下我们的一些内核参数,具体含义见后文。这时,数据包就得到了二层的Director的传输地址。

net.ipv4.conf.lo.arp_igonre = 1
net.ipv4.conf.all.arp_ignore = 1

正常情况下只写第二条就是了,all 是指所有设备的interface,当all和具体的interface比如lo,按照最大的值生效;

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

3、PREROUTING检查发现数据包的目标IP是本机,就将数据包送至INPUT链

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

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

6、client 的请求被 Director 转发并经过链路层寻址到达 Realserver 后,由于 Realserver 的 lo 接口配置了 VIP (请求中的目标 IP 正是 VIP),所以接收请求并处理。处理完成之后,将响应报文通过lo接口传送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)然后向外发出。此时的源IP地址为VIP,目标 IP 为 CIP。==如果将源地址为VIP将数据包发送出去,那么最终交换机上会产生两条VIP对应的mac地址记录,一条是Director的mac地址记录,还有一条是Real server的mac地址记录,这将会导致真正的VIP无法接收到请求。==因此,此处要配置arp_announce,目的是为了修改源ip的目的地址。

net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

配置 arp_announce=2 ,选择该主机发送网卡上最合适的本地地址作为 arp 请求的源IP地址。

2.3.2.3 DR 模式的特性

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

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

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

4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server

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

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

7、RS的网关绝不允许指向DIP

8、RS上的lo接口配置VIP的IP地址

9、响应报文通过二层链路传输,最终送达至客户端。

2.3.2.4 DR 模式解决地址冲突的方式

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种: (1)在前端网关做静态绑定 (2)在各 RS 使用 arptables (3)在各 RS 修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore 0∶默认值,表示可使用本地任意接口上配置的任意地址进行响应 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

将arp_ignore设置成1系统默认是0。设置为1就是忽略对MAC地址的响应

[11:02:26 root@a7 ~]#cat /proc/sys/net/ipv4/conf/eth0/arp_ignore
0

限制通告级别:arp_announce

0︰默认值,把本机所有接口的所有信息向每个接口的网络进行通告 1∶尽量避免将接口信息向非直接连接网络进行通告 2∶必须避免将接口信息向非本网络进行通告

将arp_announce设置成2系统默认是0。第一次免费ARP广播的时候不宣传

[11:02:42 root@a7 ~]#cat /proc/sys/net/ipv4/conf/eth0/arp_announce 
0

2.3.2.5 DR 工作模式访问过程图文解析

src ip mac dest ip mac
cip mac:client xxxxx vip macr1 80
cip mac2 xxxxx vip maclvs 80
cip maclvs xxxxx vip mac rs1 80
vip macrs1 80 cip macrs2 xxxxx
vip macr1 80 cip mac client xxxxx

请求报文过程(目标mac都是离他下一跳最近的mac):

当客户端(CIP)向VIP发起请求时,源ip和源mac都是cip的mac(mac client),目标ip是VIP的但是目标MAC是离他最近路由面向互联网网卡的MAC地址macr1,

然后到了路由之后他的源ip是CIP而源MAC就变为了路由上链接内网网卡的MAC地址也就是MACR2。现在他的目标地址依旧是vip服务的ip地址他的mac地址也是vip服务器上面向路由的 maclvs。

接着到了VIP服务器上,他的源ip依旧是CIP服务器的ip因为是客户端发起的请求所以一直都是cip,但是他这时候的MAC地址就是MAClvs。目标的ip地址依旧是VIP因为RS服务器上绑定了VIP的ip地址。但是目标的MAC地址就变为了RS服务器的mac地址。由此我们发现在数据报文转发的时候只是修改了mac地址。(只修改数据链路层)

回应报文过程(回去时候每次都是最近的MAC):

这时候到了RS服务器的时候,就要开始做以回应,源是VIP地址但是mac地址就变为了RS服务器的mac地址。而目标ip是CIP但是要从路由器的网关出去所以目标MAC就为 macr2 ,到了路由之后他的源 IP 依旧是 VIP 但是 mac 地址就变为了路由链接外网的 MACR1 地址。而目标是CIP 目标的mac是mac client

以上就是LVS的DR工作模式流向图,只修改了MAC地址而不修改ip。因为在同一网络中是通过MAC实现通讯的而非IP(互联网也是一个大的同以网段)也就以为之DR工作模式不支持端口映射。所谓端口映射就是在内网中RS服务器必须是统一端口。

RS服务器如何得到LVS服务器的vipmac地址:这是事先在LVS服务器上也就定义好了他的RS服务器ip是多少。LVS通过LVS的调度算法,计算出将给那一台RS服务器。然后再将CIP的ip地址填写在这个请求包里。在通过APR广播就拿到RS服务器的mac地址。所以RS服务器和LVS服务器中间是不能有路由器的就必须是交换机

LVS的DR工作模式的三次握手(请求报文经过LVS服务器,回应报文直接给客户端)

第一次:CIP → RS服务器

第二次:CIP ← RS服务器

第三次:CIP → RS服务器

优点:大大减少了LVS服务器的压力。因为是通过后端的 RS 直接将响应报文发送给了 client ,不用再经过 VLS 调度器。

2.3.3 TUN 模式

1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

3.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现。

2.3.4 full-nat 模式

特点:

(1)RIP,DIP可以使用私有地址;

(2)RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;

(3)支持端口映射;

(4)RS的OS可以使用任意类型;

(5)请求报文经由Director,响应报文也经由Director

点赞