LVS概念
VS:Virtual Server
RS:Real Server
CIP:Client IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的IP
RIP: Real server IP
访问流程:CIP<-->VIP == DIP<-->RIP
lvs集群的类型
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发 RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈 支持端口映射,可修改请求报文的目标PORT VS必须是Linux系统,RS可以是任意OS系统
lvs-dr: 操纵封装新的MAC地址
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP
lvs集群中的增删改
管理集群服务中的增删改
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记 一个数字
管理集群中RealServer的曾增删改
-a #添加realserver
-e #更改realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ipip隧道模式
-m #nat模式
-w #设定权重
-Z #清空计数器
-D #删除某条lvs策略
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :输出速率信息
NAT模式:
以rhel9为例:
环境配置
本地软件仓库:
mkdir /rhel9
mount /dev/sr0 /rhel9
echo mount /dev/sr0 /rhel9 >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
rm -fr /etc/yum.repos.d
mkdir /etc/yum.repos.d
cd /etc/yum.repos.d
vim rhel9.repo
dnf makecache
关闭所有火墙与selinux
systemctl diable --now firewalld
setenforce 0
四台虚拟机
一台做客户端:
ip为 172.25.254.100
一台lvs:
nat ip :172.25.254.200
仅主机网卡ip:192.168.0.100
在lvs中打卡内核路由功能
vim /etc/sysctl.conf
两台web服务:
webserver1:192.168.0.10 网关:192.168.0.100
安装http服务
dnf install httpd -y
echo webserver1 - 192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpd
webserver2:192.168.0.20 网关:192.168.0.100
安装http服务
dnf install httpd -y
echo webserver2 - 192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd
测试:
在lvs上:
环境配置完成
LVS配置:
下载lvs软件(ipvsadm)
dnf install ipvsadm
在lvs添加调度策略
ipvsadm -A -t 172.25.254.200:80 -s rr
ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.10:80 -m
ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.20:80 -m
查看策略
在客户机上测试:
修改为权重调用算法
ipvsadm -C(清除lvs策略)
ipvsadm -E -t 172.25.254.200:80 -s wrr
ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.10:80 -m -w 2
ipvsadm -e -t 172.25.254.200:80 -r 192.168.0.20:80 -m -w 1
测试
DR模式:
环境配置
本地软件仓库:
mkdir /rhel9
mount /dev/sr0 /rhel9
echo mount /dev/sr0 /rhel9 >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
rm -fr /etc/yum.repos.d
mkdir /etc/yum.repos.d
cd /etc/yum.repos.d
vim rhel9.repo
dnf makecache
关闭所有防火墙与selinux
systemctl disable --now firewalld
setenforce 0
rhel9为例:
五台虚拟机:一台client(客户机),一台route(路由器),一台LVS,两台web服务器
client ip(网卡为nat模式) 172.25.254.100 网关:172.25.254.200
route ip1(网卡为nat模式) 172.25.254.200
ip2(网卡为仅主机模式) 192.168.0.100
LVS ip1(网卡为仅主机模式) 192.168.0.50 网关:192.168.0.100
ip2(VIP) 192.168.0.30
将VIP加到环回网卡上(子网掩码为32,不然会崩)
ip a a 192.168.0.30/32 dev lo
webserver1 ip(网卡为仅主机模式) 192.168.0.10 网关:192.168.0.100
将VIP加到环回网卡上(子网掩码为32,不然会崩)
ip a a 192.168.0.30/32 dev lo
VIP不对外响应
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/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
安装http服务
dnf install httpd -y
echo webserver1 - 192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpd
webserver2 ip(网卡为仅主机模式) 192.168.0.20 网关:192.168.0.100
将VIP加到环回网卡上(子网掩码为32,不然会崩)
ip a a 192.168.0.30/32 dev lo
VIP不对外响应
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/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
安装http服务
dnf install httpd -y
echo webserver2 - 192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd
测试:
在lvs上:
环境配置完成
LVS配置
LVS策略
ipvsadm -A -t 192.168.0.30:80 -s wrr
ipvsadm -a -t 192.168.0.30:80 -r 192.168.0.10:80 -g(直连路由模式) -w 1
ipvsadm -a -t 192.168.0.30:80 -r 192.168.0.20:80 -g -w 2
查看策略:
测试:
火墙标签(在DR模式的基础上)
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记
--set-mark value
在两台web服务器上都安装mod_ssl并重启http服务(同时开放80和443端口)
dnf install mod_ssl -y
systemctl restart httpd
轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
删除并重写lvs策略:
ipvsadm -A -t 192.168.0.30:80 -m rr
ipvsadm -A -t 192.168.0.30:443 -m rr
ipvsadm -a -t 192.168.0.30:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.30:443 -r 192.168.0.10:443 -g
ipvsadm -a -t 192.168.0.30:80 -r 192.168.0.20:80 -g
ipvsadm -a -t 192.168.0.30:443 -r 192.168.0.20:443 -g
查看策略:
测试:
当访问vip时两次调度都到了webserver1
解决轮询错误:
LVS中为端口做标记
iptables -t mangle -A PREROUTING -d 192.168.0.30 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
删除并重写lvs策略
ipvsadm -C
ipvsadm -A -f 66 -s rr
ipvsadm -a -f 66 -r 192.168.0.10 -g
ipvsadm -a -f 66 -r 192.168.0.20 -g
查看策略:
测试:
LVS持久连接(在DR模式火墙标签的基础上)
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上
如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。
如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
更改lvs策略:
ipvsadm -E -f 66 -m rr -p 3000
测试: