前言
哈喽各位 Linux 小白小伙伴👋!是不是一看到 LVS、负载均衡就头大? 每次跟着教程敲命令,只知道复制粘贴,完全不懂这行命令是干嘛的、参数代表啥、敲完下一步该干啥,拓扑理不清、数据包走向看不懂,实验做到一半直接卡住,网上教程要么缺步骤要么注释潦草,复现百分百失败?
今天这篇博客彻底解决你的痛点!本文基于 Linux 虚拟服务器 LVS 完整拆解,先讲现实运维为什么要用 LVS 、两种主流模式(NAT/DR)业务场景,再梳理清晰实验完整思路,所有命令一行不漏、提示符完整保留、每个参数逐项拆解注释,每一步执行结果全部贴出,实验现象 + 底层原理同步讲解,不用死记硬背,看完你能独立从零搭建整套 LVS 负载均衡环境,面试、生产实操直接拿捏🎯
一、开篇科普:LVS 到底是什么?
1.1 LVS 诞生背景 & 现实运维作用(文本框突出重点)
📌【文本框:运维生产核心价值】
- 项目业务流量暴涨,单台 Web 服务器扛不住并发,多台机器需要统一对外提供服务,用户只访问一个固定 IP(VIP),自动分流请求到多台后端服务器,这就是负载均衡。
- LVS 全称 Linux Virtual Server,章文嵩博士 1998 年开源开发,运行在内核层,转发性能碾压 Nginx 七层负载,高并发、大流量网站、数据库集群、后端服务集群几乎标配。
- 运维工作实际用途: ✅ 业务扩容:新增后端 Web 机器无需修改前端访问地址,无缝扩容; ✅ 故障隔离:某台后端服务器宕机,LVS 自动停止分发流量,用户无感知; ✅ 流量均衡:根据服务器性能分配请求,低配机器少承接流量,高配多承接; ✅ 高并发支撑:DR 模式响应流量不经过调度器,调度器不会成为性能瓶颈,支撑十万、百万并发。
1.2 LVS 核心专业术语表格
表格
| 术语 | 全称 | 通俗解释(小白版) | 实验中对应 IP |
|---|---|---|---|
| Director | 负载均衡调度器 | 流量入口机器,接收用户请求,转发给后端 Web,实验里 lvs 主机 | NAT:VIP=10.1.1.10 DIP=10.1.8.10;DR:VIP=10.1.8.100 DIP=10.1.8.10 |
| RS(Real Server) | 真实后端业务服务器 | 真正跑 Nginx、提供网页服务的机器 | web1/web2/web3 RIP:10.1.8.11/12/13 |
| VIP | Virtual IP 虚拟 IP | 用户唯一访问的公网 / 前端 IP,对外暴露 | NAT:10.1.1.10;DR:10.1.8.100 |
| DIP | Director 内网 IP | 调度器和后端 RS 通信的内网地址 | 10.1.8.10 |
| CIP | Client IP 客户端 IP | 访问网站的用户机器 IP | client1:10.1.8.21 client2:10.1.1.21 |
| RIP | Real Server 真实 IP | 后端 Web 服务器内网物理 IP | 10.1.8.11/12/13 |
| ipvs | 内核模块 | 内核中负责数据包转发调度的核心程序,不用手动编译,系统自带 | - |
| ipvsadm | 用户空间工具 | 手动输入命令管理 LVS 集群、添加删除后端 RS,所有配置靠命令,无配置文件 | - |
1.3 LVS 四大工作模式核心对比表(⚠️重点区分,选场景不踩坑)
表格
| 模式 | 流量走向 | 性能 | 生产使用率 | 硬性限制 | 适用场景 |
|---|---|---|---|---|---|
| LVS-NAT | 请求 + 响应全部经过 LVS 调度器 | 一般,高并发下调度器瓶颈 | 小型测试、内网小流量业务 | RS 网关必须指向 DIP;支持端口映射 | 学习实验、企业内部后台系统,并发量几百以内 |
| LVS-DR | 请求走 LVS,响应后端服务器直接返回客户端 | 极强,无瓶颈 | 99% 线上生产使用 | LVS 和所有 RS 必须在同一二层网段;不支持端口映射 | 网站、高并发 Web 服务、线上生产环境(本文重点实操) |
| LVS-TUN 隧道 | 跨机房跨网段,响应直回客户端 | 中等 | 极少使用 | RS 系统必须支持 IP 隧道,所有 IP 为公网 | 多地域异地服务器集群,配置复杂 |
| LVS-FULLNAT | 四层全转换 | 性能较差 | 几乎淘汰 | 内核版本要求高 | 老旧特殊隔离网络 |
二、实验前置:先理清完整实验思路
2.1 实验核心目的(分 NAT、DR 两套实验分别说明)
2.1.1 LVS-NAT 实验目的
- 理解 NAT 模式数据包 IP 改写原理,来回流量全部经过调度器;
- 掌握 ipvsadm 基础命令,学会添加集群、新增后端 RS、修改调度算法;
- 验证轮询 RR、加权轮询 WRR 两种静态调度算法流量分配规则;
- 搞懂内网客户端访问 VIP 失败的底层原因,掌握静态路由修复方案。
2.1.2 LVS-DR 实验目的
- 理解 DR 仅修改二层 MAC 地址、IP 全程不变的转发逻辑;
- 掌握 RS 端 VIP 绑定 lo/dummy 网卡、ARP 内核参数关闭的核心操作(DR 模式最容易踩坑点⚠️);
- 验证跨网段客户端都能正常访问 VIP,后端响应报文绕过 LVS 调度器;
- 生产环境标准 LVS 部署流程,可直接迁移到线上。
2.2 实验操作总流程
🎯【固定操作顺序,小白背诵版】
步骤 1:所有主机基础配置(主机名、IP 地址、网关、DNS)
步骤 2:中间路由 / LVS 机器开启内核 IP 转发,放行防火墙策略
步骤 3:所有后端 RS 部署 Nginx 业务服务,测试单机访问正常
步骤 4:调度器机器安装 ipvsadm 负载均衡工具
步骤 5:根据模式配置 LVS 核心规则(NAT/-m/ DR/-g)
步骤 6:(DR 专属)所有后端 RS 配置 dummy 虚拟网卡 + ARP 屏蔽内核参数
步骤 7:客户端批量访问 VIP,验证负载均衡分发效果
步骤 8:排错修复异常访问问题(NAT 内网客户端访问失败修复)
步骤 9:封装一键启停脚本,实现集群快速开启关闭
三、实操第一部分:LVS-NAT 模式完整实验
3.1 NAT 实验网络拓扑 & 主机信息表
表格
| 主机名 | IP 地址 | 网关 | DNS | 角色 |
|---|---|---|---|---|
| client2.jhl.cloud | 10.1.1.21(vmnet1) | 10.1.1.10 | 223.5.5.5 | 外网侧客户端 |
| client1.jhl.cloud | 10.1.8.21(vmnet8) | 10.1.8.10 | 223.5.5.5 | 内网侧客户端 |
| lvs.jhl.cloud | 10.1.1.10(vmnet1)/10.1.8.10(vmnet8) | 10.1.8.2 | 223.5.5.5 | LVS 调度器、路由器 |
| web1.jhl.cloud | 10.1.8.11(vmnet8) | 10.1.8.10 | 223.5.5.5 | 后端 Web 服务器 1 |
| web2.jhl.cloud | 10.1.8.12(vmnet8) | 10.1.8.10 | 223.5.5.5 | 后端 Web 服务器 2 |
| web3.jhl.cloud | 10.1.8.13(vmnet8) | 10.1.8.10 | 223.5.5.5 | 后端 Web 服务器 3 |
网络说明注释
- 所有主机第一块网卡 ens33,第二块 ens36;ens33 默认 NAT 模式,ens36 仅 hostonly 内网互通;
- 10.1.1.0/24 网段所有机器网关指向 LVS 外网网卡 10.1.1.10;
- 10.1.8.0/24 内网网段所有 Web、内网客户端网关指向 LVS 内网网卡 10.1.8.10;
- NAT 模式硬性规则:后端 RS 网关必须为 LVS 的 DIP(10.1.8.10),保证响应报文回传给调度器改写 IP。
3.2 步骤 1:全部主机基础 IP、主机名配置(逐行命令 + 参数拆解)
3.2.1 client2 机器操作
bash
# [root@localhost ~]# 代表root管理员提示符,所有操作必须使用root执行
# hostnamectl:系统主机名管理工具
# set-hostname:修改永久主机名,重启不失效
[root@localhost ~]# hostnamectl set-hostname client2.jhl.cloud
# nmcli:NetworkManager网络管理命令行工具,替代传统ifconfig
# connection modify ens33:修改ens33网卡连接配置
# ipv4.method manual:IPv4地址手动静态配置,不自动DHCP获取
# ipv4.addresses 10.1.1.21/24:设置网卡IP为10.1.1.21,子网掩码255.255.255.0
# ipv4.gateway 10.1.1.10:设置默认网关,所有跨网段流量转发到LVS机器
# ipv4.dns 223.5.5.5:配置阿里公共DNS域名解析服务器
# autoconnect yes:开机自动激活网卡连接
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.1.21/24 ipv4.gateway 10.1.1.10 ipv4.dns 223.5.5.5 autoconnect yes
# connection up ens33:重载网卡配置,使上面修改立刻生效,无需重启机器
[root@localhost ~]# nmcli connection up ens33
3.2.2 client1 机器操作
bash
[root@localhost ~]# hostnamectl set-hostname client1.jhl.cloud
# 修改ens33网卡静态IP为内网10.1.8.21,网关指向LVS内网地址
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
3.2.3 lvs 调度器机器操作
bash
# 修改调度器主机名
[root@localhost ~]# hostnamectl set-hostname lvs.jhl.cloud
# 配置内网网卡ens33,IP 10.1.8.10(DIP,和后端RS通信地址)
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.2 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
# connection add type ethernet:新增一块以太网网卡配置文件,名称ens36
# con-name ens36:网卡连接标识为ens36,方便管理
# ifname ens36:对应系统物理网卡设备名ens36
# ipv4.addresses 10.1.1.10/24:外网VIP网卡IP,用户访问的入口IP
[root@localhost ~]# nmcli connection add type ethernet con-name ens36 ifname ens36 ipv4.method manual ipv4.addresses 10.1.1.10/24 autoconnect yes
[root@localhost ~]# nmcli connection up ens36
3.2.4 web1/web2/web3 三台后端 Web(命令完全一致,以 web1 举例)
bash
# web1主机名配置
[root@localhost ~]# hostnamectl set-hostname web1.jhl.cloud
# 静态IP 10.1.8.11,网关强制指向LVS内网DIP 10.1.8.10(NAT模式核心要求)
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
# web2仅修改IP地址字段:
[root@localhost ~]# hostnamectl set-hostname web2.jhl.cloud
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
# web3仅修改IP地址字段:
[root@localhost ~]# hostnamectl set-hostname web3.jhl.cloud
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.13/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
3.3 步骤 2:LVS 调度器开启 IP 路由转发、防火墙放行流量(NAT 必配)
⚠️关键知识点:LVS-NAT 本质是四层路由转发,内核默认关闭数据包转发,不开启无法转发客户端流量到后端 Web
bash
# echo 写入内核参数配置文件,永久开启IPv4数据包转发功能
# net.ipv4.ip_forward=1:1=开启转发,0=关闭转发
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p:重载sysctl内核配置,不用重启系统立即生效
[root@lvs ~]# sysctl -p
# 执行返回结果:
net.ipv4.ip_forward = 1
# systemctl enable firewalld --now:开机自启防火墙,同时当前会话立刻启动防火墙服务
[root@lvs ~]# systemctl enable firewalld.service --now
# firewall-cmd --set-default-zone=trusted:防火墙默认区域设为完全信任,放行所有进出流量(实验简化配置,生产按需收紧)
[root@lvs ~]# firewall-cmd --set-default-zone=trusted
# 返回结果:
success
# --add-masquerade:开启防火墙IP伪装,支持NAT地址转换,数据包跨网段转发必备
# --permanent:永久写入防火墙配置,重启不失效;不带参数仅临时生效
[root@lvs ~]# firewall-cmd --add-masquerade --permanent
success
[root@lvs ~]# firewall-cmd --add-masquerade
success
3.4 步骤 3:三台后端 Web 统一部署 Nginx 业务服务(逐行拆解)
三台 web1/web2/web3 执行完全相同操作:
bash
# wget:下载工具,-O 指定下载文件保存路径,覆盖原有epel软件源
# http://mirrors.aliyun.com/repo/epel-7.repo:阿里云高速epel软件仓库,提供nginx安装包
[root@web1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum install -y nginx:yum软件管理器安装nginx,-y自动确认所有安装交互,无需手动输入y
[root@web1 ~]# yum install -y nginx
# echo 输出自定义页面内容,重定向写入nginx默认首页文件
# $(hostname):执行hostname命令获取本机主机名,区分三台web页面输出内容,方便验证负载均衡分发
[root@web1 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
# systemctl enable nginx.service --now:设置nginx开机自启,同时立即启动web服务
[root@web1 ~]# systemctl enable nginx.service --now
验证单机 Nginx 是否正常运行(客户端执行)
bash
# curl:http访问工具,测试后端单机网页返回
[root@client1 ~]# curl 10.1.8.11
# 返回结果:
Welcome to web1.jhl.cloud
[root@client1 ~]# curl 10.1.8.12
# 返回结果:
Welcome to web2.jhl.cloud
[root@client1 ~]# curl 10.1.8.13
# 返回结果:
Welcome to web3.jhl.cloud
3.5 步骤 4:LVS 调度器安装 ipvsadm 负载均衡工具
bash
# yum安装ipvsadm,管理内核ipvs模块的用户层命令工具
[root@lvs ~]# yum install -y ipvsadm
# touch 创建空配置文件,ipvsadm服务开机读取该文件加载规则
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
# 开机自启ipvsadm服务,当前立刻启动
[root@lvs ~]# systemctl enable ipvsadm --now
3.6 步骤 5:配置 LVS-NAT 轮询调度规则,逐参数拆解 ipvsadm 核心命令
3.6.1 创建 TCP 集群服务,调度算法 RR 轮询
bash
# ipvsadm:LVS管理主命令
# -A Add:新增一条虚拟集群服务
# -t tcp:指定集群基于TCP协议(web 80端口为TCP),-u代表UDP协议
# 10.1.1.10:80:虚拟VIP+对外服务端口,用户访问的地址端口
# -s scheduler:指定调度算法,rr=Round Robin轮询,均分流量
[root@lvs ~]# ipvsadm -A -t 10.1.1.10:80 -s rr
3.6.2 添加三台后端 RS,-m 代表 NAT 模式
bash
# -a add:给已有虚拟集群添加后端真实服务器RS
# -r server-address:指定后端Web真实IP+端口
# -m masquerade:NAT模式标识,报文进出全部经过调度器,改写源/目标IP
[root@lvs ~]# ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.11 -m
[root@lvs ~]# ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.12 -m
[root@lvs ~]# ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.13 -m
3.6.3 保存 LVS 规则,重启机器不丢失
bash
# ipvsadm-save -n:导出当前所有集群规则,-n以数字IP展示不解析主机名
# > 重定向输出到永久配置文件
[root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
3.6.4 查看 LVS 配置是否生效
bash
# -L list:列出所有集群规则;-n 纯数字显示IP,不做域名解析
[root@lvs ~]# ipvsadm -Ln
# 完整返回结果:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.10:80 rr
-> 10.1.8.11:80 Masq 1 0 0
-> 10.1.8.12:80 Masq 1 0 0
-> 10.1.8.13:80 Masq 1 0 0
返回字段逐行解释表格
| 字段 | 含义 |
|---|---|
| Prot | 协议 TCP/UDP |
| LocalAddress:Port | VIP 虚拟 IP + 服务端口,用户访问地址 |
| Scheduler | 调度算法 rr 轮询 |
| RemoteAddress:Port | 后端 RS 真实 IP 端口 |
| Forward | Masq=NAT 模式;Route=DR 模式 |
| Weight | 服务器权重,默认 1,权重越高分配流量越多 |
| ActiveConn | 当前活跃正在传输的连接数 |
| InActConn | 空闲保持连接数 |
3.7 步骤 6:外网 client2 批量访问验证轮询 RR 效果
bash
# for循环执行90次curl访问VIP;-s 静默模式,不输出访问进度信息
# sort 对返回页面内容排序;uniq -c 统计每条内容出现次数
[root@client2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c
# 返回结果(均分3台机器,各30次,轮询生效):
30 Welcome to web1.jhl.cloud
30 Welcome to web2.jhl.cloud
30 Welcome to web3.jhl.cloud
3.8 步骤 7:修改调度算法为 WRR 加权轮询,调整后端权重
bash
# -E Edit:编辑已存在的集群服务,修改调度算法
[root@lvs ~]# ipvsadm -E -t 10.1.1.10:80 -s wrr
# -e edit:编辑已有RS服务器配置;-w weight 设置权重,数值越大流量越多
# web2权重2,web3权重3,web1保持默认1
[root@lvs ~]# ipvsadm -e -t 10.1.1.10:80 -r 10.1.8.12 -m -w 2
[root@lvs ~]# ipvsadm -e -t 10.1.1.10:80 -r 10.1.8.13 -m -w 3
# 重新查看规则
[root@lvs ~]# ipvsadm -Ln
# 返回结果:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.10:80 wrr
-> 10.1.8.11:80 Masq 1 0 0
-> 10.1.8.12:80 Masq 2 0 0
-> 10.1.8.13:80 Masq 3 0 0
加权轮询访问验证(总 90 次访问,权重比例 1:2:3)
bash
[root@client2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c
# 返回结果(比例完全匹配权重):
15 Welcome to web1.jhl.cloud
30 Welcome to web2.jhl.cloud
45 Welcome to web3.jhl.cloud
3.9 NAT 实验排错:内网 client1 无法访问 VIP 问题分析 + 修复
🤔问题思考:client1 (10.1.8.21) 为什么访问 10.1.1.10 失败?
文本框原理分析: client1 和后端 Web 同处 10.1.8.0/24 内网网段,Web 收到客户端数据包源 IP 为 10.1.8.21,查询路由表发现客户端和自己同网段,直接二层转发回复给 client1,不经过 LVS 调度器; 而客户端发起请求目标 IP 是 VIP (10.1.1.10),收到的响应报文源 IP 却是后端 Web 的 RIP (10.1.8.11),IP 不匹配直接丢弃数据包,访问失败。
修复方案:给三台 Web 添加静态路由,10.1.8.21 客户端流量强制转发给 LVS
三台 web 统一执行:
bash
# ipv4.routes 添加静态路由规则:目标IP 10.1.8.21/32,网关10.1.8.10(LVS DIP)
# 所有发往内网客户端10.1.8.21的响应报文,强制走LVS调度器改写IP
[root@web1 ~]# nmcli connection modify ens33 ipv4.routes '10.1.8.21 255.255.255.255 10.1.8.10'
# 重载网卡配置生效
[root@web1 ~]# nmcli connection up ens33
# web2/web3执行相同命令
修复后验证 client1 访问正常
bash
[root@client1 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c
# 返回加权轮询结果,访问成功:
15 Welcome to web1.jhl.cloud
30 Welcome to web2.jhl.cloud
45 Welcome to web3.jhl.cloud
四、实操第二部分:LVS-DR 模式完整生产级实验(生产 99% 在用,坑点全标注⚠️)
4.1 DR 实验网络拓扑 & 主机信息表
表格
| 主机名 | IP 地址 | 网关 | DNS | 角色 |
|---|---|---|---|---|
| client2.jhl.cloud | 10.1.1.21(vmnet1) | 10.1.1.20 | 223.5.5.5 | 外网客户端 |
| client1.jhl.cloud | 10.1.8.21(vmnet8) | 10.1.8.20 | 223.5.5.5 | 内网客户端 |
| router.jhl.cloud | 10.1.1.20 / 10.1.8.20 | 10.1.8.2 | 223.5.5.5 | 跨网段路由器 |
| lvs.jhl.cloud | 10.1.8.10(vmnet8) | 10.1.8.20 | 223.5.5.5 | LVS 调度器 DIP,VIP 10.1.8.100 |
| web1.jhl.cloud | 10.1.8.11 | 10.1.8.20 | 223.5.5.5 | RS 后端,绑定 VIP 10.1.8.100/32 |
| web2.jhl.cloud | 10.1.8.12 | 10.1.8.20 | 223.5.5.5 | RS 后端,绑定 VIP 10.1.8.100/32 |
| web3. jhl.cloud | 10.1.8.13 | 10.1.8.20 | 223.5.5.5 | RS 后端,绑定 VIP 10.1.8.100/32 |
DR 模式硬性前置规则⚠️
- LVS 调度器与所有 RS 必须在同一个二层交换机网段(同网段,靠 MAC 转发);
- RS 网关不能指向 LVS DIP,直接指向上层路由器;
- VIP 需要同时绑定在 LVS 调度器、所有 RS 的虚拟网卡,子网掩码必须 32 位;
- RS 必须关闭 ARP 响应 VIP 请求,否则全网 ARP 冲突,流量全部瘫痪;
- 转发仅修改二层 MAC 头部,源 IP (CIP)、目标 IP (VIP) 全程不变,响应报文 RS 直接发客户端,不经过 LVS。
4.2 步骤 1:所有主机基础 IP 配置(逐行命令,注释省略重复部分)
client2 配置
bash
[root@localhost ~]# hostnamectl set-hostname client2.jhl.cloud
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.1.21/24 ipv4.gateway 10.1.1.20 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
client1 配置
bash
[root@localhost ~]# hostnamectl set-hostname client1.jhl.cloud
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
router 路由器配置
bash
[root@localhost ~]# hostnamectl set-hostname router.jhl.cloud
# 内网侧网卡ens33
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
# 外网侧网卡ens35
[root@localhost ~]# nmcli connection add type ethernet con-name ens35 ifname ens35 ipv4.method manual ipv4.addresses 10.1.1.20/24 autoconnect yes
[root@localhost ~]# nmcli connection up ens35
lvs 调度器基础 IP
bash
[root@localhost ~]# hostnamectl set-hostname lvs.jhl.cloud
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
web1/web2/web3 基础 IP(网关指向路由器 10.1.8.20,DR 核心区别 NAT)
bash
# web1
[root@localhost ~]# hostnamectl set-hostname web1.jhl.cloud
[root@localhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
[root@localhost ~]# nmcli connection up ens33
# web2 10.1.8.12、web3 10.1.8.13仅修改IP段,命令结构完全一致
4.3 步骤 2:router 路由器开启 IP 转发,放行防火墙
bash
# 永久开启内核转发
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 重载内核参数
[root@router ~]# sysctl -p
# 防火墙全信任,开启IP伪装跨网段转发
[root@router ~]# systemctl enable firewalld.service --now
[root@router ~]# firewall-cmd --set-default-zone=trusted
success
[root@router ~]# firewall-cmd --add-masquerade
success
[root@router ~]# firewall-cmd --add-masquerade --permanent
success
4.4 步骤 3:三台 Web 部署 Nginx(命令同 NAT 部分,省略重复注释)
bash
[root@web1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@web1 ~]# yum install -y nginx
[root@web1 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
[root@web1 ~]# systemctl enable nginx.service --now
单机访问验证同 NAT,确认 web 服务正常运行。
4.5 步骤 4:所有后端 RS(web1/web2/web3)DR 专属核心配置(最容易踩坑⚠️)
4.5.1 创建 dummy 虚拟网卡,绑定 VIP 10.1.8.100/32(掩码必须 32!)
bash
# connection add type dummy:创建虚拟环回网卡dummy,专门绑定VIP,不对外收发二层流量
# ipv4.addresses 10.1.8.100/32:32位子网掩码,仅本机识别VIP,全网路由不会冲突
[root@web1 ~]# nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
# 激活虚拟网卡
[root@web1 ~]# nmcli connection up dummy
4.5.2 写入 ARP 屏蔽内核参数,禁止 RS 响应 VIP 的 ARP 请求
bash
# cat >> 追加写入sysctl内核配置文件,永久生效
# EOF是多行文本结束标识符
[root@web1 ~]# cat >> /etc/sysctl.conf << EOF
# arp_ignore=1:仅当ARP请求目标IP是接收网卡主IP才回复,dummy网卡VIP不会响应广播ARP
net.ipv4.conf.all.arp_ignore = 1
# arp_announce=2:ARP通告仅使用和目标网段匹配的IP,不会广播VIP对应物理网卡MAC
net.ipv4.conf.all.arp_announce = 2
# 单独对dummy虚拟网卡生效ARP屏蔽规则
net.ipv4.conf.dummy.arp_ignore = 1
net.ipv4.conf.dummy.arp_announce = 2
EOF
# 重载内核参数立即生效
[root@web1 ~]# sysctl -p
ARP 内核参数详细解释表格
| 参数 | 取值 | DR 模式作用 | 不配置的后果 |
|---|---|---|---|
| net.ipv4.conf.all.arp_ignore | 1 | 拒绝非本机网卡主 IP 的 ARP 查询 | 全网所有机器都会收到 RS 回复 VIP 的 MAC,ARP 漂移,流量全部错乱 |
| net.ipv4.conf.all.arp_announce | 2 | 不主动广播 VIP 的 MAC 地址 | 交换机学习到错误 VIP-MAC 映射,LVS 收不到客户端请求 |
4.6 步骤 5:LVS 调度器配置 VIP+ipvsadm DR 规则
4.6.1 调度器创建 dummy 网卡绑定 VIP
bash
[root@lvs ~]# nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
[root@lvs ~]# nmcli connection up dummy
4.6.2 安装 ipvsadm 工具(同 NAT)
bash
[root@lvs ~]# yum install -y ipvsadm
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl enable ipvsadm --now
4.6.3 创建 DR 集群规则,-g 代表 DR 模式
bash
# 创建VIP 10.1.8.100:80集群,调度算法rr轮询
[root@lvs ~]# ipvsadm -A -t 10.1.8.100:80 -s rr
# -g gateway:DR模式标识,仅修改MAC地址转发,不转换IP
# RS端口必须和VIP端口一致,DR不支持端口映射
[root@lvs ~]# ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.11:80 -g
[root@lvs ~]# ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.12:80 -g
[root@lvs ~]# ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.13:80 -g
# 永久保存规则
[root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
4.6.4 查看 DR 规则生效状态
bash
[root@lvs ~]# ipvsadm -Ln
# 返回结果关键标识:Forward字段为Route代表DR模式
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.8.100:80 rr
-> 10.1.8.11:80 Route 1 0 0
-> 10.1.8.12:80 Route 1 0 0
-> 10.1.8.13:80 Route 1 0 0
4.7 DR 模式双向客户端访问验证(内网 client1 + 外网 client2 均可正常访问)
bash
# 内网client1测试90次轮询
[root@client1 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c
30 Welcome to web1.jhl.cloud
30 Welcome to web2.jhl.cloud
30 Welcome to web3.jhl.cloud
# 外网跨网段client2测试
[root@client2 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c
30 Welcome to web1.jhl.cloud
30 Welcome to web2.jhl.cloud
30 Welcome to web3.jhl.cloud
五、生产一键启停脚本(封装脚本,不用重复敲大量命令)
5.1 Real Server 后端 Web 一键启停脚本(保存为 lvs-rs.sh)
bash
#!/bin/bash
# description : DR模式后端Real Server一键配置脚本,start开启集群配置,stop清空
# . /etc/rc.d/init.d/functions:加载系统内置打印函数,输出OK提示
. /etc/rc.d/init.d/functions
# 定义全局VIP变量,修改此处即可更换虚拟IP
VIP=10.1.8.100
# case判断传入脚本参数$1(执行脚本后跟start/stop)
case "$1" in
start)
echo -n "Start LVS Real Server ... "
# 判断dummy虚拟网卡是否已存在
if nmcli connection |grep -q dummy;then
# 存在则直接修改IP
nmcli connection modify dummy ipv4.method manual ipv4.addresses $VIP/32
else
# 不存在则新建dummy网卡绑定VIP
nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses $VIP/32
fi
# 激活虚拟网卡
nmcli connection up dummy
# 临时写入ARP屏蔽内核参数,立即生效
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/dummy/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/dummy/arp_announce
echo OK
;;
stop)
echo -n "Stop LVS Real Server ... "
# 删除dummy虚拟网卡,解绑VIP
nmcli connection delete dummy
# 恢复ARP默认参数,关闭屏蔽
echo "0" >/proc/sys/net/ipv4/conf/dummy/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/dummy/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo OK
;;
# 参数错误提示
*)
echo "Usage: $0 start|stop"
exit 1
;;
esac
脚本使用方法
bash
# 添加执行权限
[root@web1 ~]# chmod +x lvs-rs.sh
# 开启DR后端配置
[root@web1 ~]# ./lvs-rs.sh start
# 关闭DR后端配置
[root@web1 ~]# ./lvs-rs.sh stop
5.2 Director 调度器一键启停脚本(保存为 lvs-dir.sh)
bash
#!/bin/bash
# description : LVS调度器一键启停脚本,默认加权轮询WRR
. /etc/rc.d/init.d/functions
# 判断是否安装ipvsadm,未安装自动yum安装
if rpm -q ipvsadm &>/dev/null;then
true
else
yum install -y ipvsadm &>/dev/null
fi
# 定义集群全局变量,集中修改无需改多处代码
VIP=10.1.8.100
PORT=80
rs1=10.1.8.11
rs2=10.1.8.12
rs3=10.1.8.13
interface=ens33
con_name=ens33
ipv=/sbin/ipvsadm
case "$1" in
start)
echo -n "Start LVS Director Server ... "
# 判断网卡是否已绑定VIP
if ip -br addr | grep -q $VIP;then
true
else
# 未绑定则追加VIP到网卡
nmcli connection modify ${con_name} +ipv4.addresses $VIP/32
nmcli connection up ${con_name}
fi
# -C 清空所有旧LVS规则,避免冲突
$ipv -C
# 创建加权轮询集群
$ipv -A -t $VIP:${PORT} -s wrr
# 添加三台DR模式后端,权重均为1
$ipv -a -t $VIP:${PORT} -r $rs1:${PORT} -g -w 1
$ipv -a -t $VIP:${PORT} -r $rs2:${PORT} -g -w 1
$ipv -a -t $VIP:${PORT} -r $rs3:${PORT} -g -w 1
echo OK
;;
stop)
echo -n "Stop LVS Director Server ... "
# 从网卡删除VIP地址
if ip -br addr | grep -q $VIP;then
nmcli connection modify ${con_name} -ipv4.addresses $VIP/32
nmcli connection up ${con_name}
fi
# 清空全部LVS转发规则
$ipv -C
echo OK
;;
*)
echo "Usage: $0 start|stop"
exit 1
;;
esac
脚本使用
bash
[root@lvs ~]# chmod +x lvs-dir.sh
# 启动LVS集群
[root@lvs ~]# ./lvs-dir.sh start
# 关闭清空集群
[root@lvs ~]# ./lvs-dir.sh stop
六、全文总结
6.1 NAT vs DR 核心复盘表格
表格
| 对比项 | LVS-NAT | LVS-DR(生产首选) |
|---|---|---|
| 报文修改 | 改写源 / 目标 IP | 仅修改二层 MAC 地址,IP 全程不变 |
| 流量路径 | 请求 + 响应全走调度器 | 请求走调度器,响应直回客户端 |
| 性能上限 | 低,调度器易瓶颈 | 极高,调度器无流量压力 |
| RS 网关 | 必须指向 LVS DIP | 指向上层路由,不能指向 LVS |
| ARP 配置 | 无需配置 ARP | 必须屏蔽 RS 对 VIP 的 ARP 响应 |
| 端口映射 | 支持 | 不支持 |
| 网段限制 | 无强制同网段 | LVS 与 RS 必须同一二层网段 |
6.2 小白实验避坑清单🚨
- NAT 模式内网客户端访问失败:给 RS 添加静态路由,强制回包走 LVS;
- DR 模式全网 ARP 冲突:必须配置 dummy 网卡 + arp_ignore/arp_announce 内核参数;
- DR 模式 VIP 掩码必须 32 位,24 位会出现全网路由冲突;
- ipvsadm 无配置文件,重启丢失规则,必须 ipvsadm-save 持久化;
- Director 调度器生产不要使用虚拟机,转发压力大性能不足;
- NAT 模式并发高时调度器会瓶颈,线上业务优先选择 DR 模式。
6.3 运维工作延伸思考🎯
- 单台 LVS 调度器存在单点故障,生产搭配 Keepalived 实现双主高可用;
- 调度算法选择:业务性能差异大选 WRR,性能均衡选 RR、高并发长连接选 WLC;
- DR 模式跨机房业务可升级 LVS-TUN 隧道模式,但配置复杂极少使用。
文末互动
各位 Linux 小白小伙伴复现实验过程中遇到任何报错,评论区直接贴出执行命令 + 返回报错,我会逐条解答!觉得文章逐行拆解足够详细的,点赞收藏不迷路,后续更新 LVS+Keepalived 高可用完整实操教程🤗