LVS的NAT模式实战案例(支持端口映射)

2、负载均衡服务LVS的NAT、DR、TUNNEL搭建流程及LVS 持久连接、防火墙标记_防火墙标记


环境如下:
一台: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模式实战案例(不支持端口映射)

2、负载均衡服务LVS的NAT、DR、TUNNEL搭建流程及LVS 持久连接、防火墙标记_防火墙标记_02


序号


目的

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不在同一个网段

2、负载均衡服务LVS的NAT、DR、TUNNEL搭建流程及LVS 持久连接、防火墙标记_防火墙标记_03


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隧道模式案例(跨网段访问,不支持端口映射)

2、负载均衡服务LVS的NAT、DR、TUNNEL搭建流程及LVS 持久连接、防火墙标记_LVS 持久连接_04

2、负载均衡服务LVS的NAT、DR、TUNNEL搭建流程及LVS 持久连接、防火墙标记_LVS 持久连接_05

[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