一、基础介绍
1.1 LVS 简介
LVS(Linux Virtual Server)即 Linux 虚拟服务器,是内核级别的负载调度器,由章文嵩博士开发。阿里云四层 SLB(Server Load Balance)正是基于 LVS + Keepalived 实现。
1.2 LVS 核心术语
| 术语 | 全称 | 含义 |
|---|---|---|
| VS | Virtual Server | 负载调度器,负责请求分发 |
| RS | Real Server | 真实服务器,提供实际业务服务 |
| CIP | Client IP | 客户端 IP 地址 |
| VIP | Virtual IP | 对外提供服务的虚拟 IP(客户端访问的 IP) |
| DIP | Director IP | 调度器内网 IP(用于和 RS 通信) |
| RIP | Real Server IP | 真实服务器的 IP 地址 |
1.3 LVS 集群类型
| 模式 | 核心原理 | 特点 |
|---|---|---|
| LVS-NAT | 修改请求报文的目标 IP(多目标 DNAT) | 请求 / 响应均经 VS 转发,支持端口映射,RS 网关需指向 DIP |
| LVS-DR | 封装新的 MAC 地址(直接路由) | LVS 默认模式,性能最优,仅修改 MAC 不修改 IP |
| LVS-TUN | 原 IP 报文外新增 IP 首部 | 跨网段部署,RS 需支持隧道协议 |
| LVS-FULLNAT | 修改请求报文的源 / 目标 IP | 解决 NAT 模式瓶颈,VS 和 RS 可跨网段 |
二、实验环境说明
本次实验使用两个网段:
-
NAT 网段:192.168.0.0/24(对外访问)
-
仅主机网段:192.168.0.0/24(VS 与 RS 内网通信)
三、LVS-NAT 模式实验
3.1 环境部署
(1)VS 调度器配置
# 配置双网卡 IP(eth0:对外 VIP,eth1:对内 DIP)
[root@vsnode ~]# vmset.sh eth0 192.168.0.100 vsnode
[root@vsnode ~]# vmset.sh eth1 192.168.0.100 vsnode noroute
# 开启内核转发(核心:NAT 模式必须开启)
[root@vsnode ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@vsnode ~]# sysctl -p
(2)RS1 真实服务器配置
# 配置内网 IP,网关指向 VS 的 DIP
[root@RS1 ~]# vmset.sh eth0 192.168.0.10 RS1 noroute
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
# 验证路由(网关需为 192.168.0.100)
[root@RS1 ~]# route -n
# 部署 HTTP 服务(用于测试)
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl enable --now httpd
[root@RS1 ~]# echo "RS1 - 192.168.0.10" > /var/www/html/index.html
(3)RS2 真实服务器配置
# 修正原文笔误:RS2 配置需替换 IP 和主机名
[root@RS2 ~]# vmset.sh eth0 192.168.0.20 RS2 noroute
[root@RS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0
# 验证路由
[root@RS2 ~]# route -n
# 部署 HTTP 服务
[root@RS2 ~]# dnf install httpd -y
[root@RS2 ~]# systemctl enable --now httpd
[root@RS2 ~]# echo "RS2 - 192.168.0.20" > /var/www/html/index.html
(4)环境连通性测试(VS 节点执行)
[root@vsnode ~]# curl 192.168.0.10 # 应返回 RS1 内容
[root@vsnode ~]# curl 192.168.0.20 # 应返回 RS2 内容
3.2 配置 LVS-NAT 策略
# 安装 ipvsadm 工具
[root@vsnode ~]# dnf install ipvsadm -y
# 清空原有规则
[root@vsnode ~]# ipvsadm -C
# 添加虚拟服务(VIP:80,调度算法 wrr 加权轮询)
[root@vsnode ~]# ipvsadm -A -t 192.168.0.100:80 -s wrr
# 添加 RS1 节点(-m 表示 NAT 模式,-w 1 权重)
[root@vsnode ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.10:80 -m -w 1
# 添加 RS2 节点
[root@vsnode ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.20:80 -m -w 1
# 查看规则(验证配置)
[root@vsnode ~]# ipvsadm -Ln
3.3 测试验证
(1)基础轮询测试
# 连续访问 10 次,验证轮询效果
[root@vsnode ~]# for i in {1..10};do curl 192.168.32.100;done
# 预期结果:RS1/RS2 交替返回(权重均为 1)
(2)调整权重测试
# 修改 RS1 权重为 2(-e 编辑规则)
[root@vsnode ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.0.10:80 -m -w 2
# 再次测试(RS1 出现频率应为 RS2 的 2 倍)
[root@vsnode ~]# for i in {1..10};do curl 192.168.0.100;done
(3)故障转移测试
停止 RS2 的 httpd 服务或断开网络,再次访问 VIP,请求会全部转发到 RS1,验证集群可用性。
四、LVS-DR 模式实验
4.1 环境部署逻辑
DR 模式核心:
-
VS 和所有 RS 都配置相同的 VIP(仅 VS 的 VIP 对外可见,RS 的 VIP 绑定在 lo 回环口);
-
RS 需禁用 ARP 响应(避免 VIP 地址冲突);
-
仅修改报文 MAC 地址,请求经 VS 转发,响应直接从 RS 返回客户端。
4.2 详细配置
(1)路由器(可选,用于网段转发)
# 清空原有 ipvsadm 规则
[root@router ~]# systemctl disable --now ipvsadm.service
[root@router ~]# ipvsadm -C
# 配置双网卡 IP
[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
# 配置 SNAT 转发(让 RS 能访问外网)
[root@router ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100
[root@router ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
(2)VS 调度器配置
# 配置内网 IP(DIP)
[root@vsnode ~]# vmset.sh eth0 192.168.0.50 vsnode noroute
# 编辑网卡配置
[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
# 配置 lo 回环口绑定 VIP(192.168.0.200)
[root@vsnode ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
[root@vsnode ~]# vim /etc/NetworkManager/system-connections/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@vsnode ~]# nmcli connection reload
[root@vsnode ~]# nmcli connection up eth0
[root@vsnode ~]# nmcli connection up lo
# 配置 LVS-DR 规则(-g 表示 DR 模式,rr 轮询算法)
[root@vsnode ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g
[root@vsnode ~]# ipvsadm -Ln # 验证规则
(3)客户端配置
# 配置 IP 并指向网关
[root@client ~]# vmset.sh eth0 192.168.0.99 client noroute
[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.0.99/24,192.168.0.100
dns=8.8.8.8;
# 重载连接
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0
# 测试连通性(ping VIP)
[root@client ~]# ping 192.168.0.200
(4)RS1 配置
# 配置内网 IP 和网关
[root@RS1 ~]# vmset.sh eth0 192.168.0.10 RS1 noroute
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
# lo 回环口绑定 VIP(和 VS 一致)
[root@RS1 ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
[root@RS1 ~]# vim /etc/NetworkManager/system-connections/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 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up lo
# 禁用 ARP 响应(核心:避免 VIP 冲突)
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 部署 HTTP 服务(同 NAT 模式)
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl enable --now httpd
[root@RS1 ~]# echo "RS1 - DR Mode" > /var/www/html/index.html
(5)RS2 配置
# 重复 RS1 配置
[root@RS2 ~]# vmset.sh eth0 192.168.0.20 RS2 noroute
[root@RS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0
# lo 绑定 VIP
[root@RS2 ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
[root@RS2 ~]# vim /etc/NetworkManager/system-connections/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@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up lo
# 禁用 ARP 响应
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 部署 HTTP 服务
[root@RS2 ~]# dnf install httpd -y
[root@RS2 ~]# systemctl enable --now httpd
[root@RS2 ~]# echo "RS2 - DR Mode" > /var/www/html/index.html
4.3 测试验证
客户端访问 VIP(192.168.0.200),验证轮询效果:
[root@client ~]# for i in {1..10};do curl 192.168.0.200;done
# 预期结果:RS1/RS2 交替返回(RR 算法)
总结
-
LVS-NAT 模式:核心是修改请求目标 IP,RS 网关必须指向 VS 的 DIP,请求 / 响应均经 VS 转发,易成瓶颈但配置简单;
-
LVS-DR 模式:核心是修改 MAC 地址,VIP 绑定在 VS 外网和 RS 回环口,RS 需禁用 ARP 响应,性能最优(响应直连客户端);
-
关键配置:NAT 模式需开启
ip_forward,DR 模式需禁用 ARP 响应,ipvsadm 规则中-m对应 NAT、-g对应 DR。