工作模式
前言
- LVS是内核里的一个功能,而不是一个软件,因为集成在内核中,所以性能非常优秀,最高可以达到百万级并发响应
LVS集群中的术语
-
VS:Virtual Server LVS本身
-
RS:Real Server 后端真正提供服务的服务器
- lvs:Real Server
- nginx:upstream server
- haproxy:backend server
-
CIP:Client IP 客户端IP
-
VIP:Virtual serve IP LVS外网的IP
-
DIP:Director IP LVS内网的IP
-
RIP:Real server IP 后端真正提供服务的服务器IP
-
访问流程:CIP <–> VIP == DIP <–> RIP
LVS的四种工作模型
- lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr:操纵封装新的MAC地址
- lvs-tun:在原请求IP报文之外新加一个IP首部
- lvs-fullnat:修改请求报文的源和目标IP(内核默认不支持,需要编译做二次开发)
LVS的核心缺点
- LVS自身没有对后端服务器的健康性检查功能,不过可以配合keepalived来实现对后端server的健康性检查
LVS-DR 模式
DR模式 概述
- 下面图中的Director就是LVS

Direct Routing 直接路由,应用最广泛,生产中的主流模型,也是LVS的默认模式
特点
- LVS和各RS都配置有VIP
- 请求报文要经由LVS,但响应报文不经由LVS,而由RS直接发往Client
- 不支持端口映射(端口不能修败)
- RS可使用大多数OS系统
- 生产中通常LVS和RS都使用私网地址,然后在防火墙上配置公网地址,用户访问的防火墙的VIP,最后由防火墙做DNAT转换 转发到LVS上
优点
- 最大优点是响应报文直接由 RS 响应给 client
缺点
- Real Server 和 LVS Server 间不能使用路由器,因为 LVS Server 要将client端的请求报文转发到 Real Server 并且要通过ARP广播来获取 Real Server 的MAC地址 再将目标MAC改为 Real Server 的MAC地址,而路由器会阻断广播报文,所以 Real Server 和 LVS Server 不能距离太远,且只能使用交换机相连
DR模式 工作原理
- 首先RS会绑定一个和LVS相同的VIP,并且RS会通过修改内核参数的方式不对ARP广播做出响应,从而避免地址冲突
- 客户端访问LVS,源IP为客户端的IP,目标IP为LVS的VIP,发送给LVS
- LVS收到客户端的请求报文后,会根据调度算法选出一台RS,然后将目标的MAC地址改为RS的MAC,发送给RS
- RS处理完毕后,会将目标IP改为客户端的IP,因为本身具有VIP,所以将报文直接发送给客户端
DR模式 注意事项
- Real Server 和 LVS Server 要在同一个物理网络
- Real Server 的网关不能指向 LVS server,以确保响应报文不会经由 LVS server
- Real Server 和 LVS Server 间不能使用路由器
DR模式 解决RS VIP ARP广播响应
方法一 修改内核参数(常用)
官方文档:https://docs.kernel.org/networking/ip-sysctl.html?highlight=arp_announce
-
在RS上修改内核参数以限制arp通告及应答级别
-
只需在lo网卡设置,因为其他网卡还需和LVS进行通信,但设置lo网卡外还需设置all
-
arp_ignore
- 0:默认值,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址应答。
- 1:当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应
-
arp_announce
- 定义不同的限制级别,用于从接口上发送的 ARP 请求中的 IP 数据包中宣布本地源 IP 地址
- 0:默认值,使用在任何接口上配置的任何本地地址
- 2:始终为此目标使用最佳本地地址。在这种模式下,我们忽略IP数据包中的源地址,并尝试选择我们喜欢与目标主机对话的本地地址。这样的本地地址是通过在输出接口上的所有子网(包括目标IP地址)上查找主IP地址来选择的。如果找不到合适的本地地址,我们会选择传出接口或所有其他接口上的第一个本地地址,希望我们的请求会得到回复,有时甚至不管我们宣布的源IP地址如何。
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2方法二
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP方法三
- 在前端网关做静态绑定VIP和Director的MAC地址(缺点是如果LVS服务器宕机,需修改前端网关IP地址和mac地址的绑定关系才能实现恢复)
LVS-TUN 模式

TUN模式特点:
- DIP, VIP, RIP可以是公网地址
- RS的网关一般不能指向DIP
- 请求报文要经由Director,但响应不经由Director
- 不支持端口映射
- RS的OS须支持隧道功能
LVS-NAT 模式
- NAT(Network Address Translation)即网络地址转换
本质是多目标IP的DNAT(每次可以选择不同的目标 也就是RS 做调度,而非同一个目标),通过将请求报文中的目标地址和目标端口修改为某挑出的RS同的RIP和PORT实现转发
NAT模式的特点
- RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
NAT模式 工作原理
- 客户端访问LVS,源IP为客户端的IP,目标IP为LVS的VIP,发送给LVS
- LVS收到客户端的请求报文后,会根据调度算法选出一台RS,然后源IP还是客户端的IP,但会将目标IP改为RS的IP,发送给RS
- RS处理完毕后,会将目标IP改为客户端的IP,源IP为RS的IP,发送给LVS
- 最后LVS将源IP改为自己的IP,目标IP还是客户端的IP,再发送给客户端
LVS-FULLNAT 模式
…
此类型kernel默认不支持
LVS工作模式总结和比较
| NAT | TUN | DR | |
|---|---|---|---|
| Server | any | Tunneling | Non-arp device |
| server network | private | LAN/WAN | LAN |
| server number | low (10~20) | High (100) | High (100) |
| server gateway | load balancer | own router | Own router |
lvs-nat与lvs-fullnat:
- 请求和响应报文都经由Director
- lvs-nat:RIP的网关要指向DIP
- lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs-tun:
- 请求报文要经由Director,但响应报文由RS直接发往Client
- lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
- lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信