Print

免费ARP实现IPv4地址冲突检测原理分析

2018-04-02 发表

当网络中存在IP地址冲突时,会引发网络路由振荡、网络业务或者流量中断等故障,这些故障会对用户的业务造成很大的影响。为了尽量避免由于错误组网或者用户错误配置造成IP地址冲突的情况发生,用户往往希望设备能够通过一种简单的手段,自主检测网络中是否存在IP地址冲突,及时提示用户冲突的根源,以帮助用户尽快消除冲突配置,切实减少对业务的影响。

本文主要对免费ARP实现IPv4地址冲突检测的原理进行简单介绍,并通过测试抓包对PC终端(Windows 10系统)以及H3C网络设备(Comware V7平台交换机/路由器/防火墙)实现情况做进一步阐述。

免费ARP原理

 

Gratuitous ARP,被翻译为“免费ARP”,也被称为“无故ARP”。相比“免费”这个翻译,“无故”这个更易理解:“在没有人问自己的情况下,无缘无故自问自答”,即免费ARP是设备发送的一个发送端IP地址和目标IP地址都是本设备IP地址的ARP request/reply报文:

设备通过对外发送免费ARP报文来实现以下功能:

1、设备的硬件地址可能发生了变化(比如修改了MAC地址,或者换了网卡)。ARP request可以让LAN(或者VLAN)中所有设备更新ARP request发送者的IPMAC的映射关系。

2、确定当前网络中是否有其他设备的IP和自己的IP是一样的。如果这个ARP request发出后,没有收到ARP reply,说明LAN(或者VLAN)中没有设备和自己IP地址一样。如果收到了ARP reply,说明当前LAN(或者VLAN)有设备使用了和本机一样的IP;这个时候系统通常会提醒用户IP地址冲突,并且会周期性的广播发送免费ARP应答报文,直到冲突解除。

故将免费ARP用于检测局域网内的IP地址冲突,能够在一定程度上能够给用户和网络运维人员提供帮助。

但免费ARP检测IP地址冲突也会带来一些网络问题。如下图所示,局域网内有PC-1PC-2PC-3三台设备,PC-1的地址为192.168.1.1PC-2PC-3的地址均为192.168.1.2

按照免费ARP的实现机制,上面的PC-2PC-3检测到彼此的IP地址冲突后,会一直不停地对外发送免费ARP;与此同时,同一局域网的其他主机例如PC-1则会根据这两个免费ARP信息不断的修改本地ARP表,192.168.1.2一会映射到MAC-2,一会映射到MAC-3,直到一方修改了地址;免费ARP这种机制会对整个局域网中的设备造成持续的影响,不利于局域网的稳定性。因此RFC也提出了新的地址冲突检测机制。

 

地址冲突检测ACDAddress Conflict Detection)原理

针对局域网地址冲突问题以及免费ARP解决方案的缺陷,RFC 5227提出了一个新的机制:ACDAddress Conflict Detection)。ACD定义了ARP probeARP announcement两种ARP包(都是ARP request,只是填充内容不太一样)

ARP probe:用于检测IP地址冲突,发送端IP填充为0,填充为0是为了避免对其他设备的ARP cache造成污染(ARP probe报文不会使局域网中的其他设备刷新ARP映射关系,若已经有设备正在使用目标IP地址了,其通信不会受影响),目标IP是候选IP地址(即本设备想要使用的IP地址)。从“自己问自己”的角度看,ARP probe也算是免费ARP

 

ARP announcement:用于“昭示天下”(LAN/VLAN)本设备要使用某个IP地址了,它其实就是一个免费ARP request,即发送端IP地址和目标IP地址都是本设备IP地址的ARP request报文。它会让LAN(VLAN)中所有主机都更新自己的ARP映射关系,将IP地址映射到发送者的MAC地址。

ACD检测流程

1、网卡/端口启动时(或者从睡眠状态恢复,或者链接建立时)会发送一个ARP probe。(为了避免多个网卡/端口同时启动同时发ARP probe造成拥塞,有一个拥塞避免策略,不会立刻发送ARP probe,会等待一个随机时间再发送,单个网卡的多个probe也不会连续发送,会有间隔时间)。

2、发送设备可能收到ARP reply或者ARP probe,如果收到了ARP reply,说明候选IP地址已经有设备在用了。如果收到了一个目标IP地址为候选IPARP probe,说明另外一个设备也同时想要使用该候选IP地址。这两种情况下,两个设备都会提醒用户出现了IP地址冲突。然后进行地址冲突处理。

3 如果上述两种ARP包都没有收到,说明候选IP地址可用。设备发送一个ARP announcement,告诉其他设备这个候选IP已被使用了,这个免费ARP request报文会让LANVLAN)中其他设备更新ARP表项。

ACD地址冲突处理

当检测到IP地址冲突后,RFC5527提供了三种可选的解决机制:

1、直接放弃使用该IP地址;

2、发送一个ARP announcement来进行IP地址“守卫”,如果冲突仍然继续存在,放弃使用这个IP

3、无视冲突,继续使用这个IP

至此,我们简单了解了免费ARP检测地址冲突的原理,下面将通过实验,直观地了解下免费ARP如何实现IP地址冲突检测。

 

Windows系统主机的地址冲突检测实现情况

通过实验抓包,结合上文对地址冲突检测原理的说明,我们对Windows系统主机的地址冲突检测机制做进一步阐述,如下图组网,PC-1PC-2均连接至SW上,且两台PC机属于同一VLAN,初始时两台PC机均未配置IP地址:

1PC-1安装了Windows 10操作系统,手工给PC-1配置IP地址100.1.1.1/24,然后再SWPort-1接口上镜像抓包,通过Wireshark可以观察到如下ARP报文:

 

PC-1配置好地址后,发送了三个探测100.1.1.1地址的ARP probe报文(三个报文间隔1s),因均未收到网络中其他设备对该探测报文的ARP reply,故此时PC机确认100.1.1.1地址可用,向网络中发布了ARP announcement报文宣告对100.1.1.1地址的使用。

由此可以看出Windows系统ACD的实现与RFC5227中所规定的流程一致,下面继续观察当地址冲突时,Windows系统对地址冲突的处理机制。

2、将上述网络恢复初始状态后,先给PC-2手工配置地址100.1.1.1/24,然后再给PC-1手工配置地址100.1.1.1/24,同时在SW上的Port-1镜像抓包,通过Wireshark观察有如下ARP交互:

PC-1配置好地址后,同样发送了100.1.1.1地址的ARP probe报文,但因此时网络中PC-2已配置了地址100.1.1.1,故PC-2收到这个ARP probe后会给PC-1回应一个ARP reply,通知PC-1自己才是地址100.1.1.1的拥有者。

PC-1收到PC-2ARP reply后,因在PC-1上该地址非DHCP动态获取,PC-1直接放弃使用地址100.1.1.1,用Microsoft的保留网段169.254.X.X/16自动生成了一个地址169.254.162.184,然后对这个地址再次重复前文所述的探测过程:三个ARP probe无回应后发送免费ARP宣告占用地址。

由此可以看出Windows系统ACD检测到地址冲突后,对地址冲突处理机制的实现与RFC5227中所提供的“机制一”一致,即:直接放弃对冲突地址的使用。

 

H3C交换机/路由器/防火墙的地址冲突检测实现情况

通过实验抓包,结合上文对地址冲突检测原理的说明,我们对H3C交换机/路由器/防火墙的地址冲突检测机制做进一步阐述,如下图组网,SW-1SW-2互联,给SW-2Port-2配置地址100.1.1.1,然后给SW-1Port-1也配置地址100.1.1.1,在SW-1Port-1上镜像抓包,通过Wireshark观察有如下ARP交互:

SW-1配置地址100.1.1.1后,直接向网络中发送了一个免费ARP request,宣告自己使用了100.1.1.1这个地址,此时SW-2立即回应了一个ARP reply报文,宣告自己已经占用了地址100.1.1.1,与此同时SW-2也向网络中发送了一个免费ARP request,宣告自己使用了100.1.1.1,而SW-1也立即回应了一个ARP reply宣告自己是地址100.1.1.1的使用者,此时SW-1SW-2完成了一轮对地址100.1.1.1的“守卫”,并分别通过日志向用户告警地址冲突,然后继续下一轮“守卫”,直至用户修改一端的地址消除冲突。通过抓包及告警日志可以看出两轮“守卫”的时间间隔是6秒。

使用H3C的路由器/防火墙重复上述实验,实验结果一致;由此可以看出,H3C的交换机/路由器/防火墙直接使用免费ARP进行地址冲突检测,而不是RFC 5227中新的ACD机制;H3C的设备在检测地址冲突后,不会放弃对冲突地址的使用,并且周期性发送免费ARP进行地址守卫,直至人工消除地址冲突,这种处理机制与RFC 5227中提供的“机制三”是一致的,这种方式在网络设备与终端设备对接时,有利于网络整体稳定性。

 

H3C设备地址冲突告警机制

在上文中,我们对PC等终端设备、H3C网络设备地址冲突机制进行了实验及分析,在地址冲突检测过程中共涉及到3ARP报文:ARP probeARP announcement以及ARP reply(发送者IP与标记IP一致),那么H3C设备对这三种ARP报文是如何处理的呢?

通过以下的实验进行分析:

一、设备“不开启源IP地址冲突提示功能”(默认情况)

如下拓扑所示,将SW与测试仪器互联的地址配置为100.1.1.1/24,然后用测试仪器向SW分别持续打入3种报文。

1、 打入ARP probe

 

可以观察到当SW持续收到地址100.1.1.1ARP probe报文后,会不断以地址100.1.1.1的免费ARP进行回应,但不会产生地址冲突的告警日志。

2、 打入ARP announcement(免费ARP request

 

可以观察到当SW持续收到地址100.1.1.1的免费ARP request报文后,会不断以地址100.1.1.1的免费ARP进行回应,但不会产生地址冲突的告警日志。

3、打入ARP reply(发送者IP与标记IP均为100.1.1.1

 

 

可以观察到当SW持续收到地址100.1.1.1的免费ARP reply报文后,每隔6s会回应一个免费ARP request报文,检测冲突是否消除,而且会生成地址冲突的告警日志。

二、设备“开启源IP地址冲突提示功能”

重复上述三个打流过程,此时设备收到地址100.1.1.1的三种免费ARP报文后,每隔6s都会回应一个免费ARP request报文,检测冲突是否消除,而且会生成地址的冲突的告警日志。

1PC/服务器等终端设备通常采用RFC 5227中新的ACD检测流程,当检测到地址冲突后,其处理方式与RFC 5227中提供的“机制一”一致,即直接放弃对冲突地址的使用。在修改终端地址、新终端接入局域网等应用场景下,如果产生地址冲突,该方式最有利于网络的稳定性。

2H3C网络设备直接采用免费ARP实现地址冲突检测,而非RFC 5227中新的ACD检测流程。当检测到地址冲突时,其处理方式与RFC 5227中提供的“机制三”一致,即继续占用冲突地址。在修改终端地址、新终端接入局域网等应用场景下,如果产生地址冲突,网络设备比终端设备更“强势”,终端设备更容易放弃对冲突地址的使用,这样有利于网络的整体稳定性。但在网络设备间地址冲突的情况下,该机制对整网稳定性会造成持续影响。

3、当H3C网络设备关闭源IP地址冲突提示功能时(默认情况),仅在收到免费ARP reply后,每隔6s会回应一个免费ARP request报文,检测冲突是否消除,而且会生成地址冲突的告警日志;当开启源IP地址冲突提示功能时,只要收到ARP报文的目标IP与本地地址一致,每隔6s会回应一个免费ARP request报文,检测冲突是否消除,而且会生成地址冲突的告警日志。