LVS三种模式实战

IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查看报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS不用检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。

IPVS是LVS的关键,因为LVS的IP负载平衡技术就是通过 IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server 上,同时在Director Server上虚拟出一个IP 地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。

LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块(工作在Netfilter框架的input链上),其实LVS的功能都是IPVS模块实现的,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块。

重要命令介绍

ipvsadm常用指令

选项 作用
-A 添加虚拟服务节点
-D 删除虚拟服务节点
-L 查看虚拟服务节点列表
-n 以数字形式显示查看内容
-a 添加真实服务节点
-d 删除真实服务节点
-l 查看真实服务节点列表
-t 指定虚拟服务器IP地址
-s 指定调度算法
-r 指定真实服务器节点IP地址
-w 指定权重值
-g 直接路由模式(默认)
-m NAT模式
-i 隧道模式

NAT模式

工作原理

  • 当用户的请求到达调度器时,请求报文会先到内核空间的PREROUTING链上。此时报文的源IP为CIP,目标IP为VIP
  • PREROUTING检查发现数据包的目标IP是本机,就将数据包送至INPUT链。
  • IPVS工作在INPUT链上,当数据包抵达INPUT链后,IPVS会检查数据包所请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器RIP,然后将数据包送往 POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP。
  • POSTROUTING链通过选路,将数据包转发给Real Server
  • Real Server对比发现目标IP是自己,就会接受这个请求报文,开始构建响应报文发回给调度器。源IP为RIP,目标IP为CIP
  • 调度器在响应客户端前,会将报文的源IP地址修改为自己的VIP,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP

LVS调度器(DS)配置

shell 复制代码
# 安装对应模块
yum -y install ipvsadm nginx  tcpdump

# 开启路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

# 加载ip_vs模块
modprobe ip_vs
lsmod | grep ip_vs

# 启动ipvsadm服务,创建文件必须先创建
touch /etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm

# 配置分配策略
ipvsadm -A -t 192.168.100.100:80 -s rr
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.1:80 -m
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.1:80 -m

ipvsadm-save > /etc/sysconfig/ipvsadm

真实服务器(RS)端配置

shell 复制代码
yum -y install epel-release nginx tcpdump

systemctl start nginx

# 配置指定IP 192.168.100.1  192.168.100.2 ,且将网关指定为 192.168.100.100

# 192.168.100.1
echo web1 > /usr/share/nginx/html/index.html
# 192.168.100.2
echo web2 > /usr/share/nginx/html/index.html

DR模式

工作原理

  • 当客户端用户发送请求给网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过 LVS 负载均衡服务器
  • 这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。
  • 数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。
  • 数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务。
  • 如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。
  • 数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。
  • 数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。
  • 此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC ,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。

DS配置

shell 复制代码
# 删除NAT模式的路由功能即net.ipv4.ip_forward = 1
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.default.send_redirects= 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p

# 配置VIP
ifcfg ens33:0 192.168.100.101

# ipvsadm 安装同NAT模式

# 配置分配策略
ipvsadm -A -t 192.168.100.101:80 -s rr
ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.1:80 -g
ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.2:80 -g

ipvsadm-save > /etc/sysconfig/ipvsadm

RS配置

shell 复制代码
# 启用nginx同NAT模式,省略

# 配置抑制ARP防止VIP在同一网段产生IP地址冲突
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.default.arp_ignore=1 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce=2

# 为两台RS配置临时虚拟ip并添加路由
ifconfig lo:0 192.168.100.101/32
route add -host 192.168.115.101/32 dev lo:0 # 将访问交由本机处理后返回

TUNL模式

DS配置

shell 复制代码
# 安装ipvsadm 同NAT模式

ipvsadm -C

# 启用ipip模块 使用隧道网卡配置VIP
modprobe ipip
ip addr add 192.168.100.102/24 dev tunl0
ip link set up tunl0
ip route del 192.168.100.0/24 dev tunl0#删除tunl0路由

# 启用路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

# 配置调度策略
ipvsadm -A -t 192.168.100.102:80 -s rr
ipvsadm -a -t 192.168.100.102:80 -r 192.168.100.1:80 -i
ipvsadm -a -t 192.168.100.102:80 -r 192.168.100.2:80 -i
ipvsadm-save > /etc/sysconfig/ipvsadm

RS配置

shell 复制代码
# 启用nginx同NAT模式,省略

# 启用ipip模块 使用隧道网卡配置VIP
modprobe ipip
ip addr add 192.168.100.102/24 dev tunl0
ip link set up tunl0
ip route del 192.168.100.0/24 dev tunl0#删除tunl0路由


vim /etc/sysctl.conf
# 启用路由功能
net.ipv4.ip_forward = 1
# 配置本地ipv4策略,防止VIP冲突
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.default.arp_ignore=1 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce=2
# 配置本地ipv4策略,防止访问丢包
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter=0

sysctl -p
相关推荐
Ching·1 小时前
esp32使用ESP-IDF在Linux下的升级步骤,和遇到的坑Traceback (most recent call last):,及解决
linux·python·esp32·esp_idf升级
斯是 陋室1 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
晨欣2 小时前
大型语言模型(LLM)在网络安全中最具商业价值的应用场景(Grok3 回答 DeepSearch模式)
网络·web安全·语言模型
子柒s2 小时前
Linux 基础
linux
有书Show2 小时前
个人IP的塑造方向有哪些?
网络·网络协议·tcp/ip
MC皮蛋侠客2 小时前
Ubuntu安装Mongodb
linux·mongodb·ubuntu
HHRL-yx2 小时前
C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
网络·c++·tcp/ip
迈威通信2 小时前
接口黑洞?破!安全堡垒?筑!冰火炼狱?战!MES7114W终极掌控
网络·安全
2201_753436953 小时前
ubuntu基础搭建
linux·运维·ubuntu
baynk3 小时前
wireshark的常用用法
网络·测试工具·wireshark·ctf