LVS是什么就不多说了。
先上拓扑图
1台LVS 3台Realserver 一个客户端。 环境全部模拟全在内网环境(selinux和iptables关闭)
先简略说一下安装步骤:
LVS上:
1、先将本地eth0分出一个子网卡 eth0:1 并配置上VIP(我的VIP为 192.168.0.36)
ifconfig eth0:0 192.168.0.36 broadcast 192.168.0.36 netmask 255.255.255.255 up
2、再将外部所有请求VIP的流量都导向这块网卡,所以需要添加路由
route add -host 192.168.0.36 dev eth0:0
但是这样只是临时添加,如果重启network 服务,或者重启系统。条目会消失,至于怎样永久,有好多种办法,比如rc.local(查看路由表 route)HU代表路由到一个主机上,UG即代表路由到路由器。
3、在配置路由转发,修改 /etc/sysctl.conf 文件
将net.ipv4.ip_forward = 0 的值改成 1 然后使用sysctl -p 命令来刷新保存的文件。
这个改动可以理解成将eth0 和eth0:1 中间做一个路由条目,如果为0的话,2块网卡可以理解成是不想通的即可。
4、在来配置安装ipvsadm (yum安装or 源码)
源码安装没有什么特殊的。只不过要先安装依赖包libnl*
这里我们使用yum安装,也是官网最新的1.2.6ipvsadm。
yum -y install ipvsadm
配置ipvsadm
ipvsadm -C #清楚表内的规则
ipvsadm -At 192.168.0.36:80 -s wrr
ipvsadm -at 192.168.0.36:80 -r 192.168.0.38:80 -g -w 1
ipvsadm -at 192.168.0.36:80 -r 192.168.0.162:80 -g -w 1
ipvsadm -at 192.168.0.36:80 -r 192.168.0.41:80 -g -w 1
/etc/init.d/ipvsadm start #启动lvs (如果发现找不到/etc/sysconfig/ipvsadm报错就使用service ipvsadm save 保存条目) # -A相当于定义一个模块,模块的规则为VIP的80端 口如果想在VIP上定义其他端口则会报错。 -s:轮询规则,详细请看文章末尾链接。 # -a添加规则 -r为后端真是Rserver服务器这里只能指定80端口,我试过添加其他端口,均会被自动修改成80 添加之后可以在 vi /etc/sysconfig/ipvsadm 查看条目,也可以使用ipvsadm -Ln 来查看
在配置Realserver端:(如配置不理解请看LVS配置)
ifconfig lo:0 192.168.0.36 broadcast 192.168.0.36 netmask 255.255.255.255 up
route add -host 192.168.0.36 dev lo:0
在/etc/sysctl.conf 末尾加上 (ARP抑制)
#LVS arp
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
Realserver 配置完毕。其余2台也都一样
#=================分=========析=========区==================
一、当客户端发送一个请求到VIP时ip数据包(ipdata)携带的什么呢。
RSC-IP DST-IP 和请求内容以及各种校验,这里我关注我们关注的。
细分一下过程:
1、请求到达交换机 (请求的IP为VIP) 这个时候假设交换机上没有ARP缓存。
2、交换机会说:我本地没有VIP对应的MAC,我去帮你找吧。
3、交换机瞬间像所有网口发送ARP广播包。此ARP的广播包里DST-IP为VIP
4、而此时Realserver和交换机相连的端口为eth0。但是route会把这个请求送达给lo:0上,由于arp_ignore=1的缘由,只回答目标IP地址是来访网络接口本地地址的ARP查询请求.所以lo:0会忽略掉这个ARP请求,但是LVS没有设置。所以LVS会告诉交换机,我是VIP。
5、交换机记录VIP以及对应的MAC,将ipdata交给了LVS。
6、LVS将ipdata拆包看到请求的是VIP:80端口,遂查询LVS规则+轮询算法,将确定处理该request的Realserver的IP(即RIP假设为192.168.0.41)
7、LVSDR模式独有的MAC寻址,这个时候LVS本地没有Rserver的MAC,遂发ARP广播包说:RIP为Realserver的MAC是多少。
8、ARP包经过eth0口流入每个Rserver,Rserver 这个时候会通过系统内核,内核说:这个ARP请求的是本地网卡的IP,我们要给出回应。就会给出ARP的应答包发给LVS的DIP。
9、LVS将Rserver应答给自己的MAC存入自己的arp -n 缓存表中,并将ipdata包的外层继续封装一层MAC寻址而此时的SRC-IP 仍未CIP ,DST-IP 为VIP 但是SRC-MAC为DIP即LVS的MAC。DST-MAC为RIP的MAC
10、数据包到达Realserver时,Rserver验证这个数据包是不是自己能处理的需要符合2个要求 1、MAC是自己的 2、IP是自己的 此时lo:0绑定的VIP就起到作用,将ipdata数据包送上CPU。
11、Realserver处理完成之后,SRC-IP 为VIP,DST-IP 为CIP SRC-MAC为RMAC DST-MAC为CMAC (现实环境中为网关的,即CIP为路由器网关)
下图为对应其过程
为验证7过程,使用tshark抓取 192.168.0.41网口流量验证ARP包内为RIP而非VIP
清空LVS本地缓存,查看arp缓存用arp -n 清楚ARP缓存使用
arp -n|awk '/^[1-9]/{print "arp -d " $1}'|sh -x
另外LVS规则算是内核方法,用netstat -ntulp也显示不了其侦听的端口。启动日志在/var/log/message中
另外感谢吴大大(大牛勒)
如果有误,请联系博主,博主会立即更改。请发邮件至 907765003@qq.com
LVS十种均衡算法 : http://www.linuxidc.com/Linux/2013-05/84249.htm
ARP抑制原理:http://www.ddvip.com/tech/100075689.html
wireshake抓包:http://www.centoscn.com/IT/2013/0331/180.html