免费ARP(Gratuitous ARP)的介绍
问题引入:
我们很多系统都是使用双机热备份系统(即一个主用,另一个备用,如果主用没有问题,备用一直处于空闲状态;如果主用出现问题,备用立刻接管)。假设主用服务器的MAC地址为:1111-1111-1111,备用服务器的MAC地址为:2222-2222-2222,通过某种软件,两台服务器共同对外共同使用一个IP,例如10.10.10.1,这样客户机在需要同服务器进行通信的时候(第一次通信的例子,在这时候ARP的缓存是空的,或至少没有10.10.10.1的MAC地址),先向局域网发送广播ARP请求报文请求10.10.10.1这个IP地址的MAC地址,得到主用服务器响应后,将10.10.10.1和对应的MAC地址放入自己的ARP缓存中,然后向这个IP发送请求就可以进行通信了。如果在通信的过程中,主用服务器突然发生故障,down机了,这时备用服务器立刻接管10.10.10.1这个IP进行服务,可是刚才那台客户机的ARP缓存表中10.10.10.1这个IP对应的MAC地址是1111-1111-1111,再往这个MAC地址发送数据包肯定是石沉大海的,怎样才能让备用接管了服务之后立刻能起作用呢?
我们能想到的方法有两种,一种就是在使用双机热备份系统,接管那个IP的时候,生成一个不依赖于任何一个主机的虚拟MAC地址,接管IP的同时也接管那个虚拟的MAC地址,这样客户机不需要做任何更改动作,ARP缓存表不变。另外一种就是在接管的同时,接管的服务器对外广播一个ARP报文给所有主机,例如在刚才的例子中,ARP广播报文的数据字段中源IP地址是10.10.10.1,源MAC地址是2222-2222-2222,目的IP地址也是10.10.10.1,目的MAC地址也是2222-2222-2222,IP报文的目的地址是:FFFF-FFFF-FFFF,这样让所有的广播网络上的主机接收该报文,并更新自己的ARP缓存表,已告知10.10.10.1这个IP的对应MAC地址已经变为2222-2222-2222,这样,刚才的那个客户机就能正确地同服务器进行通信了。
第一种方法在大多数系统中已经被采用,例如Cisco的HSRP技术中,虚拟出来的MAC地址是以0000.0c07.ac+HSRP的group ID组成,并且限制局域网上不会存在不同应用的相同Group ID,以确保局域网上不会重复MAC地址生成。在VRRP中也是如此,原理和HSRP同。这样无论主备用如何切换,客户机不需要做任何动作。
第二种方法就是免费ARP技术(gratuitous ARP),目前应用也很广泛。
免费ARP的作用
在所有网络设备(包括计算机网卡)up的时候,都会发送这样的免费ARP广播,以宣告并确认有没有冲突。
下面是一个免费arp报文的例子:
0000
0010
0020
0030
0040
按位解释:报文中前48位是报文发送的目的MAC地址,ff ff ff ff ff ff说明前48位都为1,表示这是一个局域网广播地址,后面那个00 00 5e 00 01 ea是数据包发送的源MAC地址,08 06表示为数据包类型为arp数据包,00 01表示这是一个以太网数据包,08 00表示为IP协议,6是硬件地址长度,4为协议地址长度,00 01表示是ARP请求报文,00 00 5e 00 01 ea发送者MAC地址,86 4a ea 01(转换成十进制是134.74.234.1)是发送者的协议地址(由于协议是IP,所以这是IP地址),后面的86 4a ea 01是被请求的协议地址(可以看到请求的地址就是自身的IP地址),00 00 5e 00 01 ea是被请求的MAC地址,正常情况下,如果不是免费ARP,这里应该为全0,在响应的时候,由目的主机来填写,但是在免费ARP的请求报文中,这里已经自动填写上自身的MAC地址。
免费ARP带来的漏洞
1.
2.
但是这些方法都很死板,不灵活。
结束语:
其实我们很多设备的漏洞都是这样产生的,为了解决一个问题,引入一项新的机制,但是通常由于缺乏全面的系统分析机制,没能对该项技术进行全方位的论证和考虑,导致了该技术存在一定的缺陷,引起系统的故障,然后在后继的过程中,只有通过打补丁或再引入其他机制进行预防。
其实任何一种技术都是这样,都是在不停地发现问题、解决问题、升级打补丁中发展起来的。微软公司的操作系统写的那么好,还是有那么多漏洞,现在Win2000的补丁有400M之多。
但是好的系统应该像Cisco公司那样,在开发设计之初,尽可能地分析周全,在投入使用后,才能做到基本不用打补丁。