什么是 LVS
- LVS:Linux Virtual Server,即 Linux 虚拟服务器
- 一个由章文嵩博士发起的自由软件项目,官方站点是:http://www.linuxvirtualserver.org
现在 LVS 已经是 Linux 标准内核的一部分,在 Linux2.4 内核以前,使用 LVS 时必须重新编译内核以支持 LVS 功能模块,但是从 Linux2.4 内核之后,已经完全内置了LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能
LVS 的作用
LVS 主要用于多服务器的负载均衡
- 是一种集群(Cluster)技术,采用 IP 负载均衡技术和基于内容请求的分发技术
- 调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器
LVS 的特点
- 工作在网络层,可以实现高性能,高可用的服务器集群技术
- 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器
- 易用,配置非常简单,且有多种负载均衡的方法
- 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果
- 另外可扩展性也非常好
LVS 的体系架构
如上图,LVS 架设的服务器集群系统由三个部分组成:
- Loader Balancer:负载均衡层
- 由一台或者多台负载调度器(Director Server)组成,LVS 模块就安装在Director Server 上
- Director 的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给 Server Array 层的应用服务器(Real Server)上
- 在 Director Server 上还要安装对 Real Server 服务的监控模块 Ldirectord,此模块用于监测各个Real Server服务的健康状况,在 Real Server不可用时把它从 LVS 路由表中剔除,恢复时重新加入
- Server Array:服务器群组层
- 由一组实际运行应用服务的机器组成
- Real Server 可以是 WEB 服务器、MAIL 服务器、FTP 服务器、DNS 服务器、视频服务器中的一个或多个
- 每个 Real Server 之间通过高速的 LAN 或分布在各地的 WAN 相连接
- 在实际的应用中,Director Server 也可以同时兼任 Real Server 的角色
- Shared Storage:数据共享存储层
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数据包发往 INPUT 链
- IPVS 是工作在 INPUT 链上的,当用户请求到达 INPUT 时,IPVS 会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口,并将新的数据包发往 POSTROUTING 链
- POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
简单理解以上流程,就是:LVS 通过控制 IP 来实现负载均衡,IPVS 是其具体的实现模块,IPVS 安装在 Director Server 上,虚拟一个对外访问的 IP(VIP),用户访问 VIP,到达 Director Server,Director Server 根据一定的规则选择一个 Real Server,处理完成后,返回给客户端数据
但这些步骤产生了一些具体的问题,比如如何选择具体的 Real Server,Real Server 如何返回给客户端数据等,IPVS 为此提供了三种模式
LVS 三种模式及原理
相关术语:
- DS:Director Server,前端负载均衡器节点
- RS:Real Server,后端真实的工作服务器
- VIP:Virtual IP,向外部直接面向用户请求,作为用户请求的目标的IP地址
- DIP:Director Server IP,主要用于和内部主机通讯的IP地址
- RIP:Real Server IP,后端服务器的IP地址
- CIP:Client IP,访问客户端的IP地址
LVS-NAT 原理和特点
LVS-NAT 的原理
通过将请求报文中的目标 IP 地址与目标端口修改,来实现报文的传送
- 当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的 PREROUTING 链。,此时报文的源IP 为 CIP,目标 IP 为 VIP
- PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
- IPVS 比对数据包请求的服务是否为集群服务,若是,修改数据包的目标 IP 地址为后端服务器 IP,后将数据包发至 POSTROUTING 链,此时报文的源 IP 为 CIP,目标 IP 为 RIP
- POSTROUTING 链通过选路,将数据包发送给 Real Server
- Real Server 比对发现目标为自己的IP,开始构建响应报文发回给 Director Server,此时报文的源 IP 为 RIP,目标 IP 为 CIP
- Director Server 在响应客户端前,此时会将源 IP 地址修改为自己的 VIP 地址,然后响应给客户端,此时报文的源 IP 为 VIP,目标 IP 为 CIP
LVS-NAT 的特性
- RIP 和 DIP 应该使用私网地址,且 RIP 的网关要指向 DIP
- 请求和响应报文都要经由 Director 转发,极高负载的场景中,Director 可能会成为系统瓶颈
- 支持端口映射
- RS 可以使用任意 OS
- RS 的 RIP 和 Director 的 DIP 必须在同一 IP 网络
LVS-NAT 缺陷:对 Director Server 压力会比较大,请求和响应都需经过 Director server,Director 往往会成为系统的性能瓶颈
LVS-DR 原理和特点
LVS-DR 的原理
通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在的接口的 MAC,目标 MAC 是挑选出的某RS 的 RIP 所在接口的 MAC 地址;源 IP/PORT,以及目标 IP/PORT 均保持不变
- 当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的 PREROUTING 链,此时报文的源 IP为 CIP,目标 IP 为 VIP
- PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
- INPUT 链中的 IPVS 比对数据包请求的服务是否为集群服务,若是,将请求报文中的源 MAC 地址修改为 DIP 的 MAC 地址,将目标 MAC 地址修改 RIP 的 MAC 地址,然后将数据包发至 POSTROUTING 链,此时的源 IP和目的 IP 均未修改,仅修改了源 MAC 地址为 DIP 的 MAC 地址,目标 MAC 地址为 RIP 的 MAC 地址
- 由于 DS 和 RS 在同一个网络中,所以是通过二层来传输,POSTROUTING 链检查目标 MAC 地址为 RIP 的 MAC 地址,那么此时数据包将会发至 Real Server
- RS 发现请求报文的 MAC 地址是自己的 MAC 地址,就接收此报文,处理完成之后,将响应报文通过 lo0 接口传送给 eth0 网卡然后向外发出,此时的源 IP 地址为 VIP,目标 IP 为 CIP
- 响应报文最终送达至客户端
LVS-DR 的特性
- 确保前端路由器将目标 IP 为 VIP 的请求报文发往 Director
- 在前端网关做静态绑定
- 在 RS 上使用 arptables
- 在 RS 上修改内核参数以限制 arp 通告及应答级别
- 修改 RS 上内核参数(arp_ignore 和 arp_announce)将 RS 上的 VIP 配置在 lo0 接口的别名上,并限制其不能响应对 VIP 地址解析请求
- RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP 在同一 IP 网络;RIP 的网关不能指向 DIP,以确保响应报文不会经由 Director
- RS 跟 Director 要在同一个物理网络
- 请求报文要经由 Director,但响应不能经由 Director,而是由 RS 直接发往 Client
- 不支持端口映射
LVS-DR 的缺陷:RS 和 DS 必须在同一机房中,因为它是由二层进行转发,根据 MAC 地址来进行匹配
LVS-Tun 原理和特点
LVS-Tun 的原理
在原有的 IP 报文外再次封装多一层 IP 首部,内部 IP 首部(源地址为 CIP,目标 IP 为 VIP),外层 IP 首部(源地址为DIP,目标 IP 为 RIP)
- 当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的 PREROUTING 链,此时报文的源 IP为 CIP,目标 IP 为 VIP
- PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
- IPVS 比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层 IP 报文,封装源 IP 为DIP,目标 IP 为 RIP,然后发至 POSTROUTING 链,此时源 IP 为 DIP,目标 IP 为 RIP
- POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS(因为在外层封装多了一层 IP 首部,所以可以理解为此时通过隧道传输),此时源 IP 为 DIP,目标 IP 为 RIP
- RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来,拆除掉最外层的 IP 后,会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP,那么此时 R S开始处理此请求,处理完成之后,通过 lo 接口送给 eth0 网卡,然后向外传递,此时的源 IP 地址为 VIP,目标 IP 为 CIP
-
LVS-Tun 的特性
DIP, VIP, RIP 都应该是公网地址
- RS 的网关不能,也不可能指向 DIP
- 请求报文要经由 Director,但响应不能经由 Director
- 不支持端口映射
- RS 的 OS 得支持隧道功能
已经知道了 Director Server 要选择不同的 Real server,那么具体如何选择 Real Server 以达到负载均衡呢,IPVS实 现了十种调度方法
LVS 的十种调度算法
静态调度
- RR(Round Robin):轮询调度
- 轮询调度算法的原理:每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环
- 优点:简洁,它无需记录当前所有连接的状态,所以它是一种无状态调度
- WRR:weight,加权轮询(以权重之间的比例实现在各主机之间进行调度)
- 由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样
- 所以根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求
- SH:source hashing,源地址散列
- 主要实现会话绑定,能够将此前建立的session信息保留了
- 源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空
- 采用的散列函数与目标地址散列调度算法的相同
- 算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址
- DH:Destination hashing,目标地址散列
- 把同一个IP地址的请求,发送给同一个server
- 针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器
- 先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
动态调度
- LC(Least-Connection):最少连接
- 把新的连接请求分配到当前连接数最小的服务器
- 是一种动态调度短算法,通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度
简单算法:active256+inactive(谁的小,挑谁)
- WLC(Weighted Least-Connection Scheduling):加权最少连接
是最小连接调度的超集,各个服务器用相应的权值表示其处理性能
- 服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例
- 简单算法:(active256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑谁)
- SED(Shortest Expected Delay):最短期望延迟
- 基于wlc算法
- 简单算法:(active+1)256/weight 【(活动的连接数+1)256/除以权重】
- NQ(never queue):永不排队(改进的sed)
- 无需队列,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算
- LBLC(Locality-Based Least Connection):基于局部性的最少连接
- 基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,不签主要用于Cache集群系统,因为Cache集群中客户请求报文的布标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力
- 基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的 RealServer,若该 Real Server 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器
- LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接
- 针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器
- 若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器
- 同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度
IPVS 的基本使用
```bash ipvsadm组件定义规则的格式: 1.定义集群服务格式: (1).添加集群服务: ipvsadm -A|E -t|u|f service-address [-s scheduler]
-A: 表示添加一个新的集群服务 -E: 编辑一个集群服务 -t: 表示tcp协议 -u: 表示udp协议 -f: 表示firewall-Mark,防火墙标记 service-address: 集群服务的IP地址,即VIP -s 指定调度算法 -p 持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态 -M 定义掩码 ipvsadm -D -t|u|f service-address 删除一个集群服务 ipvsadm -C 清空所有的规则 ipvsadm -R 重新载入规则 ipvsadm -S [-n] 保存规则[-p [timeout]] [-M netmask]
2.向集群服务添加RealServer规则:
(1).添加RealServer规则
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight]
-a 添加一个新的realserver规则
-e 编辑realserver规则
-t tcp协议
-u udp协议
-f firewall-Mark,防火墙标记
service-address realserver的IP地址
-g 表示定八义为LVS-DR模型
-i 表示定义为LVS-TUN模型
-m 表示定义为LVS-NAT模型
-w 定义权重,后面跟具体的权值
ipvsadm -d -t|u|f service-address -r server-address —删除一个realserver
ipvsadm -L|l [options] —查看定义的规则
如:#ipvsadm -L -n
ipvsadm -Z [-t|u|f service-address] —清空计数器
<a name="Ox1Dq"></a>
# 配置 LVS
<a name="vkiHu"></a>
## LVS-NAT 模式配置
<a name="6W5ok"></a>
### 架构图
![图片.png](https://cdn.nlark.com/yuque/0/2020/png/335089/1602312242300-9de68dea-997b-46b5-b45b-5d4cfa457e50.png#align=left&display=inline&height=346&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=581&originWidth=1027&size=54592&status=done&style=none&width=612)
<a name="2bpCz"></a>
### IP 地址规划
| 主机名 | ens33 网卡 | ens37 网卡 |
| :---: | :---: | :---: |
| server1(RS1) | 禁用 | 172.15.100.100(RIP) |
| server2(RS2) | 禁用 | 172.15.100.200(RIP) |
| server3(DS) | 192.168.80.50(VIP) | 172.15.100.50(DIP) |
> RIP 和 DIP 应该使用私网地址,且 RIP 的网关要指向 DIP
<a name="wwAJW"></a>
### 准备工作
- 在 server1 上
```bash
# 修改 ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.80.100
PREFIX=24
GATEWAY=192.168.80.2
DNS1=192.168.80.2
NAME=ens33
DEVICE=ens33
ONBOOT=no # 因为不需要用到 ens33 网卡,所以暂时关闭
# 修改 ens37
vim /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.15.100.100
GATEWAY=172.15.100.50
PREFIX=24
NAME=ens37
DEVICE=ens37
ONBOOT=yes
# 重启网络服务
systemctl restart network
- 在 server2 上
```bash
修改 ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.80.200 PREFIX=24 GATEWAY=192.168.80.2 DNS1=192.168.80.2 NAME=ens33 DEVICE=ens33 ONBOOT=no # 因为不需要用到 ens33 网卡,所以暂时关闭
修改 ens37
vim /etc/sysconfig/network-scripts/ifcfg-ens37 TYPE=Ethernet BOOTPROTO=static IPADDR=172.15.100.200 PREFIX=24 GATEWAY=172.15.100.50 NAME=ens37 DEVICE=ens37 ONBOOT=yes
重启网络服务
systemctl restart network
- 在 server3 上
```bash
# 修改主机名
hostnamectl set-hostname server3
su –
# 修改 ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.80.50
PREFIX=24
GATEWAY=192.168.80.2
DNS1=192.168.80.2
NAME=ens33
DEVICE=ens33
ONBOOT=yes
# 修改 ens37
vim /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.15.100.50
PREFIX=24
NAME=ens37
DEVICE=ens37
ONBOOT=yes
# 重启网络服务
systemctl restart network
# 配置主机名解析文件
vim /etc/hosts
192.168.80.50 server3
# 开启内核路由机制
# 方式一:临时开启
sysctl -w net.ipv4.ip_forward=1
# 方式二:永久开启
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 刷新配置
sysctl -p
# 检查是否打开路由功能
sysctl -a | grep net.ipv4.ip_forward
配置集群(server3 上)
# 安装 ipvs 的配置工具(管理工具)
yum -y install ipvsadm
# 清空所有规则
ipvsadm -C
# 查看配置的规则
ipvsadm -L -n
# 创建集群
ipvsadm -A -t 192.168.80.50:8080 -s rr # rr 表示采用轮询的调度算法
# 查看集群
ipvsadm -L -n
# 添加调度策略
ipvsadm -a -t 192.168.80.50:8080 -r 172.15.100.100:8080 -m
ipvsadm -a -t 192.168.80.50:8080 -r 172.15.100.200:8080 -m
# 保存 rule
service ipvsadm save
运行 web 服务(server1和server2上)
# 验证 go 环境配置
which go
# 检查 go 的版本
go version
# 生成模块配置文件
mkdir -p /go_code/demo1
cd /go_code/demo1
go mod init demo1
cat go.mod
# 配置代理, 加速下载
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
# 编写 webserver.go 文件
vim webserver.go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
fmt.Println("web server")
webserver := gin.Default()
webserver.GET("/getUsers", func(context *gin.Context) {
fmt.Println("web server1")
context.JSON(200, gin.H{
"user": "Jim",
})
})
webserver.Run()
}
# 运行 webserver.go 文件
go run webserver.go
访问测试
# 在 DS(server3) 上安装并发测试工具(用 apache 自带的并发测试工具)
yum -y install httpd
# 并发测试
ab -n 20 -c 20 http://192.168.80.50:8080/getUsers
由上图可知,在 server3 上发起了20条并发测试请求,由于采用的是 rr 轮询调度算法,所以在 server1 和 server2 上应分别收到10条请求,说明 NAT 方式的 LVS 集群负载均衡实验成功
LVS-DR 模式配置
架构图
IP 地址规划
主机名 | ens33 网卡 | ens37 网卡 | loopback0 |
---|---|---|---|
server1(RS1) | 192.168.80.100(RIP) | 禁用 | 192.168.80.150(VIP) |
server2(RS2) | 192.168.80.200(RIP) | 禁用 | 192.168.80.150(VIP) |
server3(DS) | 192.168.80.50(DIP) ens33:1 192.168.80.150(VIP) |
禁用 |
DS 的 VIP 地址通过在 ens33 网卡上绑定多个 IP 地址的方式实现
开始配置
- 在 server3 上
```bash
修改 ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.80.50 PREFIX=24 GATEWAY=192.168.80.2 DNS1=192.168.80.2 NAME=ens33 DEVICE=ens33 ONBOOT=yes
修改 ens37
vim /etc/sysconfig/network-scripts/ifcfg-ens37 TYPE=Ethernet BOOTPROTO=static IPADDR=172.15.100.50 PREFIX=24 NAME=ens37 DEVICE=ens37 ONBOOT=no
重启网络服务
systemctl restart network
查看IP地址
ip a
查看路由表
route -n
绑定IP地址
ifconfig ens33:1 192.168.80.150 netmask 255.255.255.0
添加路由
route add -host 192.168.80.150 dev ens33
清空原有的集群配置
ipvsadm -C
查看集群配置
ipvsadm -L -n
配置集群(基于DR方式)
ipvsadm -A -t 192.168.80.150:80 -s rr ipvsadm -a -t 192.168.80.150:80 -r 192.168.80.100:80 -g ipvsadm -a -t 192.168.80.150:80 -r 192.168.80.200:80 -g
- 在 server1 上
```bash
# 修改 ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.80.100
PREFIX=24
GATEWAY=192.168.80.2
DNS1=192.168.80.2
NAME=ens33
DEVICE=ens33
ONBOOT=yes
# 修改 ens37
vim /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.15.100.100
GATEWAY=172.15.100.50
PREFIX=24
NAME=ens37
DEVICE=ens37
ONBOOT=no
# 重启网络服务
systemctl restart network
# 为 server1 配置VIP地址(设置在环路 lo 上)
ifconfig lo:0 192.168.80.150 netmask 255.255.255.255
# 添加路由
route add -host 192.168.80.150 dev lo:0
# 修改内核参数配置文件
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1 #只回答目的IP为本网口IP地址的arp包的请求
net.ipv4.conf.all.arp_announce = 2 #对查询目标使用最适当的本机地址
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#立即生效
sysctl -p
# 查看修改的配置
sysctl -a | grep arp_ignore
- 在 server2 上
```bash
修改 ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.80.200 PREFIX=24 GATEWAY=192.168.80.2 DNS1=192.168.80.2 NAME=ens33 DEVICE=ens33 ONBOOT=yes
修改 ens37
vim /etc/sysconfig/network-scripts/ifcfg-ens37 TYPE=Ethernet BOOTPROTO=static IPADDR=172.15.100.200 PREFIX=24 GATEWAY=172.15.100.50 NAME=ens37 DEVICE=ens37 ONBOOT=no
重启网络服务
systemctl restart network
为 server2 配置VIP地址(设置在环路 lo 上)
ifconfig lo:0 192.168.80.150 netmask 255.255.255.255
添加路由
route add -host 192.168.80.150 dev lo:0
修改内核参数配置文件
vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 #只回答目的IP为本网口IP地址的arp包的请求 net.ipv4.conf.all.arp_announce = 2 #对查询目标使用最适当的本机地址 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2
立即生效
sysctl -p
查看修改的配置
sysctl -a | grep arp_ignore ```