实战案例:LVS-DR模式单网段和多网段

399 阅读3分钟

1.LVS-DR模式单网段

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

  • 在前端网关做静态绑定
  • 在各RS使用arptables
  • 在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

  • 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
  • 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别:arp_announce

  • 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
  • 1:尽量避免将接口信息向非直接连接网络进行通告
  • 2:必须避免将接口信息向非本网络进行通告

配置要点

  1. Director 服务器采用双IP桥接网络,一个是VIP,一个DIP
  2. Web服务器采用和DIP相同的网段和Director连接
  3. 每个Web服务器配置VIP
  4. 每个web服务器可以出外网

image.png

环境准备:五台主机

一台:客户端 eth0:仅主机 192.168.10.6/24 GW:192.168.10.200 

一台:ROUTER 
eth0 :NAT  10.0.0.200/24 
eth1: 仅主机 192.168.10.200/24 

启用 IP_FORWARD 

一台:LVS 
eth0:NAT:DIP:10.0.0.8/24 
GW:10.0.0.200 

两台RSRS1eth0:NAT:10.0.0.7/24   
GW10.0.0.200 
RS2eth0:NAT:10.0.0.17/24 
GW10.0.0.200

先提前进行yum安装,防止修改ip地址后无法无法下载

[root@rs1 ~]#yum -y install httpd 
[root@rs1 ~]#systemctl enable --now httpd

[root@rs2 ~]#yum -y install httpd 
[root@rs2 ~]#systemctl enable --now httpd

[root@lvs ~]#yum -y install ipvsadm

Router 开启IP_FORWARD,并配置网卡

image.png

image.png

其他各个机器也需要配置网卡修改对应的ip和gw,过程省略

[root@rs1 ~]#hostname -I > /var/www/html/index.html
[root@rs2 ~]#hostname -I > /var/www/html/index.html

配置完测试一下是否配置正确

image.png

然后进行后端RS的IPVS配置

#RS1IPVS配置 
[root@rs1 ~]#echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@rs1 ~]#echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
[root@rs1 ~]#echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@rs1 ~]#echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@rs1 ~]#ifconfig lo:1 10.0.0.100/32

#RS2IPVS配置
[root@rs2 ~]#echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@rs2 ~]#echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
[root@rs2 ~]#echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@rs2 ~]#echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@rs2 ~]#ifconfig lo:1 10.0.0.100/32

上面配置为临时配置,重启后会丢失,如果需要永久保存需要在文件里配置,然后刷新到内存
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.lo.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.lo.arp_announce=2
sysctl -p

LVS主机的配置

#在LVS上添加VIP 
[root@lvs ~]#ifconfig lo:1 10.0.0.100/32

#实现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.22:80 -g 
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.23:80 -g 
[root@lvs ~]#ipvsadm -Ln

image.png

测试访问

[root@client ~]#curl 10.0.0.100

image.png

2.LVS-DR模式多网段

单网段的DR模式容易暴露后端RS服务器地址信息,可以使用跨网面的DR模型,实现更高的安全性

image.png

#client主机的网络配置和之前一样 

#router的网络配置在之前的基础上添加172.16.0.200/24的地址 
[root@router ~]#ip addr add 172.16.0.200/24 dev eth0

#LVS主机的网络配置和之前一样

#RS主机的网络配置和之前一样

在LVS主机运行的脚本


#注意:VIP如果配置在LO网卡上,必须使用32bit子网掩码,如果VIP绑定在eth0上,可以是其它netmask
[root@lvs ~]#cat lvs_dr_vs.sh
!/bin/bash
vip='172.16.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='10.0.0.22'
rs2='10.0.0.23'
scheduler='wrr'
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

[root@lvs ~]#bash lvs_dr_vs.sh start

在RS后端服务器运行的脚本

[root@rs1 ~]#cat lvs_dr_rs.sh
#!/bin/bash
vip=172.16.0.100
mask='255.255.255.255'
dev=lo:1

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
    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

[root@rs1 ~]#bash lvs_dr_rs.sh start

在RS后端服务器运行的脚本和RS1是一样的

[root@rs2 ~]#bash lvs_dr_rs.sh start

测试访问

[root@client ~]#curl 172.16.0.100