• centos6 LVS-DR模式---分析


    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

  • 相关阅读:
    [Leetcode Weekly Contest]285
    [Leetcode Weekly Contest]286
    [Leetcode Weekly Contest]284
    [Leetcode Weekly Contest]287
    阿凡达机器人简介
    PS常用组合键
    PhotoshopCS6 后退多步
    如何卸载Creative Cloud?
    五月实际
    SSO 方案演进
  • 原文地址:https://www.cnblogs.com/shiyiwen/p/5069901.html
Copyright © 2020-2023  润新知