LVS 负载均衡器理论基础及抓包分析 (4)

客户端连通性测试

[root@master01 ~]# ping -c 1 1.65.15.145 PING 1.65.15.145 (1.65.15.145) 56(84) bytes of data. 64 bytes from 1.65.15.145: icmp_seq=1 ttl=64 time=0.078 ms --- 1.65.15.145 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.078/0.078/0.078/0.000 ms [root@master01 ~]#

负载测试

[root@master01 ~]# curl -m 15 --retry 1 -sSL 1.65.15.145:80 curl: (7) Failed connect to 1.65.15.145:80; 没有到主机的路由 [root@master01 ~]#

发现负载服务不通,进行抓包分析
dr模式LB抓包

在这里插入图片描述


dr模式RS抓包

在这里插入图片描述


根据 DR 模式路由转发原理,LB上面源MAC地址修改为LB的MAC地址,而目标MAC地址修改为RS MAC地址,上图中已经发现MAC正常修改了,但为什么不通呢?在RS数据包中发现源IP和目标IP也都未修改,那么问题来了,我们Client期望访问的是RS(通过 mac 二次互访),但RS收到的目标IP却是LB上面的VIP,发现这个目标IP并不是自己的IP,因此不会通过 INPUT 链转发到用户空间,这时要不直接丢弃这个包,要不根据路由再次转发到其他地方,总之两种情况都不是我们期望的结果。那怎么办呢?如果想让RS接收这个包,必须得让RS有这个目标IP才行,不妨在lo上添加个虚拟IP,IP地址伪装成LB IP 1.65.15.145。所以需要在RS上面添加虚拟IP,并且添加一条路由如下。

[root@master03 ~]# ifconfig lo:0 1.65.15.145/32 up [root@master03 ~]# route add -host 1.65.15.145 dev lo [root@master03 ~]#

此时问题又来了,这就相当于在一个局域网内有两个相同的IP,IP重复了怎么办?办法就是隐藏这个虚拟网卡,不让它回复ARP,其他主机的neigh也就不可能知道有这么个网卡的存在了。

[root@node01 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@node01 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@node01 ~]#

arp_ignore=1,只响应目的IP地址为接收网卡上的本地地址的arp请求。
因为我们在RS上都配置了VIP,因此此时是存在IP冲突的,当外部客户端向VIP发起请求时,会先发送arp请求,此时调度器和RS都会响应这个请求。如果某个RS响应了这个请求,则之后该客户端的请求就都发往该RS,并没有经过LVS,因此也就没有真正的负载均衡,LVS也就没有存在的意义。因此我们需要设置RS不响应对VIP的arp请求,这样外部客户端的所有对VIP的arp请求才会都解析到调度器上,然后经由LVS的调度器发往各个RS。
系统默认arp_ignore=0,表示响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。也就是说,如果机器上有两个网卡设备A和B,即使在A网卡上收到对B IP的arp请求,也会回应。而arp_ignore设置成1,则不会对B IP的arp请求进行回应。由于lo肯定不会对外通信,所以如果只有一个对外网口,其实只要设置这个对外网口即可,不过为了保险,很多时候都对all也进行设置。
arp_announce=2,网卡在发送arp请求时使用出口网卡IP作为源IP。
当RS处理完请求,想要将响应发回给客户端,此时想要获取目的IP对应的目的MAC地址,那么就要发送arp请求。arp请求的目的IP就是想要获取MAC地址的IP,那arp请求的源IP呢?自然而然想到的是响应报文的源IP地址,但也不是一定是这样,arp请求的源IP是可以选择的,而arp_announce的作用正是控制这个地址如何选择。系统默认arp_announce=0,也就是源ip可以随意选择。这就会导致一个问题,如果发送arp请求时使用的是其他网口的IP,达到网络后,其他机器接收到这个请求就会更新这个IP的mac地址,而实际上并不该更新,因此为了避免arp表的混乱,我们需要将arp请求的源ip限制为出口网卡ip,因此需要设置arp_announce=2。(解释来源于网络)
测试连通性

[root@master01 ~]# curl 1.65.15.145:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 。。。。 <p><em>Thank you for using nginx.</em></p> </body> </html> [root@master01 ~]#

RS抓包如下

在这里插入图片描述


LB抓包如下

在这里插入图片描述


通过数据包分析可以发现MAC地址的转换,及源目标IP的转换关系,到此这个DR实验完成。

DR 模式特性总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyysxd.html