#产业气象站#LVS 秘密,那些你不知道的( 二 )


2.LVS的DR模式的请求流程图申明:首先我们先来申明一下,举个例子:我们在请求一个域名如:https://www.naixuejiaoyu.com/,我们首先会访问的是DNS,DNS会根据我们的域名给我们解析VIP地址(一般情况是一个vip,也有一种情况是一个域名对应对个vip或者ip),我们为了简单,下图就是画的一般情况 。 注意:前提是我们的VIP地址都是配置在LO上的 。
#产业气象站#LVS 秘密,那些你不知道的
文章图片
3.提问一:三个vip,为什么dns会把请求打到LVS上,而没有打到RS上呢?
带着这个问题我们来思考,可能才更好的帮助我们来理解LVS的DR模式,要解决这个问题,我们就需要提到我们刚开始提到的ARP请求了,我们需要在LVS,RS1,RS2上都需要绑定三个VIP,但是需要在RS1和RS2上需要额外的做一些工作,那就是禁止ARP请求 。
【#产业气象站#LVS 秘密,那些你不知道的】我们在RS上需要执行以下的操作,更改linux的内核参数,如下:
echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announceecho"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announce
为了帮助大家更好的理解三个vip之间的关系,我们举个例子来说:LVS服务器是正常的,当DNS在请求的时候会解析出来VIP的地址,但是并不知道,具体的mac地址是哪一个,那LVS服务器会通过ARP请求,告知别人自己的mac地址,别人就缓存下来了,反之,我们的RS是禁止ARP请求的,其实他就是一个哑巴,让他不能说话的,别人就不知道他的mac地址,即使他有VIP地址,所以DNS只会把请求转发到LVS上,而不能转发到RS上 。
4.既然RS禁止了ARP请求,那LVS如何把请求转发给RS呢?解决了上面的问题,那新的问题又来了,既然我们说RS禁止了ARP请求,那LVS是如何把请求转发给RS的呢?其实我告诉你,是通过修改mac地址,进行转发的,这个是DR模式的核心,那LVS又是如何知道RS的mac地址呢,其实是通过ARP请求获知的,那有些人就会问我,你这个不是自相矛盾吗?别担心,接着看 。
首先我们看一下,我们的vip都是绑定在lo上的,我们要理解上面我提出的这个问题,就要深入的了解一下linux内核参数的配置信息了 。
有关arp_ignore的相关介绍:
arp_ignore-INTEGERDefinedifferentmodesforsendingrepliesinresponsetoreceivedARPrequeststhatresolvelocaltargetIPaddresses:
0-(default):replyforanylocaltargetIPaddress,configuredonanyinterface
1-replyonlyifthetargetIPaddressislocaladdressconfiguredontheincominginterface
2-replyonlyifthetargetIPaddressislocaladdressconfiguredontheincominginterfaceandbothwiththesender"sIPaddressarepartfromsamesubnetonthisinterface
3-donotreplyforlocaladdressesconfiguredwithscopehost,onlyresolutionsforglobalandlinkaddressesarereplied
4-7-reserved
8-donotreplyforalllocaladdresses
Themaxvaluefromconf/{all,interface}/arp_ignoreisusedwhenARPrequestisreceivedonthe{interface}
看不懂没关系,既然要解决,我们肯定是要深入剖析的,下面我们来简单的翻译一下:
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式
0-(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求
1-只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2-只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3-不回应该网络界面的arp请求 , 而只对设置的唯一和连接地址做出回应
4-7-保留未使用
8-不回应所有(本地地址)的arp查询
好了我们设置的arp_ignore内核参数是1,就是只回答目标IP地址是来访网络接口本地地址的ARP查询请求 , 即:只回答本地网卡eth0上的ARP请求 。