背景:
(1)根据缺省的TCP/IP协议栈处理,响应报文的源地址等于请求报文的目的IP。
(2)关于ARP表: IP、MAC、网络接口的映射表;列表中的IP都属于本设备所在的网段,发送/转发非本地网段时候是通过网关,所以只需要使用网关对应的MAC即可。
(3)ARP条目更新的条件(满足任意一个即可):
1、收到ARP request:目的MAC是广播,且Target IP是本机上的IP;(这里说Target IP是为了与目的IP区分)
2、收到ARP reply:目的MAC是广播或本机MAC,且ARP表中已经存在该条目;(如免费ARP报文和自身发出请求后的应答)
关于上述提到的Target IP,指的是ARP报文中请求的目标IP,ARP报文不属于IP报文,具体结构如下图:(不纠结ARP协议属于二层还是三层协议)
由于是请求目标IP的MAC,所以Target MAC为全0待填充,这里需要注意的是ARP报文的目的MAC与Target MAC,由于报文是以广播形式发送,所以二层的目的MAC是全F,而请求的Target MAC是属于三层上的数据,全0待填充;Target MAC只是Wireshark的显示,实际数据包是直接把四个值连在一起。APP reply报文则是单播,结构跟ARP request一样,目的MAC改成ARP request的源MAC,三层数据上,则把请求的MAC填上,所有源和目的对调,就是说,Sender MAC会等于源MAC,Target MAC等于目的MAC。
(4)免费ARP:可用于检测IP冲突和更新ARP条目,每次设置新IP和启动网络服务的时候会发送。
二层:源MAC为发送者MAC,目的MAC为全F
三层: 首先会发4个(Windows发3个,隔秒发送)Sender IP为全0的ARP包;没有IP冲突的情况下,Linux(CentOS 6.4)会先发送一个Target MAC=Sender MAC=源MAC、Target IP=Sender IP=发送者IP的免费ARP包,接着发送一个Target MAC=F、其他跟前一个包相同的免费ARP包;Windows(Win10)则只发送一个Target MAC=0、Sender MAC=源MAC、Target IP=Sender IP=发送者IP的免费ARP包。
正题:
在配置LVS负载均衡架构的时候需要在RealServer上抑制ARP,具体是arp_ignore=1,arp_announce=2
arp_ignore: (回应ARP)
0:回应任何网口上收到的对任何本机IP地址的ARP查询请求(默认)
1:只回应Target IP是接收网口的IP的ARP查询请求
2:只回应Target IP是接收网口的IP的ARP查询请求,且Sender IP必须与该网口属于同一网段
4-7:保留未使用
8:不回应所有的arp查询
arp_announce: (选择ARP宣告时候使用的Sender IP)
0:使用发送(或转发)的数据包的源IP作为发送ARP请求的Sender IP(默认) ;(可使用ping -I 验证)
1:IP数据包的目的IP属于本地某个接口的网段时,Sender IP则使用IP数据包源IP,不属于则按2处理;
2:忽略数据包的源IP,使用能与目标主机会话的最佳地址来作为发送ARP的Sender IP,优先选择对外接口的主IP;(loopback不是对外接口)
注:ARP表没有网关对应的条目时,在发送IP数据包前会触发 arp_announce;
Sender MAC跟系统无关,Sender MAC=源MAC,源MAC由物理地址决定,网络攻击除外。