LVS:Linux 内核级负载均衡的架构设计、三种工作模式与十大调度算法详解

全面理解 LVS:Linux 内核级负载均衡的架构设计、三种工作模式与十大调度算法详解

一、LVS简介

LVS(Linux Virtual Server,Linux虚拟服务器)是由章文嵩博士主导的开源负载均衡项目,目前已集成到Linux内核模块中,核心是在IP层实现数据请求的负载均衡调度,为大规模服务器集群提供高可用、高并发的访问能力。

核心逻辑

终端用户访问LVS调度器(Director Server)的虚拟IP(VIP),调度器根据预设算法将请求分发至后端真实服务器(Real Server,RS);所有RS提供一致的服务(如Web、数据库)并共享存储资源,整个集群对用户完全透明(用户感知不到多台RS的存在)。

关键术语

  • VIP(Virtual IP):虚拟服务IP,对外提供服务的统一入口,用户仅需访问此IP。
  • RIP(Real IP):后端真实服务器(RS)的IP,仅用于集群内部通信。
  • DIP(Director IP):调度器(Director)的内网IP,用于与后端RS通信。
  • LB(Load Balancer):负载均衡器,即LVS调度器,负责请求分发。
  • RS(Real Server):后端真实服务器,实际处理用户请求。

官方资源

二、LVS体系结构

LVS集群系统由三层架构组成,各层分工明确,确保高可用与高扩展性,整体架构对用户透明。

层级 核心组件 功能说明
负载均衡层(Load Balancer) 1-多台调度器(Director Server) 1. 接收用户请求(目标IP为VIP); 2. 按算法分发请求至RS; 3. 监控RS健康状态(通过ldirectord模块); 4. 剔除故障RS,恢复后重新加入集群。
服务器群组层(Server Array) 多台真实服务器(RS) 1. 运行实际业务服务(Web、Mail、FTP等); 2. 处理调度器分发的请求; 3. 支持跨系统(Linux、Windows、Solaris等)。
数据共享存储层(Shared Storage) 磁盘阵列、集群文件系统 1. 为所有RS提供统一共享存储 (避免数据不一致); 2. 常用方案:NFS(简单场景)、GFS(RedHat)、OCFS2(Oracle,高并发场景)。

架构注意事项

  • 调度器(Director)仅支持Linux/FreeBSD系统(Linux 2.6+内核默认集成LVS模块),RS支持任意操作系统。
  • 调度器可同时兼任RS角色(小规模集群场景),但会增加调度器负载,不建议大规模使用。

三、LVS管理工具

LVS的管理依赖内核模块(ipvs)用户空间工具(ipvsadm) 配合,ipvs实现核心转发逻辑,ipvsadm用于配置与管理集群。

1. 核心组件分工

组件 运行位置 核心作用
ipvs 内核空间 1. 实现IP层负载均衡转发; 2. 维护虚拟服务(VIP:Port)与真实服务(RIP:Port)的映射关系; 3. 执行调度算法(如轮询、最少连接)。
ipvsadm 用户空间 1. 命令行工具,用于配置/修改/删除虚拟服务与RS; 2. 查看集群状态、保存/重载配置; 3. 是用户操作LVS的唯一入口。

2. ipvsadm核心命令与参数

ipvsadm命令格式:ipvsadm [选项] [参数],关键参数按功能分类如下:

(1)虚拟服务管理(集群级配置)
选项 含义 示例(添加TCP虚拟服务,轮询算法)
-A 添加虚拟服务 ipvsadm -A -t 192.168.100.100:80 -s rr
-E 修改已存在的虚拟服务 ipvsadm -E -t 192.168.100.100:80 -s wrr
-D 删除虚拟服务 ipvsadm -D -t 192.168.100.100:80
-C 清空所有虚拟服务配置 ipvsadm -C
-L/-l 列出虚拟服务与RS状态 ipvsadm -Ln-n:IP/端口不解析为域名,加速显示)
-S 保存配置到标准输出 ipvsadm -Sn > /etc/sysconfig/ipvsadm(推荐保存路径)
-R 从标准输入重载配置 ipvsadm -R < /etc/sysconfig/ipvsadm
(2)真实服务(RS)管理(服务级配置)
选项 含义 示例(添加RS到虚拟服务,DR模式)
-a 为虚拟服务添加RS ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.20:80 -g
-e 修改已存在的RS ipvsadm -e -t 192.168.100.100:80 -r 192.168.100.20:80 -w 2(调整权重为2)
-d 从虚拟服务删除RS ipvsadm -d -t 192.168.100.100:80 -r 192.168.100.20:80
(3)模式与权重参数
选项 含义 适用场景
-t 指定虚拟服务为TCP协议 Web(80/443)、SSH(22)等TCP服务
-u 指定虚拟服务为UDP协议 DNS(53)、NTP(123)等UDP服务
-r 指定RS的IP:Port 若端口与虚拟服务一致,可省略端口(如-r 192.168.100.20
-g 转发模式为DR(默认) DR模式(同网段、高性能场景)
-i 转发模式为TUN TUN模式(跨网段、大规模集群)
-m 转发模式为NAT NAT模式(小规模、简单部署场景)
-w 指定RS权重(默认1) 权重越高,接收的请求越多(适合RS性能差异大的场景)

3. 配置保存与重载

LVS配置默认保存在内存中,重启后丢失,需手动保存到文件:

bash 复制代码
# 保存配置(推荐路径:/etc/sysconfig/ipvsadm)
ipvsadm -Sn > /etc/sysconfig/ipvsadm

# 重载配置(重启ipvsadm服务也会自动加载此文件)
systemctl restart ipvsadm
# 或手动重载
ipvsadm -R < /etc/sysconfig/ipvsadm

四、LVS工作模式及原理

LVS核心工作模式分为NAT模式DR模式TUN模式,三者在转发方式、网段要求、性能表现上差异显著,需根据业务场景选择。

1. NAT模式(Network Address Translation)

核心原理:地址转换

通过修改IP地址实现请求转发,所有流量(请求+回包)均需经过调度器(LB),是最易部署的模式。

转发流程(以HTTP请求为例)
  1. 客户端请求:客户端发送请求,目标IP=VIP(如172.16.30.10),目标端口=80,源IP=CIP(客户端IP)。
  2. LB转发请求 :LB接收请求后,按算法选择RS(如192.168.100.20),将请求的目标IP改为RIP,目标端口不变,转发给RS。
  3. RS处理请求:RS接收请求(目标IP=自身RIP),处理后生成回包,源IP=RIP,目标IP=CIP;因RS网关指向LB的DIP,回包发送至LB。
  4. LB回包给客户端 :LB接收RS回包,将源IP改为VIP,目标IP=CIP,转发给客户端。
关键配置要求
  • RS的默认网关必须指向LB的DIP(否则回包无法送达LB)。
  • LB需双网卡:一张网卡绑定VIP(对外),一张绑定DIP(对内与RS通信)。
优缺点与适用场景
优点 缺点 适用场景
1. 部署简单,无需特殊配置RS; 2. RS支持任意操作系统; 3. 仅需LB配置公网IP。 1. 所有流量经LB,高并发时LB易成瓶颈; 2. 最多支持10-20台RS。 小规模集群(如测试环境、小型Web服务)

2. DR模式(Direct Routing,直接路由)

核心原理:MAC地址修改

仅修改数据帧的目标MAC地址(改为RS的MAC),不修改IP地址,RS处理后直接回包给客户端(不经过LB),是性能最优的模式。

转发流程
  1. 客户端请求:客户端发送请求,目标IP=VIP,目标MAC=LB的MAC(客户端通过ARP请求获取VIP的MAC)。
  2. LB转发请求 :LB接收请求后,按算法选择RS,将数据帧的目标MAC改为RS的MAC,IP地址不变(仍为VIP→CIP),转发给RS。
  3. RS处理请求:RS接收请求(目标MAC=自身,目标IP=VIP),因RS的lo接口已配置VIP(仅本机可见),可正常处理;回包直接发送给客户端(源IP=VIP,目标IP=CIP),不经过LB。
关键配置要求
  • ARP抑制 :RS需配置内核参数(arp_ignore=1arp_announce=2),避免RS响应客户端对VIP的ARP请求(防止客户端直接与RS通信,绕开LB)。
  • 同网段要求:LB与RS必须在同一物理网段(MAC地址仅在同网段有效)。
  • VIP配置:LB与所有RS均需在lo接口配置VIP(掩码/32,仅本机可见)。
优缺点与适用场景
优点 缺点 适用场景
1. 性能最优,仅请求经LB,回包直连客户端; 2. 支持大规模RS(无LB瓶颈)。 1. 需配置ARP抑制,部署较复杂; 2. LB与RS必须同网段。 中大规模集群(如高并发Web服务、电商平台)

3. TUN模式(IP Tunneling,IP隧道)

核心原理:IP隧道封装

通过"IP隧道"封装请求(双层IP头),实现跨网段转发,RS处理后直接回包给客户端,解决DR模式"同网段"限制。

转发流程
  1. 客户端请求:客户端发送请求,目标IP=VIP,源IP=CIP。
  2. LB封装隧道 :LB接收请求后,按算法选择RS,在原IP头外层新增一层IP头(源IP=LB的DIP,目标IP=RS的RIP),形成"IP隧道",转发给RS。
  3. RS解封装与处理:RS接收隧道包后,解封装外层IP头,发现内层目标IP=自身lo接口的VIP,处理请求;回包直接发送给客户端(不经过LB)。
关键配置要求
  • IPIP模块 :LB与RS需加载ipip内核模块(支持IP隧道协议),RS需在tunl0(隧道设备)配置VIP。
  • 反向路径过滤 :RS需关闭rp_filter(反向路径过滤,设为0),避免内核丢弃隧道包(隧道包源IP与接收接口路由不匹配)。
  • RS公网IP:RS需有公网IP(或能直接与客户端通信的IP),否则无法直连客户端。
优缺点与适用场景
优点 缺点 适用场景
1. 支持跨网段部署(RS可分布在不同地域); 2. 性能接近DR,无LB瓶颈。 1. 需加载IPIP模块,部署复杂; 2. RS需支持IP隧道协议(主要为Linux)。 超大规模集群(如跨地域分布式服务、CDN)

4. 三种模式核心差异对比

特性 NAT模式 DR模式 TUN模式
转发方式 IP地址修改(目标→RIP,源→VIP) MAC地址修改(目标→RS的MAC) IP隧道封装(双层IP头)
流量路径 客户端→LB→RS→LB→客户端 客户端→LB→RS→客户端 客户端→LB→RS→客户端
LB负载 高(所有流量经LB) 低(仅请求经LB) 低(仅请求经LB)
网段要求 无(RS可跨网段) 必须同网段 无(支持跨网段)
RS配置复杂度 低(仅需设网关) 中(ARP抑制+VIP配置) 高(IPIP模块+关闭rp_filter)
最大RS数量 10-20台 数百台 数千台

五、LVS调度算法

LVS调度算法分为静态算法 (仅按预设规则分发,不考虑RS负载)和动态算法(根据RS实时负载调整分发),共10种,需根据业务场景选择。

1. 静态调度算法(4种)

静态算法不感知RS的实时负载(如连接数、CPU使用率),仅按固定规则分发请求,适合RS性能一致的场景。

算法名称 英文缩写 核心逻辑 适用场景
轮询调度 RR 均等分发请求,每台RS接收请求数相同,不考虑负载。 RS性能完全一致(如相同配置的Web服务器)
加权轮询 WRR 按RS权重分发请求,权重越高,接收请求越多(权重可手动配置)。 RS性能差异大(如高配服务器权重高)
源地址散列调度 SH 根据客户端IP(CIP)通过散列函数映射到固定RS,相同CIP始终访问同一RS。 需会话保持的场景(如登录状态、购物车)
目标地址散列调度 DH 根据目标IP(如VIP或请求的域名解析IP)映射到固定RS,相同目标IP访问同一RS。 反向代理、DNS服务(需固定IP-RS映射)

2. 动态调度算法(6种)

动态算法实时感知RS的负载(如连接数、响应时间),优先将请求分发至负载较低的RS,适合RS负载波动大的场景。

算法名称 英文缩写 核心逻辑 适用场景
最少连接调度 LC 优先将请求分发至当前连接数最少的RS,不考虑权重。 RS性能一致,负载波动大(如突发流量)
加权最少连接 WLC 结合权重与连接数,公式:(当前连接数/权重),值越小的RS优先接收请求。 RS性能差异大,需动态调整负载(推荐首选)
基于局部性的最少连接 LBLC 对相同目标IP(如用户访问的页面IP),优先分发至之前处理过该IP的RS(利用缓存),若该RS负载过高则选择其他RS。 静态资源服务(如图片、CSS,利用缓存加速)
复杂的基于局部性最少连接 LBLCR 维护"目标IP→RS组"的映射,而非"目标IP→单RS",避免单RS负载过高。 大规模静态资源服务(如CDN节点)
最少期望延迟 SED 不考虑非活动连接,按公式(当前活动连接数+1)/权重计算,值越小的RS优先接收请求(权重高的RS更易被选中)。 高并发场景,需优先调度高性能RS
永不排队 NQ 若存在RS的当前连接数为0,直接将请求分发至该RS,无需排队;无空闲RS时按SED算法调度。 低延迟要求场景(如实时通信、交易系统)

3. 算法选择建议

  • 小规模测试环境:优先RR(简单易理解)。
  • 生产环境(RS性能一致):优先LC(动态适应负载)。
  • 生产环境(RS性能差异大):优先WLC(兼顾权重与负载)。
  • 需会话保持:优先SH(基于客户端IP)。
  • 静态资源/CDN:优先LBLC/LBLCR(利用缓存)。

六、配置 LVS-NAT 模式的 HTTPD 负载集群(HTTP)

环境说明核心逻辑

LVS-NAT 模式的核心是地址转换:客户端请求先发给 DR(调度器)的 VIP,DR 将目标 IP(VIP)转换为后端 RS 的 RIP,转发请求;RS 处理后,回包通过 DR(因 RS 网关指向 DR 的 DIP),DR 再将源 IP(RIP)转换为 VIP,返回客户端。所有流量需经过 DR,因此 DR 可能成为瓶颈,但配置简单,适合小规模集群。

主机名称 网卡信息(ens160为nat、ens192为仅主机) 核心作用
Client客户端 192.168.100.200(ens160)(仅访问 VIP) 发起 HTTP 请求,验证负载均衡
DR DIP:192.168.100.10,集群内;VIP:172.16.30.10,客户端访问入口 接收请求、地址转换、调度 RS
RS1/RS2 RIP:192.168.100.20/30(ens33) 运行 HTTPD,处理请求并回包给 DR
1、DR、RS1、RS2三台主机都关闭防火墙和selinux
java 复制代码
[root@dr ~]# systemctl stop firewalld  
 // 临时关闭防火墙(立即生效,重启失效)
[root@dr ~]# systemctl disable firewalld  
// 永久关闭防火墙(重启后生效)
[root@dr ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled  
 // 永久关闭SELinux(需重启系统生效,临时关闭用setenforce 0)

// RS1、RS2操作同上
[root@rs1 ~]# systemctl stop firewalld
[root@rs1 ~]# systemctl disable firewalld
[root@rs1 ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled

[root@rs2 ~]# systemctl stop firewalld
[root@rs2 ~]# systemctl disable firewalld
[root@rs2 ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled
  • 防火墙会拦截 LVS 转发的流量(如 80 端口)和集群内通信,SELinux 是 Linux 安全策略,会限制服务端口和 IP 转发,因此必须关闭(测试环境,生产环境需精细化放行规则)。
  • 若仅执行stop不执行disable,服务器重启后防火墙会重新启动,导致集群失效。
2、配置ip信息
DR 配置(双 IP:DIP+VIP)
java 复制代码
[root@dr ~]# nmcli connection add con-name ens36 ifname ens36 type ethernet  
 // 创建新网卡连接(ens36为新增物理/虚拟网卡)
[root@dr ~]# nmcli connection modify ens36 ipv4.addresses 172.16.30.10/24 ipv4.method manual connection.autoconnect yes  
// 配置VIP(172.16.30.10),手动IP,开机自启
[root@dr ~]# nmcli connection up ens36  
 // 激活网卡连接(立即生效VIP)
  • DR 需要两个 IP:DIP(192.168.100.10)用于和后端 RS 通信,VIP(172.16.30.10)用于接收客户端请求,因此需新增网卡(ens36)绑定 VIP。
RS1/RS2 配置(RIP + 网关指向 DIP)
java 复制代码
// RS1配置
[root@rs1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33  
 // 编辑网卡配置文件
...
IPADDR=192.168.100.20  // 配置RIP(集群内唯一标识)
PREFIX=24  // 子网掩码(255.255.255.0)
GATEWAY=192.168.100.10  // 网关必须指向DR的DIP!NAT模式下RS回包需经DR转发
[root@rs1 ~]# systemctl restart network  
// 重启网络服务

// RS2配置(同RS1,仅RIP不同)
[root@rs2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
...
IPADDR=192.168.100.30
PREFIX=24
GATEWAY=192.168.100.10
[root@rs2 ~]# systemctl restart network
  • RS 的网关必须指向 DR 的 DIP,这是 NAT 模式的核心:RS 处理完请求后,会将回包发给网关(DR),由 DR 转换源 IP(RIP→VIP)后返回客户端,若网关错误,回包无法到达客户端。
3. 后端 RS1 和 RS2 部署 WEB 服务器(HTTPD)
java 复制代码
// RS1部署
[root@rs1 ~]# yum -y install httpd  // 安装Apache(HTTPD)服务
[root@rs1 ~]# echo RS1 > /var/www/html/index.html  // 写入测试页面(标识当前RS,方便验证负载均衡)
[root@rs1 ~]# systemctl restart httpd  // 重启HTTPD服务
[root@rs1 ~]# systemctl enable httpd  // 设置HTTPD开机自启(避免重启后服务停止)

// RS2部署(同RS1,仅测试页面不同)
[root@rs2 ~]# yum -y install httpd  // 原步骤写"root@rs1",属于笔误,需改为root@rs2
[root@rs2 ~]# echo RS2 > /var/www/html/index.html  // 测试页面写RS2,与RS1区分
[root@rs2 ~]# systemctl restart httpd.service 
[root@rs2 ~]# systemctl enable httpd.service

备注

  • 后端 RS 的核心作用是提供 WEB 服务,因此需安装 HTTPD;测试页面写入 "RS1/RS2",是为了客户端访问时能直观看到请求被调度到哪个 RS,验证负载均衡是否生效。
4. 配置 DR(核心:开启转发 + 添加 LVS 规则)
(1)开启 IP 转发功能
java 复制代码
[root@dr ~]# vim /etc/sysctl.conf  // 编辑内核参数配置文件(原步骤写sysctl.con,少f,需修正)
net.ipv4.ip_forward = 1  // 开启IPv4转发功能(NAT模式必须,否则DR无法转发流量)
[root@dr ~]# sysctl -p  // 加载内核参数(立即生效,无需重启系统)
net.ipv4.ip_forward = 1
  • Linux 默认关闭 IP 转发(net.ipv4.ip_forward=0),DR 作为调度器需要转发客户端→RS、RS→客户端的流量,因此必须开启转发;sysctl -p用于让修改后的内核参数立即生效,避免重启系统。
(2)安装 ipvsadm 并添加 LVS 规则
java 复制代码
[root@dr ~]# yum -y install ipvsadm  // 安装LVS管理工具(ipvsadm是操作LVS内核模块的命令)
// 添加LVS规则:将VIP:80的请求调度到RS1:80,模式为NAT(-m)
[root@dr ~]# ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.20:80 -m 
// 添加LVS规则:将VIP:80的请求调度到RS2:80,模式为NAT(-m)
[root@dr ~]# ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.30:80 -m 
// 查看LVS规则(-L:列表,-n:IP不解析为域名,-v:详细信息)
[root@dr ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.10:80 rr  // rr:轮询调度(Round Robin),请求依次分配给RS1、RS2
  -> 192.168.100.20:80            Masq    1      0          0  // Masq即NAT模式,Weight=1(权重,默认1)
  -> 192.168.100.30:80            Masq    1      0          0  

// 保存LVS规则到配置文件(避免重启后规则丢失)
[root@dr ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
// 重启ipvsadm服务(加载保存的规则)
[root@dr ~]# systemctl restart ipvsadm.service 
// 设置ipvsadm开机自启(确保重启后规则自动加载)
[root@dr ~]# systemctl enable ipvsadm.service  
  • ipvsadm是 LVS 的核心工具,常用参数含义:
    • -A:添加虚拟服务(如 VIP: 端口);
    • -a:给虚拟服务添加后端 RS;
    • -t:指定虚拟服务类型为 TCP(VIP: 端口);
    • -r:指定后端 RS 的 IP: 端口;
    • -m:指定转发模式为 NAT(Masquerade);
    • -s rr:指定调度算法为轮询(默认,适合 RS 性能一致的场景)。
  • ipvsadm -Sn > /etc/sysconfig/ipvsadm:将当前规则保存到默认配置文件,systemctl restart ipvsadm会自动加载该文件的规则,避免重启后规则丢失。
5. 客户端上测试
java 复制代码
[root@hrz4 ~]# curl http://172.16.30.10  // 访问DR的VIP(HTTP端口80)
RS1  // 第一次请求调度到RS1
[root@hrz4 ~]# curl http://172.16.30.10
RS2  // 第二次请求调度到RS2(轮询生效)
[root@hrz4 ~]# curl http://172.16.30.10
RS1
[root@hrz4 ~]# curl http://172.16.30.10
RS2
  • 客户端需能访问 DR 的 VIP(172.16.30.10),通过curl命令发送 HTTP 请求,若返回结果轮询显示 "RS1""RS2",说明 LVS-NAT 模式的 HTTP 负载均衡已生效。

七、配置 LVS-NAT 模式的 HTTPD 负载集群(HTTPS)

1. DR 中生成 CA 根证书(自签名)
java 复制代码
[root@dr ~]# mkdir -p /etc/pki/CA/private  // 创建CA证书存储目录(原步骤写privat,少e,需修正)
[root@dr ~]# cd /etc/pki/CA/
// 生成CA私钥(umask 077:仅root可读可写,避免私钥泄露;2048位:密钥长度,安全足够)
[root@dr CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...

// 查看CA公钥(可选,验证私钥生成成功)
[root@dr CA]# openssl rsa -in private/cakey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
...  // 公钥内容
-----END PUBLIC KEY-----

// 生成CA根证书(自签名,-x509:生成自签名证书;-days 1024:证书有效期1024天)
[root@dr CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
You are about to be asked to enter information that will be incorporated
into your certificate request.
...
Country Name (2 letter code) [XX]:CN  // 国家(2位代码,如CN)
State or Province Name (full name) []:HB  // 省份
Locality Name (eg, city) [Default City]:WH  // 城市
Organization Name (eg, company) [Default Company Ltd]:LQ  // 组织/公司名
Organizational Unit Name (eg, section) []:linux  // 部门
Common Name (eg, your name or your server's hostname) []:dr.example.com  // CA的Common Name(需唯一,如DR的域名)
Email Address []:hrz@example.com  // 邮箱

// 创建CA证书数据库文件(记录已签署的证书)
[root@dr CA]# touch index.txt
// 创建证书序列号文件(初始为01,下次签署自动递增)
[root@dr CA]# echo 01 > serial 
[root@dr CA]# ls
cacert.pem  certs  crl  index.txt  newcerts  private  serial  // 生成的CA文件
  • CA(Certificate Authority)是证书颁发机构,自签名 CA 适用于测试环境;生产环境需使用公信 CA(如 Let's Encrypt)。
  • 私钥文件(cakey.pem)必须严格权限(umask 077),避免泄露导致证书被伪造;index.txtserial是 CA 签署证书的必要文件,缺少会导致签署失败。
2. RS1 生成证书请求(CSR)并发送给 CA
java 复制代码
[root@rs1 ~]# yum -y install mod_ssl  // 安装Apache的SSL模块(支持HTTPS)
[root@rs1 ~]# cd /etc/httpd/ 
[root@rs1 httpd]# mkdir ssl  // 创建RS证书存储目录(原步骤写"cd /etc/httpd/ "后直接"mkdir ssl",需补全路径)
[root@rs1 httpd]# cd ssl
// 生成RS1的私钥(仅root可读可写)
[root@rs1 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
// 生成证书请求(CSR,发送给CA签署)
[root@rs1 ssl]# openssl req -new -key httpd.key -days 1024 -out httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
...
Country Name (2 letter code) [XX]:CN  // 需与CA的国家一致
State or Province Name (full name) []:HB  // 需与CA的省份一致
Locality Name (eg, city) [Default City]:WH  // 需与CA的城市一致
Organization Name (eg, company) [Default Company Ltd]:LQ  // 需与CA的组织一致
Organizational Unit Name (eg, section) []:linux  // 需与CA的部门一致
Common Name (eg, your name or your server's hostname) []:rs1.example.com  // RS1的Common Name(需唯一,如RS1的域名)
Email Address []:hrz2@example.com  // 邮箱(可与CA不同)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:  // 证书密码(测试环境可留空)
An optional company name []:  // 可选公司名(留空)

[root@rs1 ssl]# ls
httpd.csr  httpd.key  // 生成的CSR和私钥
// 将CSR发送给DR(CA)(通过scp,需DR的root密码)
[root@rs1 ssl]# scp httpd.csr root@192.168.100.10:/root/
root@192.168.100.10's password: 
httpd.csr 100% 1037     1.0MB/s   00:00    
  • mod_ssl是 Apache 支持 HTTPS 的核心模块,必须安装;CSR(Certificate Signing Request)包含 RS 的公钥和身份信息,需发送给 CA 签署后才能生成可用证书。
  • CSR 中的 "Country/State/Locality/Organization/Organizational Unit" 需与 CA 的信息一致,否则 CA 会拒绝签署;"Common Name" 需为 RS 的域名或 IP,用于客户端验证服务器身份。
3. CA(DR)签署证书并发给 RS1
java 复制代码
[root@dr CA]# cd  // 回到DR的root目录(CSR已发送到这里)
// CA签署CSR,生成RS1的证书(-in:CSR文件;-out:生成的证书;-days:有效期)
[root@dr ~]# openssl ca -in httpd.csr -out httpd.crt -days 1024
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok  // 签名验证通过
Certificate Details:
        Serial Number: 1 (0x1)  // 证书序列号(从serial文件读取,初始01)
        Validity
            Not Before: Sep 22 10:16:57 2025 GMT  // 生效时间
            Not After : Jul 12 10:16:57 2028 GMT  // 过期时间(1024天)
        Subject:  // RS1的身份信息(与CSR一致)
            countryName               = CN
            stateOrProvinceName       = HB
            organizationName          = LQ
            organizationalUnitName    = linux
            commonName                = rs1.example.com
            emailAddress              = hrz2.example.com
        ...
Certificate is to be certified until ... (1024 days)
Sign the certificate? [y/n]:y  // 确认签署
1 out of 1 certificate requests certified, commit? [y/n]y  // 确认提交(更新index.txt和serial)
Write out database with 1 new entries
Data Base Updated  // 签署成功
  • 签署过程中,OpenSSL 会验证 CSR 的签名和身份信息(与 CA 一致),验证通过后生成证书(httpd.crt);此时index.txt会记录该证书信息,serial会自动递增为 02(下次签署用)。
  • 签署后的证书(httpd.crt)需发送回 RS1(原步骤未写,需补充:scp httpd.crt root@192.168.100.20:/etc/httpd/ssl/),RS1 需用该证书和自身私钥启用 HTTPS。
4. RS2 配置 HTTPS(复用 RS1 的证书,测试环境)
java 复制代码
// RS2安装SSL模块并创建证书目录
[root@rs2 ~]# yum -y install mod_ssl
[root@rs2 ~]# mkdir /etc/httpd/ssl

// RS1将证书和私钥发送给RS2(测试环境可复用,生产环境需单独生成CSR签署)
[root@rs1 ssl]# scp httpd.crt cacert.pem httpd.key root@192.168.100.30:/etc/httpd/ssl/
root@192.168.100.30's password: 
httpd.crt 100% 4565     6.8MB/s   00:00    
httpd.key 100% 1675     2.4MB/s   00:00 
  • 测试环境为简化操作,RS2 复用 RS1 的证书;生产环境中,每个 RS 需单独生成 CSR 并由 CA 签署,确保证书与服务器身份一致(避免客户端验证警告)。
5. 修改 RS1 的 SSL 配置文件并发给 RS2
java 复制代码
[root@rs1 ssl]# vim /etc/httpd/conf.d/ssl.conf  // 编辑Apache的SSL配置文件
// 关键配置项修改(指定证书和私钥路径):
// 1. 服务器证书路径(CA签署后的证书)
SSLCertificateFile /etc/httpd/ssl/httpd.crt

// 2. 服务器私钥路径(RS自身生成的私钥)
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

// 3. CA根证书路径(客户端验证服务器证书时,需信任该CA)
// SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt  // 注释默认链文件
SSLCACertificateFile /etc/httpd/ssl/cacert.pem  // 指向CA的根证书(需从DR复制到RS1的ssl目录:scp root@192.168.100.10:/etc/pki/CA/cacert.pem /etc/httpd/ssl/)

// 将修改后的ssl.conf发送给RS2(确保RS2配置一致)
[root@rs1 ssl]# scp /etc/httpd/conf.d/ssl.conf root@192.168.100.30:/etc/httpd/conf.d/ssl.conf
root@192.168.100.30's password: 
ssl.conf 100% 9472    11.3MB/s   00:00  
  • ssl.conf

    是 Apache SSL 模块的核心配置文件,需指定 3 个关键文件:

    • SSLCertificateFile:RS 的服务器证书(CA 签署后);
    • SSLCertificateKeyFile:RS 的私钥;
    • SSLCACertificateFile:CA 的根证书(客户端需信任该证书,否则会提示 "证书不受信任")。
6. 重启 RS1、RS2 的 HTTPD 服务并验证
java 复制代码
// RS1重启HTTPD(加载SSL配置)
[root@rs1 ssl]# systemctl restart httpd

// RS2重启HTTPD并验证443端口(HTTPS默认端口)
[root@rs2 ssl]# systemctl restart httpd
[root@rs2 ssl]# ss -tnl | grep 443  // 查看443端口是否监听(-t:TCP,-n:数字端口,-l:监听状态)
LISTEN     0      128         :::443                     :::*    // 443端口已监听,HTTPS服务就绪 
  • 重启 HTTPD 后,Apache 会同时监听 80(HTTP)和 443(HTTPS)端口;ss -tnl | grep 443用于验证 443 端口是否正常监听,若无输出,需检查 ssl.conf 配置是否正确(如文件路径错误)。
7. DR 中添加 HTTPS(443 端口)的 LVS 规则
java 复制代码
// 添加虚拟服务:VIP:443(HTTPS端口),调度算法rr(轮询)
[root@dr CA]# ipvsadm -A -t 172.16.30.10:443 -s rr 
// 添加RS1:将VIP:443的请求调度到RS1:443,模式NAT(-m)
[root@dr CA]# ipvsadm -a -t 172.16.30.10:443 -r 192.168.100.20 -m  // 可省略:443(默认)
// 添加RS2:将VIP:443的请求调度到RS2:443,模式NAT(-m)
[root@dr CA]# ipvsadm -a -t 172.16.30.10:443 -r 192.168.100.30 -m 

// 查看LVS规则(确认80和443端口规则均存在)
[root@dr CA]# ipvsadm -Ln 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.10:80 rr  // HTTP规则(原配置)
  -> 192.168.100.20:80            Masq    1      0          0         
  -> 192.168.100.30:80            Masq    1      0          0         
TCP  172.16.30.10:443 rr  // HTTPS规则(新添加)
  -> 192.168.100.20:443           Masq    1      0          0         
  -> 192.168.100.30:443           Masq    1      0          0  
  • HTTPS 的 LVS 规则与 HTTP 类似,仅端口从 80 改为 443;-m仍为 NAT 模式,因为 RS 的网关仍指向 DR,回包需经 DR 转发。
  • 若需永久保存规则,需再次执行ipvsadm -Sn > /etc/sysconfig/ipvsadm,避免重启后规则丢失。
8. 客户端测试 HTTPS 负载均衡
java 复制代码
// curl -k:忽略证书验证(因使用自签名CA,客户端未信任,需加-k)
[root@hrz4 ~]# curl -k https://172.16.30.10:443
RS2  // 第一次调度到RS2
[root@hrz4 ~]# curl -k https://172.16.30.10:443
RS1  // 第二次调度到RS1(轮询生效)
[root@hrz4 ~]# curl -k https://172.16.30.10:443
RS2
[root@hrz4 ~]# curl -k https://172.16.30.10:443
RS1
  • curl -k用于忽略 "证书不受信任" 的警告(测试环境);生产环境需将 CA 根证书导入客户端(如浏览器),无需加-k
  • 若返回结果轮询显示 "RS1""RS2",说明 LVS-NAT 模式的 HTTPS 负载均衡已生效。

八、配置 LVS-DR 模式的 HTTPD 负载集群

核心逻辑

LVS-DR(Direct Routing,直接路由)模式是性能最优 的 LVS 模式:客户端请求发给 DR 的 VIP,DR 仅修改数据帧的 MAC 地址(将目标 MAC 改为 RS 的 MAC),不修改 IP(VIP 仍为目标 IP),RS 接收后直接回包给客户端(无需经 DR)。因此 DR 仅处理入站请求,不处理回包,无瓶颈,但要求 DR 和 RS 必须在同一网段(因 MAC 地址仅在同网段有效)。

核心问题:所有 RS 和 DR 都配置了 VIP(避免客户端 ARP 请求冲突),需通过ARP 抑制(内核参数)确保客户端仅将 VIP 的 ARP 请求发送给 DR。

主机角色 关键 IP 说明 核心作用
Client(客户端) 192.168.100.200 发起 HTTP 请求,验证负载均衡
DR(调度器) DIP : 192.168.100.10 ; VIP : 192.168.100.100 修改 MAC 转发请求,不处理回包
RS1/RS2(后端) RIP : 192.168.100.20/30 ; VIP : 192.168.100.100 (配置在 lo 接口) 处理请求,直接回包给客户端
1. 后端 RS1、RS2 部署 HTTPD(同 NAT 模式)

RS1

java 复制代码
[root@rs1 ~]# systemctl stop firewalld
[root@rs1 ~]# systemctl disable firewalld
[root@rs1 ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled

[root@rs1 ~]# yum install httpd -y
[root@rs1 ~]# echo RS1 > /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd.service 
[root@rs1 ~]# systemctl enable httpd.service 

RS2

java 复制代码
[root@rs2 ~]# systemctl stop firewalld
[root@rs2 ~]# systemctl disable firewalld
[root@rs2 ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled

[root@rs2 ~]# yum install httpd -y
[root@rs2 ~]# echo RS1 > /var/www/html/index.html
[root@rs2 ~]# systemctl restart httpd.service 
[root@rs2 ~]# systemctl enable httpd.service 
  • DR 模式下 RS 无需配置网关指向 DR(因 RS 直接回包给客户端),仅需确保与客户端、DR 在同一网段。

LVS上配置ip:

2. DR 配置(关闭防火墙 + 配置 VIP + 开启转发)
(1)关闭防火墙和 SELinux
java 复制代码
[root@dr ~]# systemctl stop firewalld
[root@dr ~]# systemctl disable firewalld
[root@dr ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled
(2)配置 VIP 在 DR 的 lo 接口
java 复制代码
// 在lo(回环)接口配置VIP(192.168.100.100),/32掩码(仅本机可用,避免广播)
[root@dr ~]# ifconfig lo 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up
// 查看IP配置(验证VIP是否生效)
[root@dr ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.100.100/32 brd 192.168.100.100 scope global lo  // VIP已配置在lo接口
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
  • DR 的 VIP 配置在 lo 接口(而非物理网卡),原因是:DR 仅需接收客户端对 VIP 的 ARP 请求,无需将 VIP 通过物理网卡广播;/32掩码表示该 IP 仅本机使用,避免与其他设备冲突。
(3)开启 IP 转发(DR 模式需转发入站请求)
java 复制代码
[root@dr ~]# vim /etc/sysctl.conf  // 原步骤写sysctl,少.conf,需修正
net.ipv4.ip_forward = 1  // 开启IP转发(DR模式需转发请求,仅修改MAC,不修改IP)
[root@dr ~]# sysctl -p  // 生效配置
net.ipv4.ip_forward = 1

DR 模式虽不修改 IP,但需将客户端请求转发给 RS(修改 MAC 地址),因此仍需开启 IP 转发。

3. RS1、RS2 配置 ARP 抑制(核心!避免 VIP 冲突)
java 复制代码
// RS1编辑内核参数(ARP抑制)
[root@rs1 ~]# vim /etc/sysctl.conf
// 关键参数说明:
// 1. arp_ignore=1:仅回应目标IP为"自身物理网卡IP"的ARP请求(忽略对VIP的ARP请求,避免客户端找错主机)
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
// 2. arp_announce=2:发送ARP请求时,源IP使用"接收请求的接口IP"(避免RS将VIP作为源IP发ARP,导致网关缓存错误MAC)
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

// 生效内核参数
[root@rs1 ~]# sysctl -p
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

// RS2操作与RS1完全一致(复制上述配置并生效)
[root@rs2 ~]# vim /etc/sysctl.conf
// 粘贴上述4行参数
[root@rs2 ~]# sysctl -p
  • ARP 抑制是 DR 模式的核心:若不配置,客户端发送 "VIP(192.168.100.100)对应的 MAC 是多少" 的 ARP 请求时,所有 RS 都会回应(因 RS 也配置了 VIP),导致客户端随机选择一个 RS 的 MAC,DR 无法调度,集群失效。
  • arp_ignore=1确保 RS 仅回应自身物理网卡 IP(RIP)的 ARP 请求,不回应 VIP 的 ARP 请求;arp_announce=2确保 RS 发送 ARP 请求时用 RIP 作为源 IP,避免网关缓存 VIP 与 RS MAC 的映射
4. RS1、RS2 配置 VIP(在 lo 接口)并添加路由

RS1:

java 复制代码
// 在lo接口配置VIP(/32掩码,与DR一致)
[root@rs1 ~]# ifconfig lo 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up
// 添加路由:访问VIP的流量走lo接口(确保RS能处理目标IP为VIP的请求)
[root@rs1 ~]# route add -host 192.168.100.100 dev lo 

RS2:

java 复制代码
bash
[root@rs2 ~]# ifconfig lo 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up
[root@rs2 ~]# route add -host 192.168.100.100 dev lo
  • RS 在 lo 接口配置 VIP 的原因:DR 转发的请求目标 IP 是 VIP,RS 需能识别该 IP 并处理,因此需在 lo 接口(仅本机可见)配置 VIP;route add确保 RS 收到目标 IP 为 VIP 的流量时,通过 lo 接口处理(而非物理网卡)。
  • 若不添加路由,RS 会将目标 IP 为 VIP 的流量视为 "外部流量",通过网关转发(若配置网关),导致请求丢失。
5. DR 添加 LVS-DR 模式规则
java 复制代码
// 添加虚拟服务:VIP:80,调度算法rr(轮询)
[root@dr ~]# ipvsadm -A -t 192.168.100.100:80 -s rr               
// 添加RS1:调度到RS1:80,模式DR(-g,即Route模式)
[root@dr ~]# ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.20 -g
// 添加RS2:调度到RS2:80,模式DR(-g)
[root@dr ~]# ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.30 -g 

// 查看LVS规则(确认模式为Route)
[root@dr ~]# 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.100.100:80 rr
  -> 192.168.100.20:80            Route   1      0          0  // Route即DR模式
  -> 192.168.100.30:80            Route   1      0          0         

// 保存规则(避免重启丢失)
[root@dr ~]# ipvsadm -Sn >/etc/sysconfig/ipvsadm        
// 重启ipvsadm并设为开机自启
[root@dr ~]# systemctl restart ipvsadm.service 
[root@dr ~]# systemctl enable ipvsadm.service  
  • DR 模式的 LVS 规则核心是-g(Route 模式),表示 DR 仅修改数据帧的 MAC 地址(目标 MAC→RS 的 MAC),不修改 IP 地址;RS 收到后,因目标 IP 是自身 lo 接口的 VIP,会处理请求并直接回包给客户端(源 IP = 客户端 IP,目标 IP = 客户端 IP)。
  • 与 NAT 模式不同,DR 模式的 RS 无需配置网关指向 DR,回包不经过 DR,因此性能更高。
6. 客户端验证 DR 模式负载均衡
java 复制代码
[root@hrz4 ~]# curl http://192.168.100.100
RS1
[root@hrz4 ~]# curl http://192.168.100.100
RS2
[root@hrz4 ~]# curl http://192.168.100.100
RS1
[root@hrz4 ~]# curl http://192.168.100.100
RS2

九、配置 LVS-TUN 模式的 HTTPD 负载集群(原步骤未标序号,补充)

核心逻辑

LVS-TUN(IP Tunneling,IP 隧道)模式解决了 DR 模式 "同网段" 的限制,支持 DR 和 RS跨网段 部署:DR 将客户端请求封装在新的 IP 隧道中(外层 IP:DR 的 DIP→RS 的 RIP),RS 解封装后处理请求,直接回包给客户端(无需经 DR)。核心依赖IPIP 隧道协议 (需加载ipip内核模块),适合大规模集群(RS 分布在不同网段)。

主机角色 关键 IP 说明 核心作用
Client(客户端) 192.168.100.200 发起 HTTP 请求,验证负载均衡
DR(调度器) DIP(192.168.100.10)、VIP(192.168.100.55) 封装请求为 IP 隧道,转发给 RS
RS1/RS2(后端) RIP(192.168.100.20/30)、VIP(192.168.100.55,配置在 tun 设备) 解封装隧道,处理请求,直接回包
1. DR 配置(关闭防火墙 + 开启转发 + 安装 ipvsadm)
java 复制代码
[root@dr ~]# systemctl stop firewalld
[root@dr ~]# systemctl disable firewalld
[root@dr ~]# setenforce 0  // 临时关闭SELinux(永久关闭需改/etc/sysconfig/selinux)

// 开启IP转发(隧道转发需IP转发)
[root@dr ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[root@dr ~]# sysctl -p
net.ipv4.ip_forward = 1

// 安装ipvsadm(LVS管理工具)
[root@dr ~]# yum -y install ipvsadm
  • TUN 模式需 DR 支持 IP 隧道封装,因此必须开启 IP 转发;SELinux 默认可能限制隧道模块加载,需临时关闭(setenforce 0)。
2. 后端 RS1、RS2 部署 HTTPD(同 DR 模式)

RS1

java 复制代码
[root@rs1 ~]# yum install -y  httpd
[root@rs1 ~]# echo RS1 > /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd.service 
[root@rs1 ~]# systemctl enable httpd.service        
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

RS2

java 复制代码
[root@rs2 ~]# yum install -y  httpd
[root@rs2 ~]# echo RS2 > /var/www/html/index.html
[root@rs2 ~]# systemctl restart httpd.service 
[root@rs2 ~]# systemctl enable httpd.service        
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
3. RS1、RS2 加载 ipip 隧道模块并配置 VIP

RS1:

java 复制代码
// 加载ipip内核模块(支持IPIP隧道,临时加载,重启失效;永久加载需echo ipip > /etc/modules-load.d/ipip.conf)
[root@rs1 ~]# modprobe ipip
[root@rs1 ~]# ifconfig tunl0 192.168.100.55 broadcast 192.168.100.55 netmask 255.255.255.255 up

RS2:

java 复制代码
[root@rs2 ~]# modprobe ipip
[root@rs2 ~]# ifconfig tunl0 192.168.100.55 broadcast 192.168.100.55 netmask 255.255.255.255 up  
  • VIP 配置在tunl0设备(隧道设备),原因是 RS 需通过隧道接收 DR 封装的请求,目标 IP 为 VIP,因此需在隧道设备上配置 VIP。

//修改内核参数为

RS1:

java 复制代码
[root@rs1 ~]# vim /etc/sysctl.conf 
// ARP抑制(同DR模式,避免VIP冲突)
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
// 关闭反向路径过滤(rp_filter=0):隧道包的源IP可能与接收接口的IP不在同一网段,避免被内核丢弃
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

// 生效内核参数
[root@rs1 ~]# sysctl -p            
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

RS2:

java 复制代码
[root@rs2 ~]# vim /etc/sysctl.conf 
// 粘贴上述6行参数
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

[root@rs2 ~]# sysctl -p
  • rp_filter(反向路径过滤)是 Linux 的安全机制,默认开启(rp_filter=1),会丢弃 "源 IP 与接收接口路由不匹配" 的包;TUN 模式中,DR 封装的隧道包外层 IP 是 DR 的 DIP,内层 IP 是客户端 IP,RS 接收后解封装,源 IP 是客户端 IP,可能与tunl0接口的路由不匹配,因此需关闭rp_filter(设为 0),避免包被丢弃。

5. DR 添加 LVS-TUN 模式规则

java 复制代码
// 添加虚拟服务:VIP:80,调度算法rr(轮询)
[root@dr ~]# ipvsadm -A -t 192.168.100.55:80 -s rr
// 添加RS1:调度到RS1:80,模式TUN(-i,即Tunnel模式)
[root@dr ~]# ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.20 -i
// 添加RS2:调度到RS2:80,模式TUN(-i)
[root@dr ~]# ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.30 -i 

// 查看LVS规则(确认模式为Tunnel)
[root@dr ~]# 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.100.55:80 rr
  -> 192.168.100.20:80            Tunnel  1      0          0  // Tunnel即TUN模式
  -> 192.168.100.30:80            Tunnel  1      0          0         

// 保存规则并设为开机自启
[root@dr ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@dr ~]# systemctl restart ipvsadm.service 
[root@dr ~]# systemctl enable ipvsadm.service        
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
  • TUN 模式的 LVS 规则核心是-i(Tunnel 模式),表示 DR 将客户端请求封装为 IPIP 隧道包:
    • 外层 IP 头:源 IP=DR 的 DIP(192.168.100.10),目标 IP=RS 的 RIP(192.168.100.20/30);
    • 内层 IP 头:源 IP = 客户端 IP(192.168.100.200),目标 IP=VIP(192.168.100.55);
  • RS 收到隧道包后,解封装得到内层 IP 头,因目标 IP 是自身tunl0接口的 VIP,会处理请求并直接回包给客户端(源 IP = 客户端 IP,目标 IP = 客户端 IP),不经过 DR。

客户端验证:

java 复制代码
[root@hrz4 ~]# curl http://192.168.100.55
RS1
[root@hrz4 ~]# curl http://192.168.100.55
RS2
[root@hrz4 ~]# curl http://192.168.100.55
RS1
[root@hrz4 ~]# curl http://192.168.100.55
RS2
[root@hrz4 ~]# curl http://192.168.100.55
  • 客户端无需与 RS 在同一网段(TUN 模式支持跨网段),只需能访问 DR 的 VIP;若返回结果轮询显示 "RS1""RS2",说明 LVS-TUN 模式已生效。
  • 可通过tcpdump在 RS 的tunl0接口抓包(tcpdump -i tunl0 host 192.168.100.200 and port 80),会发现 RS 接收的是 IPIP 隧道包,解封装后处理请求。
相关推荐
maosheng114611 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken12 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.29112 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C12 小时前
CPU Cache
linux·cache
Hoshino.4113 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
播播资源15 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry15 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
lay_liu15 小时前
Linux安装redis
linux·运维·redis
寂柒17 小时前
序列化与反序列化
linux·网络
lay_liu17 小时前
ubuntu 安装 Redis
linux·redis·ubuntu