zoukankan      html  css  js  c++  java
  • LVS-DR

    ARP协议(address resolve protocol)
    如:本机要 ping 172.16.2.8
    过程为:
    本机广播在局域网内 "谁是172.16.2.8,请把你的MAC告诉我",只有172.16.2.8这个回应,并把它的MAC返回给本机。本机就得到了172.16.2.8的MAC,并把它存放到本地的MAC地址表中缓存(通过ip neigh或arp -a等命令查看得到),缓存时间在linux下默认为15分钟.在这15分钟内,如果本机再找172.16.2.8,就直接在缓存里去找。15分钟过了,缓存被清除了,再去找172.16.2.8,那么就重复上面的过程.
        DNS ARP
    域名或主机名 ---> IP ----> MAC
    张三的家 xx区xx站xx小区xx楼xxx室
    路由器
    用户1 用户2
    P2P终结者
        路由器ip--用户1的mac
    -----------------------------------------------------------------------------------------
    LVS-DR 直接路由 (direct routing)
    客户端 172.16.2.9 (宿主机5模拟)
    |
    |
    | 172.16.2.8 eth0
    [router] 192.168.122.8 <<-----------------------------
    | eth1 |
    | |
    | |
    [director] 192.168.100.10 eth0 |
    | |
    | |
    |-------------------------------------| |
    |
    web1 web2 |
    192.168.122.11 eth0 192.168.122.12 eth0 网关指向router的同网段IP 192.168.122.8
    虚拟192.168.122.10 lo:0 虚拟192.168.122.10 lo:0
    1,客户端请求
    sip:172.16.2.9 dip:172.16.2.8
    smac:客户端MAC dmac:172.16.2.8的MAC
    在router上DNAT
    sip:172.16.2.9 dip:192.168.122.10
    smac:客户端MAC dmac:192.168.122.10的mac
    2,在director上调度(假设调给web1)
    数据包里的sip和dip不变,只把dmac变为web1的,然后调给web1
    sip:172.16.2.9 dip:192.168.122.10
    smac:客户端MAC dmac:192.168.122.11的mac
    3,数据包到web1后(因为是通过mac地址到的),这里又会有一个问题,web1收到这个包,但它并没有192.168.122.10这个IP,所以不会解析这个包
    如果在web1上虚拟192.168.122.10这个IP,那么它会与director的冲突
    所以解决方法为:在web1和web2上用lo:0来虚拟192.168.122.10这个IP,那么又可以响应解析调度过来的包,又可以互相不冲突 (因为lo:0为本地回环网卡,是不与其它人通信的)
    4,请求到数据后,需要返回给客户端
    sip:192.168.122.10 dip:172.16.2.9
    smac:192.168.122.11的mac dmac:客户端MAC
    5,返回给172.16.2.9这个IP,但web1和web2并没有这个网段路由,所以把网关指向公司路由器的IP192.168.122.8(不能指director的192.168.122.10,因为DR-LVS回去时不通过director)
    第一大步:配置router
    1,打开ip_forward
    2,先清空原来的iptables所有规则,再在router上加上两条防火墙规则(我这里使用iptables做的,你也可以换成firewall来做)
    # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.122.10
    --这条是表示从eth0网卡(也就是172.16.2.8的网卡)进来访问80的包,DNAT到192.168.122.10(也就是lvs调度器的IP)
    # iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to-source 192.168.122.8
    --关于这一条(为了172.16.2.9访问172.16.2.8,变成192.168.122.8访问192.168.122.10),这样可以实现LVS调度器能回客户端。如果你不用这条SNAT的话,也可以在LVS调度器上route add default gw 192.168.122.8指一个网关回去也可以,因为DNAT的目标机器需要一个网关才能回给client)
    # iptables-save > /etc/sysconfig/iptables
    # systemctl start iptables.service
    # systemctl enable iptables.service
    第二大步:
    配置LVS调度器
    1, yum install ipvsadm
    --如果是用lvs-nat做过的机器来做,先使用ipvsadm -C清空规则
    2,配置调度规则
    # ipvsadm -A -t 192.168.122.10:80 -s rr
    # ipvsadm -a -t 192.168.122.10:80 -r 192.168.122.11:80 -g
    # ipvsadm -a -t 192.168.122.10:80 -r 192.168.122.12:80 -g
    --这里的-g就是表示使用路由架构;LVS调度器就会把数据包调给192.168.122.11或192.168.122.12时,就只修改MAC地址,不修改目标IP直接路由过去
    # ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    TCP 192.168.122.10:80 rr
    -> 192.168.122.11:80 Route 1 0 0
    -> 192.168.122.12:80 Route 1 0 0
    # ipvsadm -Sn > /etc/sysconfig/ipvsadm
    # systemctl start ipvsadm
    # systemctl enable ipvsadm
    第三大步:
    配置后台的两个web(无论调度几个web,每个web服务器都要做下面的步骤)
    2,ifconfig lo:0 192.168.122.10 netmask 255.255.255.255 --注意掩码为4个255,想要永久生效,写一个ifcfg-lo:0的网卡配置文件就好了
    --这一步是非常重要的,因为路由方式扔过来的包,目标IP不变,也就是说还是192.168.122.10,只是通过找192.168.122.11或者192.168.122.12的MAC地址扔过来的;
    --所以web服务器上需要也需要有一个192.168.122.10这个IP来解析请求;用lo网卡来虚拟就是为了尽量不要与lvs的网卡造成ARP广播问题
    问题:为什么netmask为4个255,而不是255.255.255.0;
    答案:如果为255.255.255.0,那么192.168.122.0/24整个网段都无法和web服务器通迅。而我们这里只要求lvs调度器和web不能通迅就可以了(后面使用arp -s绑定解决)
    3,真实服务器(两个web端)把默认路由指向router同物理网段的IP
    route add default gw 192.168.122.8 --想要永久生效,写到网卡配置文件 
    --网关指向router的网卡,就是为了回去时跳过lvs调度器(提高调度器性能),直接回到router,再回给客户端(如果前面router上做了SNAT,那么这个网关可以不用加,原因可以直接分析数据包变化过程得到)
    4,# vim /etc/sysctl.conf ----加上下面四句(在两个web端操作)
    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
    # sysctl -p使它生效
    arp_ignore = 1 --表示系统只回答目的IP是本地的IP的包,也就是对广播包不做响应
    arp_announce = 2 --表示系统忽略IP包的源地址,而根据目标主机选择地址
    5, yum install arptables_jf ----安装arp防火墙对目录地址为192.168.122.10的包都drop掉(在两个web端操作)
    arptables -A INPUT -d 192.168.122.10 -j DROP --添加这条规则
    arptables-save -n > /etc/sysconfig/arptables
    systemctl start arptables
    systemctl enable arptables
    --上面的第4和5小步都是用来解决DR架构中的arp问题;只需要用其中一个就可以了;当然两步都做也是可以的;(或者在router上使用arp -s 192.168.122.10 52:54:00:16:13:8d把调度ip和lvs调度器的的网卡mac永久绑定,这样也可以解决这个arp问题)
    第四大步:
    一个重要的补充步骤
    1,回到lvs调度器上用ip neigh命令或者arp -a命令来查看是否有192.168.122.11或者192.168.122.12的物理地址;
    就算是有,也只是你刚才可能和它们通迅过,这些MAC地址还保存着(一般15分钟后就会消失),你需要再和192.168.122.11和192.168.122.12通迅;
    但你会发现你都ping不通192.168.122.11和192.168.122.12了;
    原因是因为你在web服务器上配置了lo:0 192.168.122.10这个网卡
    所以LVS调度器192.168.122.10去ping 192.168.122.11可以过去,但回不来,因为回来时他会直接找自己的lo:0的192.168.122.10
    解决这个问题:
    在LVS调度器上永久绑定web1和web2的MAC地址(可以加入/etc/rc.local里永久生效)
    arp -s 192.168.122.11 00:0C:29:C3:3C:54
    arp -s 192.168.122.12 00:0C:29:B8:10:8A
    第五大步:
    测试
    在客户端172.16.2.9上elinks 172.16.2.8测试
    =====================================================
    关于lvs的防火墙标记的讨论
    做好DR架构后,然后在LVS调度器上做下面的操作
    --注意:我这里是把80和3306端口设置同一个mark ,只是为测试(实际情况应该为80和443)
    1,在lvs调度器上配置如下
    # iptables -t mangle -A PREROUTING -p tcp -d 192.168.122.10 --dport 80 -j MARK --set-mark 10
    # iptables -t mangle -A PREROUTING -p tcp -d 192.168.122.10 --dport 3306 -j MARK --set-mark 10
    # iptables -t mangle -L PREROUTING -n
    Chain PREROUTING (policy ACCEPT)
    target prot opt source destination
    MARK tcp -- 0.0.0.0/0 192.168.122.10 tcp dpt:80 MARK set 0xa
    MARK tcp -- 0.0.0.0/0 192.168.122.10 tcp dpt:3306 MARK set 0xa
    # ipvsadm -A -f 10 -s rr
    # ipvsadm -a -f 10 -r 192.168.122.11 -g
    # ipvsadm -a -f 10 -r 192.168.122.12 -g
    # ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    FWM 10 rr
    -> 192.168.122.11:0 Route 1 0 0
    -> 192.168.122.12:0 Route 1 0 0
    2,在上面的基础上做的,所有在router上对3306也要加SNAT和DNAT
    # iptables -t nat -A PREROUTING -p tcp --dport 3306 -i eth0 -j DNAT --to 192.168.122.10
    # iptables -t nat -A POSTROUTING -p tcp --dport 3306 -o eth1 -j SNAT --to 192.168.122.8
    3,在web1和web2上分别安装两个mysql用于测试(建立两个不同的库方便测试)
    这两个mysql要授权,授权如下
    mysql> grant all on *.* to 'abc'@'192.168.122.8' identified by '123';
    Query OK, 0 rows affected (0.00 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    再回到客户端测试
    测试结果:80和3306都可以被调度
  • 相关阅读:
    MySQL事务隔离级别和MVCC
    windows环境下查看端口是否被占用
    jar找不到问题解决
    Java注解
    Fastjson
    mybatis
    Idea快捷键
    Date与String的相互转换
    Windows快捷键
    [转]linux awk命令详解
  • 原文地址:https://www.cnblogs.com/skyzy/p/9201472.html
Copyright © 2011-2022 走看看