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都可以被调度
posted @ 2018-06-19 22:19  Sky-wings  阅读(150)  评论(0编辑  收藏  举报