导读

最近总是抓到全0的MAC地址的包,然后发现自己把ARP忘得差不多了,重新写一篇文章复习下。

ARP报文格式

ARP-Request

  • 目的地址:FF-FF-FF-FF-FF-FF
  • 源地址:本机MAC地址
  • 帧类型:0x806
  • 硬件类型:1
  • 协议类型:0x800
  • 硬件地址长度:6
  • 协议地址长度:4
  • 操作码(OP Code):1
  • 发送者MAC地址:本机MAC地址
  • 发送者IP地址:本机IP地址
  • 目标MAC地址:00-00-00-00-00-00
  • 目标IP地址:目的IP地址

ARP-Reply

  • 目的地址:Request包的源地址
  • 源地址:本机MAC地址
  • 帧类型:0x806
  • 硬件类型:1
  • 协议类型:0x800
  • 硬件地址长度:6
  • 协议地址长度:4
  • 操作码(OP Code):2
  • 发送者MAC地址:本机MAC地址
  • 发送者IP地址:本机IP地址
  • 目标MAC地址:Request包的源MAC地址
  • 目标IP地址:目的IP地址

Gratuitous ARP(ARP Announcement)

  • 目的地址:FF-FF-FF-FF-FF-FF
  • 源地址:本机MAC地址
  • 帧类型:0x806
  • 硬件类型:1
  • 协议类型:0x800
  • 硬件地址长度:6
  • 协议地址长度:4
  • 操作码(OP Code):1
  • 发送者MAC地址:本机MAC地址
  • 发送者IP地址:本机IP地址
  • 目标MAC地址:00-00-00-00-00-00
  • 目标IP地址:本机IP地址

Gratuitous ARP(ARP Announcement Reply)

  • 目的地址:FF-FF-FF-FF-FF-FF
  • 源地址:本机MAC地址
  • 帧类型:0x806
  • 硬件类型:1
  • 协议类型:0x800
  • 硬件地址长度:6
  • 协议地址长度:4
  • 操作码(OP Code):2
  • 发送者MAC地址:本机MAC地址
  • 发送者IP地址:本机IP地址
  • 目标MAC地址:Request包的源MAC地址
  • 目标IP地址:本机IP地址

一般LAN(局域网)通讯过程

  • 掩码:255.255.255.0
  • 网段:192.168.0.*
  • A主机:192.168.0.1
  • B主机:192.168.0.2

A访问B的步骤:

  1. A向B发送一个ARP request包。
  2. B收到后,更新自己的ARP表。
  3. B向A发送一个ARP reply包。
  4. A获取到B的MAC地址,更新自己的ARP表。
  5. A与B可以正常通讯。

自组包的注意事项

自组包时,若需要在A主机伪造C主机(同段)访问B主机。则需要在A主机先发送一个C向B的ARP reply包,待B获取到C的MAC地址后,更新ARP表项后即可正常通讯。(当B没有C的ARP表项时,C发给B的每一个包,B都会返回一个ARP的Request,直至C发送一个ARP reply给B。)

免费ARP包(Gratuitous ARP)

Windows主机接入网络后会发三次Arp Probe(1秒1次),在此期间内若有应答包则会提示本机“出现IP冲突”;若无应答后会广播一个Arp Announcement宣布自己使用了某个ip。

根据《RFC1122》中,“在探测确定可以安全地使用所需的地址后,实施本规范的主机必须通过广播ANNOUNCE_NUM ARP公告来宣布它开始使用该地址,其间隔为ANNOUNCE_INTERVAL秒。ARP公告与上述的ARP探针相同,只是现在发送者和目标IP地址都被设置为主机新选择的IPv4地址。这些ARP公告的目的是确保链接上的其他主机没有陈旧的ARP缓存条目,这些条目可能是以前使用同一地址的其他主机留下的。在发送两个ARP公告中的第一个后,主机可以立即开始合法使用该IP地址;第二个ARP公告的发送可以异步完成,与主机可能希望执行的其他网络操作同时进行。主机可能希望执行的其他网络操作。

ARP的动态映射

ARP的动态映射的默认超时时间在《RFC1122》中规定为20分钟(目前在Windows7测试下的超时时间为1分钟左右)。

《RFC1122》说明,有四种机制被用来刷新过期的缓存条目,有时是结合使用的。

  1. 超时 -- 定期给缓存条目超时,即使它们正在使用中。 注意,当缓存条目被"刷新"(通过观察来自有关系统的ARP广播的源字段,不管目标地址是什么)时,这个超时应该被重新启动。 对于代理ARP的情况,超时时间需要在一分钟的范围内。
  2. 单播轮询 -- 通过定期向远程主机发送点对点的ARP请求来主动轮询,如果连续N次轮询都没有收到ARP回复,则删除该条目。 同样,超时应该是一分钟的量级,通常来说N为2。
  3. 数据链路层咨询 -- 如果数据链路层驱动检测到一个送达问题,立即刷新相应的ARP缓存条目。
  4. 更高层的咨询 -- 提供一个从网络层到数据链路层的调用,以指示送达问题。 这个调用的效果是使相应的缓存条目失效。这个调用类似于从传输层到网络层的 "ADVISE_DELIVPROB() "调用,事实上,ADVISE_DELIVPROB例程可能反过来调用链路层的建议例程以使ARP缓存条目失效。

方法1和2涉及的ARP缓存超时为一分钟或更少。在没有代理ARP的情况下,这么短的超时可能在一个非常大的以太网上产生明显的开销流量。 因此,可能需要配置主机以延长ARP缓存超时。

ARP冲突解决

《RFC5227》中说明,当主机发送ARP Probe时,地址冲突检测不局限于初始化接口配置时。地址冲突检测是一个持续的过程,只要主机在使用一个地址,它就一直有效。 在任何时候,如果主机收到一个ARP数据包(ARP请求或ARP回复),其中 "发送者IP地址"是主机在该接口上配置的自己的IP地址(之一),但 "发送者硬件地址 "与主机自己的任何接口地址不匹配,那么这是一个冲突的ARP数据包,表明其他一些主机也认为它正在有效地使用这个地址。 为了解决地址冲突,主机必须按照下面(a)、(b)或(c)中的描述,对冲突的ARP数据包作出回应。

  • a) 在收到冲突的ARP数据包后,主机可以选择立即停止使用该地址,并如上所述向配置代理发出错误信号。
  • b) 如果一个主机目前有活跃的TCP连接或其他原因希望保持相同的IPv4地址,并且在过去的DEFEND_INTERVAL秒内没有看到任何其他冲突的ARP数据包,那么它可以选择尝试通过记录收到冲突的ARP数据包的时间来捍卫其地址,然后广播一个单一的ARP公告,给出自己的IP和硬件地址作为ARP的发送者地址,"目标IP地址 "设置为自己的IP地址,"目标硬件地址 "设置为全零。做完上述步骤后,主机就可以继续正常使用该地址,而不需要做任何进一步的特殊操作。然而,如果这不是主机收到的第一个冲突的ARP数据包,而且前一个冲突的ARP数据包的记录时间是最近的,在DEFEND_INTERVAL秒内,那么主机必须立即停止使用这个地址,并向配置代理发出上述的错误信号。这是必要的,以确保两个主机不会陷入无休止的循环,两个主机都试图捍卫同一个地址。
  • c) 如果一台主机被配置为在任何情况下都不应该放弃它的地址(也许是因为它是那种需要有一个众所周知的稳定的IP地址的设备,如链接的默认路由器或DNS服务器),那么它可以选择无限期地捍卫它的地址。 如果这样的主机收到一个冲突的ARP数据包,那么它应该采取适当的措施来记录有用的信息,如ARP数据包的源以太网地址,并将问题通知管理员。这种通知的数量应该得到适当的控制,以防止产生过多的错误报告。如果主机在最近的DEFEND_INTERVAL秒内没有收到任何其他冲突的ARP包,那么它必须记录收到冲突的ARP包的时间,然后广播一个ARP公告,给出自己的IP和硬件地址。这样做后,该主机就可以继续正常使用该地址,而不需要采取任何进一步的特别行动。然而,如果这不是主机看到的第一个冲突的ARP数据包,并且前一个冲突的ARP数据包的记录时间在DEFEND_INTERVAL秒内,那么主机必须不发送另一个维护ARP的广播。这是必要的,以确保两个配置错误的主机不会陷入无休止的循环,否则它们都会试图防御同一地址时用广播流量淹没网络。

注:DEFEND_INTERVAL     默认:10 秒  (维护ARP之间的最小时间间隔)

希望提供可靠的网络操作的主机必须对上述(a)、(b)或(c)中描述冲突的ARP数据包作出反应。忽略冲突的ARP数据包会导致看似随机的网络故障,这种故障可能难以诊断,对用户来说非常令人沮丧。

强制的地址重新配置可能是破坏性的,导致TCP(和其他传输层)连接中断。 然而,这种中断应该是极其罕见的,如果无意中发生了地址重复,那么通信的中断是不可避免的。

在由于冲突而放弃一个地址之前,主机应该主动尝试重置任何使用该地址的现有连接。 这可以减轻地址重新配置带来的一些安全威胁

对于大多数不需要固定IP地址的客户机来说,一旦发现冲突,立即要求配置代理(用户、DHCP客户端等)配置一个新的地址,是尽快恢复有用通信的最佳方式。上面描述的广播一个ARP公告来保卫地址的机制在一定程度上缓解了这个问题,因为它有助于提高两个冲突的主机中的一个能够保留其地址的机会。

因ARP冲突引发的安全问题

IPv4地址冲突检测(ACD)基于ARP协议[RFC826],它继承了该协议的安全漏洞:恶意主机可能在网络上发送欺诈性的ARP数据包,干扰其他主机的正确操作。例如,一个主机很容易回答所有的ARP请求,并给出自己的硬件地址,从而声称拥有网络上的每个地址。

本规范使这种现有的ARP漏洞不再恶化,而且在某些方面使它变得更好:实施本规范的主机不是默默地失败,也不说明原因,而是试图自动重新配置,或者至少告知用户正在发生什么。

如果主机自愿选择一个新的地址来应对ARP冲突,如上述a) 所述,这有可能使同一链路上的恶意攻击者更容易劫持TCP连接。 在放弃一个地址之前,让主机主动重置任何现有的连接有助于减轻这种风险。

其他注意事项

  • Windows在ARP表项超时前3秒会广播发出ARP request包询问(1秒1次),若3次均未有回应则Windows会删除该表项。
  • 交换机收到一个以太帧都要先学习帧头的源MAC,如果该MAC地址在MAC地址表不存在,记录到MAC地址表,并启动一个超时定时器,用于删除对应表项。

参考文献

  1. ARP通告协议ARP announcement
  2. ARP报文抓包解析学习
  3. RFC5227

人贵有自知之明。