LVS(Linux virual server)四层负载均衡实验

LVS简介

LVS 全称 Linux Virtual Server,是 Linux 内核层实现的高性能、高可用 的负载均衡集群技术,由章文嵩博士开发,目前是 Linux 内核的标准模块 之一。它的核心作用是将前端的请求流量分发到后端多台真实服务器 (Real Server)上,从而提升服务的并发处理能力和可用性。

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基 于LVS+keepalived实现 LVS

官网: http://www.linuxvirtualserver.org/

LVS 相关术语

VS: Virtual Server,负责调度

RS:RealServer,负责真正提供服务

lvs集群的类型

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

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

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

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

NAT模式实验主机环境搭建

VS主机配置

RS1配置

RS2配置

验证是否配置成功(在vs主机上测试)

NAT模式实现方法

#开启内核路由功能

#编写策略

注意执行以上指令时出现【未找到命令时】需要安装 ipvsadm

root@vsssnnode \~# yum install ipvsadm -y

root@vsssnnode \~# ipvsadm -C 清空服务器上所有已配置的 LVS 规则

root@vsssnnode \~# ipvsadm -A -t 172.25.254.100:80 -s wrr 创建一个对外提供服务的 LVS 虚拟节点(VIP),指定用 "加权轮询" 算法分发请求。

root@vsssnnode \~# ipvsadm -A -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1

Illegal 'real-server' option with the 'add-service' command

root@vsssnnode \~# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1

root@vsssnnode \~# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1

把后端真实服务器(192.168.0.10/20:80)加入刚才创建的 LVS 虚拟服务,指定用 NAT 模式转发,权重为 1。

root@vsssnnode \~# ipvsadm -Ln 查看当前配置好的所有 LVS 规则(验证配置是否生效)

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 172.25.254.100:80 wrr

-> 192.168.0.10:80 Masq 1 0 0

-> 192.168.0.20:80 Masq 1 0 0

测试结果

利用自定义文件进行持久化

root@vsnode \~# ipvsadm-save -n

-A -t 172.25.254.100:80 -s wrr

-a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2

-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1

root@vsnode \~# ipvsadm-save -n > /mnt/ipvs.rule

root@vsnode \~# ipvsadm -C

root@vsnode \~# ipvsadm-restore < /mnt/ipvs.rule

利用守护进程进行规则持久化

root@vsnode \~# ipvsadm-save -n > /etc/sysconfig/ipvsadm

root@vsnode \~# ipvsadm -C

root@vsnode \~# systemctl enable --now ipvsadm.service

Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.

DR模式实验

环境设定

#在路由器中配置

root@router \~# systemctl disable --now ipvsadm.service

Removed "/etc/systemd/system/multi-user.target.wants/ipvsadm.service".

root@router \~# ipvsadm -C

#在路由器中

root@router \~# vmset.sh eth0 172.25.254.100 vsnode

root@router \~# vmset.sh eth1 192.168.0.100 vsnode noroute、

#设定内核路由功能

root@router \~# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

root@router \~# sysctl -p

net.ipv4.ip_forward = 1

#数据转发策略

root@router \~# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100

root@vsnode \~# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100

vsnode 调度器配置

root@vsnode \~# vmset.sh eth0 192.168.0.50 vsnode norouter

root@vsnode \~# vim /etc/NetworkManager/system-connections/eth0.nmconnection

connection

id=eth0

type=ethernet

interface-name=eth0

ipv4

method=manual

address1==192.168.0.50/24,192.168.0.100

root@vsnode \~# cd /etc/NetworkManager/system-connections/

root@vsnode system-connections# cp -p eth0.nmconnection lo.nmconnection

root@vsnode system-connections# vim lo.nmconnection

connection

id=lo

type=loopback

interface-name=lo

ipv4

method=manual

address1==127.0.0.1/8

address2=192.168.0.200/32

root@RS1 system-connections# nmcli connection reload

root@RS1 system-connections# nmcli connection up eth0

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)

root@RS1 system-connections# nmcli connection up lo

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)

检测

客户机配置

root@client xia]# vim /etc/NetworkManager/system-connections/eth0.nmconnection

connection

id=eth0

type=ethernet

interface-name=eth0

ipv4

method=manual

address1=172.25.254.99/24,172.25.254.100

dns=8.8.8.8;

RS1配置

RS2配置

root@rs2 system-connections# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 设置所有网卡的 arp_ignore 参数为 1,让服务器只响应目标 IP 是本机网卡配置的 IP 的 ARP 请求。

root@rs2 system-connections# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 单独给回环网卡(lo)设置 arp_ignore=1,强化对 VIP 的 ARP 响应限制(因为 LVS DR 模式下 VIP 通常配置在 lo 网卡上)。

root@rs2 system-connections# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 设置回环网卡的 arp_announce 参数为 2,让服务器发送 ARP 包时,只使用目标网段匹配的网卡 IP 作为源 IP,不暴露 VIP。

root@rs2 system-connections# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 让所有网卡生效 arp_announce=2,全局限制 ARP 包的源 IP 选择,避免 VIP 被对外暴露

利用火墙标记解决轮询错误

1.在rs主机中同时开始http和https两种协议

#在RS1和RS2中开启https

RS1

root@RS1 \~# dnf install mod_ssl -y

root@RS1 \~# systemctl restart httpd

root@RS1\~# systemctl restart httpd

RS2

root@RS2 \~# dnf install mod_ssl -y

root@RS2 \~# systemctl restart httpd

root@RS2\~# systemctl restart httpd

2.在vsnode中添加https的轮询策略

root@vsnode \~# ipvsadm -A -t 192.168.0.200:80 -s rr 创建 80 端口虚拟服务

root@vsnode \~# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g 添加 80 端口后端 RS2

root@vsnode \~# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g 添加 80 端口后端 RS1

root@vsnode \~# ipvsadm -A -t 192.168.0.200:443 -s rr 创建 443 端口虚拟服务

root@vsnode \~# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g 添加 443 端口后端 RS1

root@vsnode \~# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g 添加 443 端口后端 RS2

root@vsnode \~# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.0.200:80 rr

-> 192.168.0.10:80 Route 1 0 0

-> 192.168.0.20:80 Route 1 0 0

TCP 192.168.0.200:443 rr

-> 192.168.0.10:443 Route 1 0 0

-> 192.168.0.20:443 Route 1 0 0

3.轮询错误展示

root@client \~# curl 192.168.0.200;curl -k https://192.168.0.200

RS2 - 192.168.0.20

RS2 - 192.168.0.20

解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载

root@vsnode \~# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666 给 80/443 流量打 6666 标记

root@vsnode \~# ipvsadm -A -f 6666 -s rr 创建基于 6666 标记的 LVS 虚拟服务

root@vsnode \~# ipvsadm -a -f 6666 -r 192.168.0.10 -g 添加后端节点 192.168.0.10(DR 模式)

root@vsnode \~# ipvsadm -a -f 6666 -r 192.168.0.20 -g 添加后端节点 192.168.0.20(DR 模式)

测试

利用持久连接实现会话粘滞

1.设定ipvs调度策略

root@vsnode \~# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666

对所有访问 192.168.0.100 的 80/443 端口流量打「6666」标记,然后 LVS 对带这个标记的流量做「轮询 + 1 秒会话保持」的 DR 模式负载均衡。

root@vsnode \~# ipvsadm -A -f 6666 -s rr -p 1

root@vsnode \~# ipvsadm -Ln 告诉 LVS:要处理 6666 标记的流量,用轮询方式

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.0.200:80 rr

FWM 6666 rr

-> 192.168.0.10:0 Route 1 0 2

-> 192.168.0.20:0 Route 1 0 0

测试

观察变化动向

相关推荐
我命由我1234514 小时前
Windows 操作系统 - Windows 查看防火墙是否开启、Windows 查看防火墙放行端口
java·运维·开发语言·windows·java-ee·操作系统·运维开发
iRayCheung14 小时前
virtualbox安装的ubuntu系统跑numpy报错
linux·ubuntu·numpy
snow@li14 小时前
DevOps:深入理解 DevOps(2026版)
运维·devops
Safeploy安策数据14 小时前
等保测评总卡壳?PCI加密卡如何破解政务云与金融合规难题
运维·网络·安全
Dlrb121114 小时前
Linux系统编程-信号量(线程同步机制)
linux·条件变量·互斥锁·信号量·线程同步
Mr -老鬼14 小时前
2026移动端自动化平台横向对比指南:15+主流平台深度评测,开发者选型必备
运维·自动化·easyclick·移动测试
无限进步_14 小时前
Linux进程等待——wait、waitpid与僵尸进程
linux·运维·服务器·开发语言
2401_8346369914 小时前
Linux集群技术-高可用与负载均衡实战解析
linux·运维·负载均衡
吠品14 小时前
处理 Python 类继承中那些变来变去的初始化参数
linux·前端·python
会Tk矩阵群控的小木14 小时前
小红书矩阵软件:基于Python+ADB的多设备批量管理自动化脚本实战
运维·python·adb·矩阵·自动化·新媒体运营·个人开发