centos6 LVS-DR模式---分析

LVS是什么就不多说了。

先上拓扑图

centos6 LVS-DR模式---分析

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为路由器网关)

下图为对应其过程

centos6 LVS-DR模式---分析

为验证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

centos6 LVS-DR模式---分析

centos6 LVS-DR模式---分析

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

上一篇:Kafka遇到问题 - 启动时报错: 找不到或无法加载主类 kafka.Kafka


下一篇:WCF帮助类