lvs全称Linux Virtual Server,是一款经典的负载均衡软件。其负载均衡方式为IP负载均衡,是众多负载均衡中效率最高的。LVS最大的特点是接受用户连接请求的服务器自身并不对请求产生应答,而是通过负载均衡调度,让真实服务器生成应答包并发送给用户

一、原理介绍

lvs中,接收用户请求并实现负载均衡的的服务器称为Director,负责对客户产生应答的服务器称为Real Server(后称RS)。在LVS的三种工作模式中,Direct Routing(后称DR)模式要求Director和Real Server处于同一子网,即要求RS可以接收Director的二层广播;NAT要求应答数据包经由Director的网络返回客户。因此DR模式和NAT模式都不适合公司使用。剩下的隧道模式正好可以支持Director和RS跨过WAN,因此在部署中使用隧道模式。

lvs隧道模式使用的是ip-ip隧道,是GRE隧道的其中一种,因此LVS隧道要求RS支持ip-ip隧道。已知CentOS 6已经原生提供ip-ip隧道支持,无需对内核进行额外的配置或更改。而CentOS 5等可能需要用insmod或重新编译内核等方式加上ip-ip模块。

lvs隧道模式:如何工作?

CIP为客户IP地址,VIP为对外服务的IP地址,DIP为Director用于和RS组建隧道的IP地址,RIP为为RS的IP地址。

  1. 客户访问网站,访问的是对外服务的IP地址,即VIP。因此客户电脑发送的IP包,源IP地址为CIP,目标IP为VIP,用(CIP, VIP)表示
  2. 经过路由,IP包到达Director,Director发现目标地址VIP正好是自己,接收这个包。
  3. LVS对客户IP包进行封装,发送给RS去处理,源IP地址为DIP,目标IP为RIP。经过封装后,IP包内容为[DIP, RIP(CIP, VIP)]
  4. RS收到3中所述IP包后,发现目标IP是自己,接收数据包。解包后,发现IP包还经过一层封装,继续解包,得到(CIP, VIP)的包。
  5. RS看到(CIP, VIP)后,因为RS配置了一个IP地址为VIP的虚拟隧道接口,也就是说,(CIP, VIP)的目的地址还是自己。
  6. 这时候,如果系统没有把包过滤掉,并且有监听在VIP的程序,该程序就会接收此包,并产生应答,并且按照默认路由返回给客户。

lvs基本工作过程:

客户请发送向负载均衡服务器发送请求。负载均衡器接受客户的请求,然后先是根据LVS的调度算法(8种)来决定要将这个请求发送给哪个节点服务器。然后依据自己的工作模式(3种)来看应该如何把这些客户的请求如何发送给节点服务器,节点服务器又应该如何来把响应数据包发回给客户端。

LVS的三种工作模式:

  1. VS/NAT模式(Network address translation)
  2. VS/TUN模式(tunneling)
  3. DR模式(Direct routing)

二、LVS部署安装

环境

服务器 ip 备注
lvs负载均衡器 192.168.1.110 vip地址:192.168.1.120
http服务器RS1 192.168.1.101 部署nginx测试
http服务器RS2 192.168.1.103 部署nginx测试
  1. 安装lvs软件
lsmod | grep ip_vs

输出如下,如果没有输出则需要执行modprobe ip_vs把ipvs模块加载进系统

ip_vs_rr                1420  1ip_vs                 125694  3 ip_vs_rrlibcrc32c               1246  1 ip_vsipv6                  334932  25 ip_vs

安装lvs管理工具ipvsadm(centos6已自带,无需安装)

yum install -y ipvsadm
  1. 配置lvs负载均衡器(DR模式,服务器:192.168.1.110)
  • 负载均衡器上配置vip地址
命令 说明
ifconfig eth0:1 192.168.1.120 netmask 255.255.255.0 绑定vip到网卡eth0:1
route add -host 192.168.1.120 dev eth0 所有目标地址是192.168.1.120的数据包都从本机eth0接口发送出去
  • ipvsadm添加lvs服务

| 命令 | 说明 | | ipvsadm -C | 清除lvs原先配置 | ipvsadm -A -t 192.168.1.120:80 -s rr -p 20 | 为Director添加处理规则:隧道处理来自vip192.168.1.120 80端口的访问,并且使用rr的负载均衡调度,保持会话20秒 | | ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.101:80 -g -w 10 | 为Director添加RS1节点(192.168.1.101),工作模式为DR模式,权重为10 | | ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.103:80 -g -w 10 | 为Director添加RS1节点(192.168.1.103),工作模式为DR模式,权重为10 |

  • 查看VIP和RS是否已经配置成功
ipvsadm -L -n
  • 输出如下
IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.1.120:80 rr persistent 20  -> 192.168.1.103:80             Route   10     0          0          -> 192.168.1.104:80             Route   10     0          0  
  1. 配置RS节点服务器(192.168.1.103、192.168.1.104)
命令 说明
ifconfig lo:0 192.168.1.120 netmask 255.255.255.255 up RS主机需要绑定VIP地址在LO接口上才能接收目标地址为VIP的包,否则会无法匹配当台机器IP而把数据包丢弃,但由于RS的VIP不是用来通讯,并且这里一定要设置24位掩码
route add -host 192.168.1.120 dev lo 所有目标地址是192.168.1.120的数据包都从本机lo接口发送出去
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce  echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore echo "2">/proc/sys/net/ipv4/conf/all/arp_announce arp抑制,拒绝接受arp更新并不发送arp宣告,避免当192.168.1.120 arp广播时,RS节点也回应导致ARP欺骗,永久修改要修改sysctl.conf参考:http://suchalin.blog.163.com/blog/static/55304677201022643431355/
  1. 测试lvs是否生效
  • 分别从不同机器访问http://192.168.1.120/并观察RS1、RS2的http日志
  • 如果平均两台都有访问日志即已经将192.168.1.120负载均衡到两台RS节点
  • 动态的查看ipvsadm的会话分配
watch ipvsadm -L -n
  • ipvsadm添加LVS服务
参数 参数说明
-A -A --add-service添加一个带选项的虚拟服务。Add  a virtual  service. A serviceaddress is uniquely defined by a triplet: IP address, portnumber,  and  protocol. Alternatively a virtualservice may be defined by a firewall-mark.
-t 指定虚拟服务器的IP地址和端口
-s -s,--scheduler scheduling-method 调度算法
-p 会话保持按秒计算
-a -a在对应的VIP下添加RS节点
-g 指定此LVS的工作模式为-g   -g为DR模式
-i 指定LVS的工作模式为-i  -i为tunnel模式
-m 指定LVS的工作模式为NAT模式
-w 指定RS节点的权重
-D 删除虚拟服务格式:ipvsadm-D -t
-C -C, --clear  Clear the virtual server table清空lvs原有的配置。
-set 设置tcp  tcpfn udp  的连接超时时间(一般来说高并发的时候小一点点。
-b fullnat模式
  • ipvsadm -ln:检查当前运行中的配置
  • ipvsadm -L -n:同上
  • ipvsadm -ln --stats:检查当前运行状态信息
  • ipvsadm -ln --rate:检查当前各RealServer的流量速度
  • ipvsadm -ln --connection/-c:检查当前回话连接的分配情况
  • ipvsadm -ln --persistent-conn:检查当前保持中的连接分配情况

ip地址欺骗问题

由lvs的工作方式可知,RS在应答客户的时候,所用IP地址并不是它自己的IP地址,而是一个虚拟的,在Director上真实存在的IP地址。因此对于ISP来说,这个数据包是疑似IP地址欺骗攻击的。对于这个问题,大部分的IDC会用uRPF技术去追踪包的路由路径,如果发现源IP地址不在IDC内,则认为是一个IP地址欺骗的包,然后将其丢弃。