DR

arp_ignore

定义对目标地址为本地 IP 的 ARP 询问不同的应答模式

arp_ignore - INTEGER
	Define different modes for sending replies in response to
	received ARP requests that resolve local target IP addresses:
	0 - (default): reply for any local target IP address, configured
	on any interface
	1 - reply only if the target IP address is local address
	configured on the incoming interface
	2 - reply only if the target IP address is local address
	configured on the incoming interface and both with the
	sender's IP address are part from same subnet on this interface
	3 - do not reply for local addresses configured with scope host,
	only resolutions for global and link addresses are replied
	4-7 - reserved
	8 - do not reply for all local addresses
	The max value from conf/{all,interface}/arp_ignore is used
	when ARP request is received on the {interface}

arp_announce

对网络接口上,本地 IP 地址的发出的,ARP 回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源 IP 地址发出 ARP 请求的接口

arp_announce - INTEGER
	Define different restriction levels for announcing the local
	source IP address from IP packets in ARP requests sent on
	interface:
	0 - (default) Use any local address, configured on any interface
	1 - Try to avoid local addresses that are not in the target's
	subnet for this interface. This mode is useful when target
	hosts reachable via this interface require the source IP
	address in ARP requests to be part of their logical network
	configured on the receiving interface. When we generate the
	request we will check all our subnets that include the
	target IP and will preserve the source address if it is from
	such subnet. If there is no such subnet we select source
	address according to the rules for level 2.
	2 - Always use the best local address for this target.
	In this mode we ignore the source address in the IP packet
	and try to select local address that we prefer for talks with
	the target host. Such local address is selected by looking
	for primary IP addresses on all our subnets on the outgoing
	interface that include the target IP address. If no suitable
	local address is found we select the first local address
	we have on the outgoing interface or on all other interfaces,
	with the hope we will receive reply for our request and
	even sometimes no matter the source IP address we announce.
	The max value from conf/{all,interface}/arp_announce is used.
	Increasing the restriction level gives more chance for
	receiving answer from the resolved target while decreasing
	the level announces more valid sender's information.

关于对arp_announce 理解的一点补充

Assume that a linux box X has three interfaces - eth0, eth1 and eth2. Each interface has an IP address IP0, 
IP1 and IP2. When a local application tries to send an IP packet with IP0 through the eth2.  Unfortunately, 
the target node’s mac address is not resolved. Thelinux box X will send the ARP request to know 
the mac address of the target(or the gateway). In this case what is the IP source address of the 
“ARP request message”? The IP0- the IP source address of the transmitting IP or IP2 - the outgoing
 interface?  Until now(actually just 3 hours before) ARP request uses the IP address assigned to 
the outgoing interface(IP2 in the above example) However the linux’s behavior is a little bit 
different. Actually the selection of source address in ARP request is totally configurable 
bythe proc variable “arp_announce”  
If we want to use the IP2 not the IP0 in the ARP request, we should change the value to 1 or 2. 
The default value is 0 - allow IP0 is used for ARP request.

其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求 路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。

arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。