LVS的NAT模式实战案例(支持端口映射)
环境如下:
一台:internet client:192.168.10.123/24 GW:无 仅主机
一台:lvs
eth1 仅主机 192.168.10.100/24
eth0 NAT 10.0.0.100/24
两台RS:
RS1:10.0.0.8/24 GW:10.0.0.2 NAT
RS2:10.0.0.18/24 GW:10.0.0.2 NAT
配置如下
第一步:在LVS机器上
安装 yum -y install ipvsadm
第二步:在RS1 10.0.0.8机器上
安装 yum -y install httpd nginx mysql-server redis
启动服务systemctl enable --now httpd redis mysqld
把主机名写入web界面的配置文件中
hostname > /var/www/html/index.html
第三步:在RS2 10.0.0.18机器上
安装 yum -y install httpd nginx mysql-server redis
启动服务systemctl enable --now httpd redis mysqld
把主机名写入web界面的index.html中
hostname > /var/www/html/index.html
第四步:在LVS机器测试RS1、RS2的web页面是否能访问
curl 10.0.0.8 curl 10.0.0.18
访问结果为刚才写入的主机名
第五步:RS1和RS2下载调试无误后修改网关为10.0.0.100
vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=10.0.0.100
reboot或者
nmcli connection reload
nmcli connection up eth0
查看网关是够修改
route -n
第六步:在LVS机器上并开启路由转发
创建集群并指定调度算法为RR(轮询算法)
ipvsadm -A -t 192.168.10.100:80 -s rr
在集群中添加后端服务器RS1、RS2,并指定用NAT模式(m)
ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.8:80 -m
ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.18:80 -m
开启路由转发
先查询ipforward有没有开启,1为开启
sysctl -a |grep ip_for
net.ipv4.ip_forward = 0
未开启,去更改配置文件
vim /etc/sysctl.conf
添加net.ipv4.ip_forward = 1
重新加载sysctl -p
net.ipv4.ip_forward = 1
第七步:去internet进行访问
curl 192.168.10.100
RS2
curl 192.168.10.100
RS1
配置完成
可以更改lvs集群权重对后端服务器进行访问,把RS1 10.0.0.8权重改为3,RS2不变
第一步:修改集群为加权轮询
ipvsadm -E -t 192.168.10.100:80 -s wrr
第二步:修改集群下的后端RS1权重为3
ipvsadm -e -t 192.168.10.100:80 -r 10.0.0.8:80 -m -w 3
查看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.10.100:80 rr
-> 10.0.0.8:80 Masq 3 0 0
-> 10.0.0.18:80 Masq 1 0 0
在客户端访问,结果是三次RS1,一次RS2
可以根据源地址进行哈希算法,如果是同一个地址来了,就固定往一个地址上调度,实现会话保持,改成sh算法
ipvsadm -E -t 192.168.10.100:80 -s sh
只要源地址不变,第一次访问谁,之后就固定访问谁。
扩展1:调度https服务,增加端口443
在后端服务器RS1、RS2安装https服务 yum -y install mod_ssl
重启httpd服务 systemctl restart httpd
查看有无443端口
ss -ntl
在LVS上通过https访问后端服务器
curl -k https://10.0.0.8 因为是自签名证书,不信任,所以加-k,忽略证书认证
添加集群,让internet服务器可以访问后端服务器
ipvsadm -A -t 192.168.10.100:443 -s rr
在集群中添加后端服务器RS1、RS2
ipvsadm -a -t 192.168.10.100:443 -r 10.0.0.8:443 -m
ipvsadm -a -t 192.168.10.100:443 -r 10.0.0.18:443 -m
就可以在internet访问了
curl -k https://192.168.10.100
扩展2:lvs服务也可调度MySQL:
在RS1、RS2 MySQL中创建帐号:create user test@'192.168.10.%' identified by '123456';
在LVS中添加关于MySQL连接的集群:
创建集群:ipvsadm -A -t 192.168.10.100:3306 -s rr
在集群中添加后端服务器RS1、RS2
ipvsadm -a -t 192.168.10.100:3306 -r 10.0.0.8:3306 -m
ipvsadm -a -t 192.168.10.100:3306 -r 10.0.0.18:3306 -m
用internet连接,下载安装mysql服务(添加临时NAT网卡,安装好后移除网卡)
yum -y install mysql-server
mysql -uroot -p123456 -h192.168.10.100
连进来之后查看连接到哪台后端服务器上了
select @@hostname;
也可不进入mysql连接
mysql -uroot -p123456 -h192.168.10.100 -e "select @@hostname;"
LVS的NAT模式支持端口映射
后端服务器RS1更改端口号
在vim /etc/httpd/conf/httpd.conf
linsen 8080
systemctl restart httpd
在lvs中修改RS1删除原来的调度规则,增加关于8080的调度规则
ipvsadm -d -t 192.168.10.100:80 -r 10.0.0.8:80
添加规则
ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.8:8080 -m
去internet进行访问
curl 192.168.10.100
RS2
curl 192.168.10.100
RS1
lvs作为中间人,只负责转发客户端和后端服务器的通讯,不参与连接。但lvs有个重大缺陷,没有后端服务器检查功能,当后端服务挂了,一样会调度过去。
一个服务访问不了,说说你的排错思想
第一步:排查网络,确保网络是通的,可以用ping命令来确认网络是否通畅
第二步:网络ping通了,连接一下端口,查看服务是否开启,可以用telnet命令加ip和端口来确认。有些服务看是够开启路由转发
第三步:查看配置命令和权限有无限制
LVS的DR模式实战案例(不支持端口映射)
序号 | 源 | 目的 |
1 | 192.168.10.123:xxx MACinternet | 10.0.0.100:80 MACroute-eth1 |
2 | 192.168.10.123:xxx MACroute-eth0 | 10.0.0.100:80 MAClvs |
3 | 192.168.10.123:xxx MAClvs | 10.0.0.100:80 MACRS1 |
4 | 10.0.0.100:80 MACRS1 eth0 | 192.168.10.123:xxx MACroute-eth0 |
5 | 10.0.0.100:80 MACroute-eth1 | 192.168.10.123:xxx MACinternet |
环境如下
internrt:
需要一块仅主机网卡eth0 192.168.10.123
指定网关:GATEWAY=192.168.10.200
路由:
两块网卡,一块仅主机网卡eth1 192.168.10.200,一块NAT网卡eth0 10.0.0.200
开启ipforward
vim /etc/sysctl.conf
去掉注释net.ipv4.ip_forward=1
重读配置文件 sysctl -p
lvs:
一块NAT网卡 10.0.0.10
指定网关:GATEWAY=10.0.0.200,此处网关必须有,要不然从外网段来的包到不了这里。
也可不指定网关,把网关删掉,但是得修改内核参数/proc/sys/net/ipv4/conf/all/rp_filter,默认为1
修改:echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/wth0/rp_filter
给回环网卡添加VIP:ifconfig lo:1 10.0.0.100/32
这个不需要开启ipforward功能,回来包不经lvs了,所以关掉ipforward功能
注释掉配置文件中的net.ipv4.ip_forward=1
临时修改sysctl -w net.ipv4.ip_forward=0
RS1:
一块NAT网卡 10.0.0.8,指定网关:GATEWAY=10.0.0.200
RS2:
一块NAT网卡 10.0.0.18,指定网关:GATEWAY=10.0.0.200
设置好网卡,操作如下
第一步:防止打架,在RS1、RS2在内核中关闭ignore和announce(此为临时修改)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #关闭所有网卡的ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #关闭所有网卡的announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore #关闭回环网卡的ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce #关闭回环网卡的announce
永久改可写入配置文件 /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore
net.ipv4.conf.all.arp_announce
net.ipv4.conf.lo.arp_ignore
net.ipv4.conf.lo.arp_announce
(实验环境以上只做一项,实际工作中需要永久修改)
第二步:给RS1、RS2的回环网卡配置VIP
ifconfig lo:1 10.0.0.100/32
第三步:添加LVS调度规则
创建集群ipvsadm -A -t 10.0.0.100:80 -s rr
在集群中添加RS1、RS2调度规则 -g为DR模型
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:80 -g
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.18:80 -g
第四步:在internet机器上访问VIP
[root@internet ~]#curl 10.0.0.100
RS2
[root@internet ~]#curl 10.0.0.100
RS1
扩展:要求lvs的VIP和其所在主机DIP不在同一个网段
VIP是172网段,DIP在10网段,这种情况下如何配(物理上是一个网段,逻辑上两个网段,因为物理上DR模型不允许跨网段,因为在进行DR模型工作的时候,LVS要利用arp广播找到real-server的ip地址,但arp广播加路由器是过不去的)
就是在路由的靠近LVS端的网卡上多配置一个IP,配置172网段
如下操作:
第一步:
在路由eth0上添加IP
eth0:
addresses:
- 10.0.0.200/24
- 172.16.0.200/24
重新加载:
netplan apply
ip a 查询eth0上是否是两个IP
第二步:
在lvs机器上先删除回环网卡 ifconfig lo:1 down
在RS1、RS2上同样删除回环网卡 ifconfig lo:1 down
第三步:重新配置LVS、RS1、RS2的回环网卡,可用脚本执行
RS1、RS2执行脚本 lvs_dr_rs.sh,写好脚本,如下
先看脚本中的各地址是否符合需要配置的地址
给脚本加权限并执行脚本
[root@RS2 ~]#chmod +x lvs_dr_rs.sh
[root@RS2 ~]#./lvs_dr_rs.sh start
The RS Server is Ready!
#!/bin/bash
vip=172.16.0.100
mask='255.255.255.255'
dev=lo:1
#rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
#service httpd start &> /dev/null && echo "The httpd Server is Ready!"
#echo "`hostname -I`" > /var/www/html/index.html
case $1 in
start)
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
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
第四步:给LVS配置回环网卡并加ipvsadm集群规则,可用脚本
先看脚本中的各地址是否符合需要配置的地址
给脚本加权限并执行脚本
[root@lvs ~]#chmod +x lvs_dr_vs.sh
[root@lvs ~]#./lvs_dr_vs.sh start
The VS Server is Ready!
#!/bin/bash
vip='172.16.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='10.0.0.8'
rs2='10.0.0.18'
scheduler='rr'
type='-g'
#rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
case $1 in
start)
ifconfig $iface $vip netmask $mask #broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
echo "The VS Server is Ready!"
;;
stop)
ipvsadm -C
ifconfig $iface down
echo "The VS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
第五步:清除LVS中原来的规则
[root@lvs ~]#ipvsadm -D -t 10.0.0.100:80
[root@lvs ~]#ipvsadm -Ln 只剩下了刚加的规则
第六步:去internet访问
[root@internet ~]#curl http://172.16.0.100
RS1
[root@internet ~]#curl http://172.16.0.100
RS2
成功!!!
LVS-TUNNEL隧道模式案例(跨网段访问,不支持端口映射)
[root@lvs ~]#ipvsadm -A -t 10.0.0.100:80 -s rr
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:80 -i
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.18:80 -i
第一步:删除路由后来添加的ert0ip:172.16.0.200/24
ip a del 172.16.0.200/24 dev eth0
第二步:用做DR模型的脚本删除LVS、RS1、RS2清除VIP及规则
LVS:bash lvs_dr_vs.sh stop
The VS Server is Canceled!
RS1:bash lvs_dr_rs.sh stop
The VS Server is Canceled!
RS2:bash lvs_dr_rs.sh stop
The VS Server is Canceled!
第三步:在LVS上开启tunnel网卡并配置VIP
ifconfig tunl0 10.0.0.100 netmask 255.255.255.255 up
ip a 查看多了一块tunl0的特殊网卡
第四步:在LVS上配置集群规则
[root@lvs ~]#ipvsadm -A -t 10.0.0.100:80 -s rr
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:80 -i
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.18:80 -i
第五步:RS1、RS2服务器配置
开启tunnel网卡并配置VIP
ifconfig tunl0 10.0.0.100 netmask 255.255.255.255 up
第六步:在RS1、RS2修改内核参数(因为现在在同一网段中,配一个网段IP就冲突了,工作中跨网段是不需要修改的)
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
第七步:LVS包往RS服务器发送时,RS服务器会对来的包进行反向校验,有可能会识别到不对,所以不让RS服务器做反向校验
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
第八步:去internet进行访问验证结果
[root@internet ~]#curl http://10.0.0.100
RS1
[root@internet ~]#curl http://10.0.0.100
RS2
成功!!!
LVS 持久连接
session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现
持久连接( lvs persistence )模板:实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS
在工作中用这种轮询的方式,效果很好,能够分担负载,但是无法会话保持,会话保持,其实加个选项就可以解决
在集群中修改:ipvsadm -E -t 10.0.0.100:80 -p -s rr 不加默认保持360s
防火墙标记
如果lvs集群中有80端口,443端口,同时进行访问,会各自调度各自的后端服务
如:curl http://10.0.0.100;curl -k https://10.0.0.100
RS1
RS1
达不到错峰访问错峰访问,RS1收到两个请求,RS2一个请求都没有收到,做不到均衡负载。
解决办法:
第一步:打标签
在LVS上将两个端口贴一个标签,同时访问时,会识别到是同一个服务,就会分别调度,mangle贴66标签
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
查询是否打上标签
iptables -t mangle -vnL
第二步:创建集群及规则
查看原来的规则
ipvsadm -Ln
清除原来的规则
ipvsadm -C
创建集群,添加规则
ipvsadm -A -f 66 -s rr #-f 根据防火墙标签建集群
ipvsadm -a -f 66 -r 10.0.0.8 -i
ipvsadm -a -f 66 -r 10.0.0.18 -i
在客户端查询
curl http://10.0.0.100;curl -k https://10.0.0.100
RS2
RS1