一 LVS简介
LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现
相关术语:
VS: Virtual Server,负责调度
RS:RealServer,负责真正提供服务
CIP:Client IP 客户端的IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的 IP
RIP: Real server IP RS内网 IP
访问流程:CIP <–> VIP == DIP <–> RIP
注意:
客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
##!!!以下实验都需systemct disable --now firewalld.service关闭防火墙
二 NAT模式
访问流程
1).客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口
(9000port)
2).VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
3).RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口
(9000port)
4.)VS服务器接收到响应数据包,改变包中的数据来源(RIP1–>VIP),响应目标端口(9000–>80)
5).VS服务器把修改过报文的响应数据包回传给客户端
6).lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
实现步骤
1) 环境准备
这里我们准备三台干净的rhel9的环境,1台VS,两台RS,VS需要设定两个网卡,一个nat模式,一个仅主机模式
VS
这里我们用vmset脚本快速生成两个网卡ip,eth0是nat模式,eth1是仅主机模式 后面是我们脚本内容
但是这里存在一个问题 仅主机模式下的eth1不需要dns解析和网关我们需要
cd /etc/NetworkManager/system-coonnections/进入该目录
vim eth1.nmconnection 修改eth1网卡配置删掉dns和网关
修改后如下:
在重新启动网卡eth1
nmcli connection reload
nmcli connection up eth1
RS(两台操作一样)
只需要一个网卡(仅主机模式)
这里我们用上面的vmset脚本快速生成仅主机模式的eth0网卡ip
在修改配置文件,RS是内网ip,网关要连接VS的内网DIP,也就是上面VS的eth1的ip
修改如下:
另外一台RS类似操作
2)VS机 安装LVS软件并配置内核路由
打开内核路由
因为DIP是内网ip,仅主机模式,需要开启内核路由来进行内网通信
在/etc/sysctl.conf 文件中加入net.ipv4.ip_forward =1参数,然后
net.ipv4.ip_forward =1刷新配置
下载LVS软件
yum install ipvsadm -y
3)配置LVS策略
在lvs机中添加(这里的172是lvs机的VIP,192是RS的IP,80端口)
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.220.10:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.220.20:80 -m
查看策略
ipvsadm -Ln
4)在RS机配置web服务
yum install httpd -y
echo web1-server -192.168.220.10 > /var/www/html/index.html
另一台RS机相同操作 但是echo这里改成
echo web2-server -192.168.220.20 > /var/www/html/index.html
方便区分
5) 测试(在LVS机上操作)
我们可以看到rr轮询调度算法会重复访问RS1和RS2
三 DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip
访问流程
1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
2.VS调度主机接收到数据帧后把帧中的VIP的MAC改为RS1的MAC,此时帧中的数据为客户端IP+客户端
的MAC+VIP+RS1的MAC
3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的
MAC
实验步骤
1)环境准备
DR模式我们需要五台机子,client客户,route,路由,lvs,RS1,RS2
client一个ip,nat模式
route两个ip,nat和仅主机模式
lvs和rs1,rs2一个ip,仅主机模式(我们在后续会为这三台机子配回环ip,使RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client)
client
nat
网关
route
nat
仅主机
网关
lvs
仅主机
网关
RS1
仅主机
网关
RS2
仅主机
网关
2)配置回环ip并且使RS的vip不对外响应
lvs
ip addr add dev lo 192.168.220.200/32
RS1
ip addr add dev lo 192.168.220.200/32
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
RS2
ip addr add dev lo 192.168.220.200/32
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
3)打开route机内核路由
因为DIP是内网ip,仅主机模式,需要开启内核路由来进行内网通信
在/etc/sysctl.conf 文件中加入net.ipv4.ip_forward =1参数,然后
net.ipv4.ip_forward =1刷新配置
4) 在lvs机下载LVS软件
yum install ipvsadm -y
5)配置LVS策略
在lvs机中添加(这里的192.168.220.200是回环ip也是VIP,192.168.220.10和192.168.220.10是RS机的IP,80端口)
查看策略
ipvsadm -Ln
6)在RS机配置web服务
yum install httpd -y
echo web1-server -192.168.220.10 > /var/www/html/index.html
另一台RS机相同操作 但是echo这里改成
echo web2-server -192.168.220.20 > /var/www/html/index.html
方便区分
7)在client机测试
我们可以看到rr轮询调度算法会重复访问RS1和RS2
四 防火墙标记
轮询错乱
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
两个rr轮询策略
两次访问都是第一个RS1轮询错误(443端口需要我们在RS机上yum install mod_ssl -y下载插件然后重启http服务就可以使用https了,-k是忽略证书验证)
解决轮询错乱
1)在lvs机上制定iptables 防火墙规则
iptables -t mangle -A PREROUTING -d 192.168.220.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
-t是后面是iptables的一个表(mangle)
-A是后面是mangle表里的一个链路(PREROUTING)
-d是指定ip地址
-p是tcp协议
-m multiport --dports 80,443使用multiport模块来匹配多个端口打包,这里是80,443端口
-j MARK --set-mark 66对打包数据标记设值,这里是66
查看是否加上规则
2)清空并设置新策略
ipvsadm -C
ipvsadm -A -f 66 -s rr
ipvsadm -a -f 66 -r 192.168.220.10 -g
ipvsadm -a -f 66 -r 192.168.220.20 -g
查看策略