系统:centos7.1
实现目标1:lvs-dr
lvs-dr的工作流程也是遵循这样的流程:用户发出连接请求给director,然后由director转发给rs处理
lvs-dr模式的特点是:
1.CIP和VIP地址均不变,通过转换MAC地址来实现通信的
2.连接请求只能通过Director进来,必须由RS回应
3.Director和RS均连接在同一物理网络中
面临的问题:
1.若vs和rs均设置为vip地址,ip地址会冲突,
解决办法:RS使用本地的lo设置一个vip别名,通过设置内核参数arp_ignore和arp_annouce来实现当外部询问vip地址时,只物理网络中的接口予以通告,没在物理网络中的VIP则不予以通告,而响应数据时则选择最佳的target地址予以响应,即vip所在的lo:0予以响应。(apr规则的设定除了通过调整内核参数,还可以像iptables工具一样通过arp相关工具来设定)
实现:
三台主机:
vip:172.16.52.57
HOST1:
eno16777736 172.16.52.58
eno16777736:0 172.16.52.57
HOST2:
eno16777736 172.16.52.60
lo:0 172.16.52.57
HOST3:
eno16777736 172.16.52.61
lo:0 172.16.52.57
开始设置:
host1:
1.编写一个脚本
]# vim ipvsadm.sh
vip='172.16.52.67'
ifac='eno16777736'
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig ${ifac}:0 $vip netmask 255.255.255.255 broadcast $vip
yum install ipvsadm
ipvsadm -A -t 172.16.52.57:80 -s rr
ipvsadm -a -t 172.16.52.57:80 -r 172.16.52.61 -g
ipvsadm -a -t 172.16.52.57:80 -r 172.16.52.60 -g
echo "hello"
2.然后复制一份命令为ipvs.sh,加以修改,复制到host2和host3上
]#cp ipvsadm.sh ipvs.sh
[root@localhost ~]#vim ipvs.sh
#!/bin/bashvip='172.16.52.57'
ifcfgalias='lo:0'
ifac=eno16777736
case $1 in
start)
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/$ifac/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/$ifac/arp_announce
##在lo配置VIP地址,只广播信息给自身
ifconfig lo:0 $vip netmask 255.255.255.255 broadcast $vip
#添加lo:0 VIP地址路由,响应报文要经过lo:0网卡发送到物理网卡以原地址为$vip发送出去
route add -host $vip dev $ifcfgaliasyum install httpd
systemctl start httpd
;;
stop)
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/$ifac/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/$ifac/arp_announce
ifconfig lo:0 down
route del 172.16.52.57
yum remove httpd
;;
*)
echo "please input correct parameters."
esac
]# scp -r ipvs.sh root@172.16.52.{60,61}:/root
host2:执行脚本
sh ipvs.sh
vim /var/www/html/test1.html
<h1>this is rs1.com page </h1>
host3:执行脚本
sh ipvs.sh stop
sh ipvs.sh start
vim /var/www/html/test1.html
<h1>this is rs1.com page </h1>
测试:
选一台同一网段里的主机进行测试
watch -n 1 "curl http://172.16.52.57/test1.html"
会看到返回结果来回切换
实现目标2:firewallmark(fwm)
fwm是为指定的某一群体打标签,这一群体可以是某几个ip地址或者是几个端口,实现的作用是,可以将需要访问的几个目标地址或者端口定向到同一个标签,比如给80,8080,443端口打上同一个标签,那么就可以让用户访问这三个端口中的任意一个端口定向到同一个主机。
在上面的基础上开始实现fwm:
1.host1上面清理掉之前的规则:
ipvsadm -C
2.使用mangle在PREROUTING上面打上标签
iptables -A PREROUTNG -t mangle -d 172.16.52.57 -p tcp --dport 80 -j MARK --set-mark 9
ipvsadm -A -f 3 -s rr
ipvsadm -a -f 3 -r 172.16.52.60 -g
ipvsadm -a -f 3 -r 172.16.52.61 -g
实现目标3:持久连接
eg1:
[root@localhost scripts]# ipvsadm -A -t 172.16.52.57:80 -s rr -p
[root@localhost scripts]# ipvsadm -a -t 172.16.52.57:80 -r 172.16.52.60 -g
[root@localhost scripts]# ipvsadm -a -t 172.16.52.57:80 -r 172.16.52.61 -g
说明:基于端口的持久连接,-p是指定持久时长,默认是360s,但是man手册里面说的300s,常用方式是: -p timeout
eg2:
[root@localhost scripts]# ipvsadm -A -t 172.16.52.57:0 -s rr -p
[root@localhost scripts]# ipvsadm -a -t 172.16.52.57:0 -r 172.16.52.60 -g
[root@localhost scripts]# ipvsadm -a -t 172.16.52.57:0 -r 172.16.52.61 -g
说明:基于客户端的持久连接,使用端口号0,后面必须要跟-p ,不加可以试试看,会报错的。。。
eg3:
[root@localhost scripts]# iptables -A PREROUTING -t mangle -d 172.16.52.57 -p tcp --dport 80 -j MARK --set-mark 20
[root@localhost scripts]# iptables -A PREROUTING -t mangle -d 172.16.52.57 -p tcp --dport 443 -j MARK --set-mark 20
[root@localhost scripts]# ipvsadm -A -f 20 -s rr -p
[root@localhost scripts]# ipvsadm -a -f 20 -r 172.16.52.60 -g -p
[root@localhost scripts]# ipvsadm -a -f 20 -r 172.16.52.61 -g -p
说明:通过防火墙标记的方式来进行的持久连接,可以 cat /proc/net/ip_vs_conn查看连接状态
总结:持久连接分为上面三种方式,但跟调度算法无关,调度算法无法保持持久连接