经常看到关于lvs的配置,其中有对于arp的问题的部分,vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
lvs官方文档中,章文嵩博士指出了上述配置是错误的。我这里解释一下为什么错误的配置却没有给大家带来问题?
所有接口的arp_ignore和arp_announce默认是0,假如服务器有两个网卡,我们配置了ip地址如下:
eth0  192.168.2.2/24 gw 192.168.2.1
eth1 192.168.2.3/24
lo:0 192.168.2.4/32
如果我们通过路由之后,访问这三个地址,试问哪个接口接受和回应请求?
事实上,只有eth0通过所有的请求和回应,路由器只认得在eth0上有三个地址,
为什么呢?因为三个地址都会在eth0,eth1接口上公告出去,也就是在实际的网卡上公告系统中所有ip地址,包括lo上配置的地址。
我们来看看arp_ignore和arp_announce的作用机制:all和{interface}下的值比大小,谁大取谁有效。
当arp_ignore=1时,只回答目标IP地址是来访网络接口本地地址的ARP查询请求
arp_announce=2时, 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送。
(这两个变量的其它取值的意义,请自己查找)
不难看出,eth0,eth1的这两个变量默认是0,上面那4个内核变量all.arp_ignore和all.arp_announcelo与eth0,eth1的比较取大值,生效的只有all的两个变量。
如果要预防eth0,eth1被设成别的值,所以要专门进行设置,如果有4个网卡去做集群调度,那就要对4个网卡设置。设置原则是对实际网卡和all做设置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2  
net.ipv4.conf.eth1.arp_ignore = 1
net.ipv4.conf.eth1.arp_announce = 2  
net.ipv4.conf.eth2.arp_ignore = 1
net.ipv4.conf.eth2.arp_announce = 2  
net.ipv4.conf.eth3.arp_ignore = 1
net.ipv4.conf.eth3.arp_announce = 2  
要根据情况,有几个实际网卡就设几个。