LVS(linux virual server)LVS四种工作模式深度解析
LVS-NAT模式
四台虚拟机
火墙关闭
关闭火墙 systemctl stop firewalldsystemctl disable firewalld关闭开机自启火墙
1.client | ![]() |
---|---|
2.lvs | ![]() ![]() |
rs1 | ![]() |
re2 | ![]() |
网络配好在rs1和rs2安装httpd功能所用命令dnf/yum install httpd -y
事例
然后在rs1操作:
[root@RS1 ~]# systemctl disable --now firewalld #禁用并停止 firewalld 服务[root@RS1 ~]# echo RS1 - 192.168.0.10 > /var/www/html/index.html #创建并写入内容到 index.html 文件:[root@RS1 ~]# systemctl enable --now http d #启用并启动 Apache HTTP 服务
#rs2相同操作
事例
查看RS1和RS2网关
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/ #切换目录
[root@RS1 system-connections]# ls
eth0.nmconnection
#查看网卡
[root@RS1 system-connections]# vim eth0.nmconnection #修改网卡
[root@RS1 system-connections]# nmcli connection reload #重启端口
[root@RS1 system-connections]# nmcli connection up eth0 #激活网口
lvs虚拟机操作
[root@lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0 #net.ipv4.ip_forward = 0:这意味着当前 IPv4 数据包转发功能被禁用了(值为0表示禁用,1表示启用)
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@lvs ~]# echo net.ipv4.ip_forward=1 > /etc/sysctl.conf #这条命令将 net.ipv4.ip_forward=1 写入到了 /etc/sysctl.conf 配置文件中,使得系统在启动时启用 IPv4 转发。
[root@lvs ~]# sysctl -p #使用 sysctl -p 使配置立即生效。
net.ipv4.ip_forward = 1
用这个命令查一下需要安装的lvs安装包:dnf search lvs
用命令安装[root@lvs ~]# dnf/yum install ipvsadm -y
用命令watch -n1 ipvsadm -Ln 查看策略调度机制
输入命令[root@lvs ~]# ipvsadm -A -t
172.25.254.200:80 -s rr #这条命令使用 ipvsadm
工具配置一个虚拟服务 172.25.254.200:80
,并使用 轮询(Round Robin) 调度算法(-S rr
)来分发流量到后端服务器
[root@lvs ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr #-E表示更改为wrr机制
TCP 172.25.254.200:80 wrr
[root@lvs ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr -p 360 #-p设置持久连接超时规定时间内同一来源请求调度到同一realserver-----这里时间设为360
TCP 172.25.254.200:80 wrr persistent 360
[root@lvs ~]# ipvsadm -A -f 66 -s rr #设置火墙TCP 172.25.254.200:80 wrr persistent 360
FWM 66 rr
删除机制 #模式不能混用
[root@lvs ~]# ipvsadm -D -f 66 #删除火墙-D[root@lvs ~]# ipvsadm -C #全部删除[root@lvs ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.10:80 -g
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.20:80 -g
#-g为直连路由
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.10:80 -m
#-m为nat模式
[root@lvs ~]# ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.20:80 -i
[root@lvs ~]# ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.10:80 -i
#-e为切换模式 -i为ipip隧道模式
设置权重
[root@lvs ~]# ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.10:80 -i -w 2
#-w 后面跟数字代表权重这里设置2--权重不是所有模式一定生效
计数器[root@lvs ~]# watch -n1 ipvsadm -Ln --rate #后面加–tate -Z清楚计数器
保存策略
[root@lvs ~]# ipvsadm-save -n > /mnt/ipvsadm.rule如果用ipvsadm -C删除后用命令
ipvsadm-restore < /mnt/ipvsadm.rule
恢复策略
永久保存 #开机时加载策略
ipvsadm-save -n > /etc/sysconfig/ipvsadm
LVS技术-DR模式
实验环境拓扑
client | eth0=ip 172.25.254.111 |
---|---|
路由器 | eth0=ip 172.25.254.100 eth1=ip192.168.0.100 |
DR-LVS | eth0=ip 192.168.0.200 |
RS1 | eth0=ip192.168.0.10 |
RS2 | eth0=ip 192.168.0.20 |
客户端 clent网络设置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=172.25.254.111/24,172.25.254.100
dns=8.8.8.8
路由器网络设置
2. 路由器网络设置
(1) eth0 配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=172.25.254.100/24
(2) eth1 配置
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.0.100/24
(3) 激活网口
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth1
(4) 开启路由转发功能
打开路由内核功能
[root@luyou ~] vim /etc/sysctl.conf #编辑文件开启内核路由功能net.ipv4.ip_forward=1开启内核路由功能[root@luyou ~] sysctl -p #激活
开启防火墙并开启伪装(MASQUERADE)
[root@luyou system-connections] systemctl enable --now firewalld.service
打开路由地址伪装
[root@luyou system-connections] firewall-cmd --permanent --add-masquerade
Warning: ALREADY_ENABLED: masquerade
success
LVS主机设置
网口设置
网口eth0.nmconnection
[root@dr-lvs system-connections] cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.100
address2=192.168.0.220/24
dns=8.8.8.8[root@dr-lvs system-connections]# nmcli connection reload #重启
[root@dr-lvs system-connections]# nmcli connection up eth0 #激活
网口设置回环接口lo.nmconnection
[root@dr-lvs system-connections] cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
pmethod=manual#静态
address1=127.0.0.1/8
address2=192.168.0.220/32不对外相应32
[root@dr-lvs system-connections]# nmcli connection reload #重启
[root@dr-lvs system-connections]# nmcli connection up lo #激活
RS1/RS2 设置(后端真实服务器)
RS1设置
[root@RS1 system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.10/24,192.168.0.100
dns=8.8.8.8
[root@RS1 system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32
设置VIP相应管控
[root@RS1 ~] sysctl -a | grep arp #搜索arp相关设置[root@RS1 ~] echo net.ipv4.conf.lo.arp_ignore =1 >> /etc/sysctl.conf[root@RS1 ~] echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf[root@RS1 ~] echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf[root@RS1 ~] echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf[root@RS1 ~] sysctl -p #生效
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
vnet.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
RS2设置
[root@RS2 system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.20/24,192.168.0.100
dns=8.8.8.8
[root@RS2 system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32
设置VIP相应管控
[root@RS2 ~] sysctl -a | grep arp #搜索arp相关设置[root@RS2 ~] echo net.ipv4.conf.lo.arp_ignore =1 >> /etc/sysctl.conf[root@RS2 ~] echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf[root@RS2 ~] echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf[root@RS2 ~] echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf[root@RS2 ~] sysctl -p #生效
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
vnet.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
最后通过客户端client用户访问
防火墙标记解决轮询调度问题
先在RS1和RS2上安装httpd
[root@RS1 ~]# yum install mod_ssl -y[root@RS2 ~]# dnf install mod_ssl -y[root@RS1 ~]# systemctl restart httpd[root@RS2 ~]# systemctl restart httpdv在LVS主机上操作[root@dr-lvs ~]# ipvsadm -C #清除机制
[root@dr-lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
LVS技术-TUN模式
一、实验案例环境
本案例采用LVS负载均衡技术中的TUN(IP隧道)模式,适用于后端Real Server与调度器不在同一二层网络的场景。
网络拓扑简述
Client|| +-------------------+| | lvs-tun主机 || | eth0: 192.168.0.100| +-------------------+| / \| / \| +-------------------+ +-------------------+| | rs1主机 | | rs2主机 || | eth0:192.168.0.10| | eth0:192.168.0.20|| +-------------------+ +-------------------+
- lvs-tun:调度器,虚拟服务IP:192.168.0.100
- rs1/rs2:真实服务器,分别为 192.168.0.10 和 192.168.0.20
二、系统安装与准备
1. LVS相关软件安装
在 lvs-tun 主机上:
dnf search lvs
dnf install -y ipvsadm
2. RealServer需安装并启动web服务(如httpd/nginx)
(以httpd为例)
yum install -y httpd
systemctl enable --now httpd
echo "RS1-192.168.0.10" > /var/www/html/index.html # rs1配置
echo "RS2-192.168.0.20" > /var/www/html/index.html # rs2配置
三、LVS-TUN模式配置
1. 配置IPVS调度
在 lvs-tun 主机上:
ipvsadm -A -t 192.168.0.100:80 -s rr
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.10:80 -i
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.20:80 -i
参数说明:
-A
添加虚拟服务-t
指定虚拟IP和端口-s rr
采用轮询调度-a
添加真实服务器-r
真实服务器IP:端口-i
TUN模式(IP隧道)
2. 加载IP隧道内核模块(所有主机)
modprobe ipip
可写入 /etc/modules-load.d/ipip.conf
,确保开机自动加载。
四、RealServer配置(rs1与rs2)
1. ARP优化参数(防止虚拟IPARP冲突)
echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
sysctl -p
2. 配置虚拟IP地址到lo接口
ip addr add 192.168.0.100/32 dev lo
3. 安装并配置arptables,防止ARP欺骗
yum install -y arptables.x86_64
arptables -A INPUT -d 192.168.0.100 -j DROP
arptables -A OUTPUT -s 192.168.0.100 -j mangle --mangle-ip-s 192.168.0.2
arptables-save > /etc/sysconfig/arptables
4. 检查并允许IPIP协议(防火墙)
如用 firewalld:
firewall-cmd --permanent --add-protocol=ipip
firewall-cmd --reload
4五、客户端测试案例
在 Client 主机上:
curl 192.168.0.100
# RS1-192.168.0.10curl 192.168.0.100
# RS2-192.168.0.20curl 192.168.0.100
# RS1-192.168.0.10
总结
- ARP参数与arptables必须配置,防止RealServer响应VIP的ARP请求,避免网络异常。
- IPVS调度器和RealServer都需加载ipip隧道模块。
- 虚拟IP须绑定至RealServer的lo接口,且为/32掩码。
- 防火墙需允许IPIP协议(协议号4)。
- 建议将相关配置写入系统启动脚本,防止重启失效。
- 每台RealServer需配置独立的index.html,便于验证调度效果。
- LVS-TUN模式适合DDoS防护、异地容灾等跨网段负载均衡场景。
lvs-fullnat模式(不常用)
通过同时修改请求报文的源IP地址和目标IP地址进行转发;此类型默认不支持;
(1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
(2) RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client;
(3) 请求和响应报文都经由Director;
(4) 支持端口映射
LVS(Linux Virtual Server)四种工作模式和13种调度算法详解
一、LVS 四种工作模式
1. NAT(Network Address Translation)模式
工作原理:
- 客户端请求到达 LVS 调度器(Director)。
- LVS 修改请求报文的目标 IP(VIP → Real Server IP),并转发给后端真实服务器(Real Server)。
- 真实服务器处理请求后,将响应返回给 LVS。
- LVS 修改响应报文的源 IP(Real Server IP → VIP),再返回给客户端。
特点:
✅ 支持端口映射(VIP 和 Real Server 端口可以不同)。
✅ 真实服务器可以位于不同网络(跨 VLAN)。
❌ 性能瓶颈:进出流量都要经过 LVS,LVS 容易成为性能瓶颈。
❌ 网关依赖:真实服务器必须将默认网关指向 LVS,否则无法回包。
适用场景:
- 适用于小型集群,对性能要求不高。
- 需要端口映射(如 VIP:80 → Real Server:8080)的场景。
2. DR(Direct Routing)模式
工作原理:
- 客户端请求到达 LVS 调度器(Director)。
- LVS 仅修改请求报文的 MAC 地址(目标 MAC → Real Server MAC),不修改 IP。
- 真实服务器直接响应客户端(不经过 LVS),但源 IP 仍然是 VIP(需要配置 lo:VIP)。
- 客户端收到响应后,认为数据来自 VIP,不会感知 LVS 的存在。
特点:
✅ 高性能:响应数据不经过 LVS,仅请求经过。
✅ 低延迟:适用于高并发场景。
❌ ARP 问题:需要抑制真实服务器的 VIP ARP 响应(arp_ignore=1
和 arp_announce=2
)。
❌ 网络限制:LVS 和 Real Server 必须在同一 LAN(不能跨 VLAN)。
适用场景:
- 高性能 Web 服务器集群(如电商、金融交易系统)。
- 需要低延迟、高吞吐量的应用。
3. TUN(IP Tunneling)模式
工作原理:
- LVS 将客户端请求封装在 IP 隧道(如 IPIP/GRE)中,转发给真实服务器。
- 真实服务器解封装后处理请求,并直接响应客户端(源 IP 仍是 VIP)。
- 响应数据不经过 LVS。
特点:
✅ 跨网络支持:LVS 和 Real Server 可以不在同一网络(跨机房)。
✅ 高性能:响应数据不经过 LVS。
❌ 配置复杂:需要 Real Server 支持 IP 隧道协议(如 ipip
模块)。
❌ 额外开销:IP 封装/解封装增加 CPU 负担。
适用场景:
- 跨数据中心负载均衡(如异地容灾)。
- 需要高可用但 Real Server 不在同一 LAN 的场景。
4. FULLNAT 模式
工作原理:
- LVS 同时修改请求报文的源 IP 和目标 IP(CIP → LVS IP,VIP → RIP)。
- 真实服务器看到的源 IP 是 LVS 的 IP,而不是客户端的 IP。
- LVS 在返回响应时,再修改源 IP(RIP → VIP)和目标 IP(LVS IP → CIP)。
特点:
✅ 跨 VLAN 支持:Real Server 可以位于不同网络。
✅ 隐藏客户端 IP:Real Server 看不到客户端的真实 IP(需通过 TOA
模块获取)。
❌ 性能影响:所有流量都要经过 LVS,类似 NAT 模式。
适用场景:
- 需要隐藏客户端 IP 的场景(如安全防护)。
- 大规模跨 VLAN 负载均衡(如云环境)。
二、LVS 13 种调度算法
静态调度算法(不感知服务器负载)
算法 | 名称 | 说明 |
---|---|---|
rr | 轮询(Round Robin) | 按顺序依次分配请求,不考虑服务器负载。 |
wrr | 加权轮询(Weighted RR) | 按权重比例分配请求(如权重 3:2:1)。 |
sh | 源地址哈希(Source Hashing) | 相同源 IP 的请求固定分配到同一服务器(会话保持)。 |
dh | 目标地址哈希(Destination Hashing) | 相同目标 IP 的请求固定分配到同一服务器(CDN 场景)。 |
动态调度算法(感知服务器负载)
算法 | 名称 | 说明 |
---|---|---|
lc | 最少连接(Least Connections) | 选择当前连接数最少的服务器。 |
wlc | 加权最少连接(Weighted LC) | 默认算法,考虑权重 + 连接数。 |
lblc | 基于局部性的最少连接 | 类似 dh + lc ,适用于缓存服务器。 |
lblcr | 带复制的基于局部性最少连接 | 优化 lblc ,允许请求在相似服务器间分配。 |
sed | 最短期望延迟(Shortest Expected Delay) | 选择 (活动连接 + 1) / 权重 最小的服务器。 |
nq | 永不排队(Never Queue) | 优先选择空闲服务器,否则使用 sed 。 |
lt | 最小流量(Least Traffic) | 选择当前流量最少的服务器。 |
wlt | 加权最小流量(Weighted LT) | 考虑权重的 lt 算法。 |
wrt | 加权响应时间(Weighted Response Time) | 选择平均响应时间最短的服务器。 |
三、总结对比
模式 | 性能 | 跨网络 | 配置复杂度 | 适用场景 |
---|---|---|---|---|
NAT | 低 | ✅ | 简单 | 小型集群、端口映射 |
DR | 高 | ❌ | 中等 | 高性能 Web 服务 |
TUN | 高 | ✅ | 复杂 | 跨机房负载均衡 |
FULLNAT | 中 | ✅ | 中等 | 云环境、安全防护 |
调度算法选择:
- 默认推荐
wlc
(加权最少连接)。 - 需要会话保持 →
sh
(源地址哈希)。 - 缓存服务器优化 →
lblc
/lblcr
。 - 低延迟优先 →
sed
/nq
。
LVS 的灵活模式 + 多种调度算法使其适用于各种高可用、高性能负载均衡场景。 看看嘛
|
| wlt | 加权最小流量(Weighted LT) | 考虑权重的 lt
算法。 |
| wrt | 加权响应时间(Weighted Response Time) | 选择平均响应时间最短的服务器。 |
三、总结对比
模式 | 性能 | 跨网络 | 配置复杂度 | 适用场景 |
---|---|---|---|---|
NAT | 低 | ✅ | 简单 | 小型集群、端口映射 |
DR | 高 | ❌ | 中等 | 高性能 Web 服务 |
TUN | 高 | ✅ | 复杂 | 跨机房负载均衡 |
FULLNAT | 中 | ✅ | 中等 | 云环境、安全防护 |
调度算法选择:
- 默认推荐
wlc
(加权最少连接)。 - 需要会话保持 →
sh
(源地址哈希)。 - 缓存服务器优化 →
lblc
/lblcr
。 - 低延迟优先 →
sed
/nq
。
LVS 的灵活模式 + 多种调度算法使其适用于各种高可用、高性能负载均衡场景。 看看嘛