ARP,是地址解析协议(Address Resolution Protocol)。其基本功能为根据设备的IP地址来查询对应MAC地址的协议。主机通过ARP查询到MAC地址后,将在ARP缓存表中增加映射表项,即IP地址和MAC地址的映射表项,也就是我们常说的ARP表项。
ARP是一种常见又十分重要的协议,比如网络扫描、内网渗透、局域网流控、流量欺骗等都跟ARP脱不了干系。听上去这么重要的协议,说简单也简单,整个ARP完整交互过程仅需要两个报文搞定,一问一答。但是ARP协议本身也有令人迷惑的地方,由ARP本身延伸出来很多概念,比如动态ARP、静态ARP、免费ARP、代理ARP等等。
在深入到技术原理之前,我们先看下面三句话:
1、知道IP即可
一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,而且我们平时接触更多的也是IP地址,只要知道了IP地址,我们可以通过协议来获取通信所需的MAC地址,完成数据封装,这就是ARP协议的作用。
2、IP—>MAC的映射
ARP(Address Resolution Protocol)即地址解析协议, 用于实现从IP地址到MAC地址的映射,即询问目标IP对应的MAC地址。
3、逐层封装到链路层
在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。
Part 02 ●ARP基本原理●
以我们平时最简单的一个ping的流程来切入:
主机A ping主机B为例,ping过程在网络中需要构造ICMP报文,ICMP报文简单来说就是MAC头+IP头+ICMP头,其中,MAC头中包含源MAC、目的MAC地址信息以及以太网协议类型(IPv4协议族的类型值为0x0800)。IP头中主要包含源IP地址、目的IP地址、协议类型(这个协议类型主要指的传输层协议类型,比如UDP是17,TCP是6,ICMP是1)。ICMP头中是一些控制面的信息,比如type代表是ARP请求还是ARP应答等等。
ARP请求和应答的过程如下图所示:
我们分几个步骤来简单的描述上图中所示的ARP报文协议流程:
为何要发送ARP
当在主机A命令行中敲入ping x.x.x.x(x.x.x.x为主机B的地址)的时候,系统会获取到目的IP(x.x.x.x),源IP(主机A的IP),ping字段代表要发送ICMP报文,要送入ICMP协议栈,所以以太网协议类型0x8000(代表IPv4)和IP头中的协议类型1(代表ICMP)也确定了,所以IP头的信息完整可以构造了,但是没有MAC头信息,所以在协议栈中封装完IP头后,封装MAC头前,主机A根据主机B的IP地址IP2去自己的ARP表中查询主机B的MAC,发现没有,说明要么没有发生过交互(如果发生过一次完整的ARP交互,会记录映射信息),要么就是发生过但是已经老化了(ARP表项每隔一段时间会老化),所以需要发送ARP请求给主机B。
发送的ARP报文是什么样子
ARP请求报文简单来说就是在网络中发送一帧广播报文,目的MAC为全F,内层封装中有自身的IP、MAC信息,以及请求目标的IP地址,同一广播域中的交换机收到全F的广播报文后,会在该广播域内广播。ARP报文格式如图所示:
接收者收到之后会怎样
其他主机也会收到该广播报文,但是发现请求的不是自己的地址则不会做出回应,主机B收到之后,发现是请求自己的MAC地址,首先会将发起方(主机A)的IP和MAC的映射关系存入自身的ARP表项(简单来说,ARP请求首先要有自我介绍,然后才是询问),同时构造ARP应答报文发送到网络中。
接收者发送的是什么报文
因为主机A在发送ARP请求的时候,走的是二层转发,二层转发需要MAC地址转发,所以交换机并不知道目的MAC地址该往哪里去,只能在发送端(主机A)发送广播报文,但是当主机B回复ARP应答的时候,已经知道了主机A的MAC地址,所以只需要发送单播报文就可以了,这就是为什么ARP请求是广播报文,ARP应答是单播报文。ARP应答报文如图所示:
当然,如果在第一步,主机A查询自身ARP表项发现能够查到主机B的IP对应的MAC地址时,就不需要再发送ARP请求了,因为已经知道了MAC地址,直接封装二层头,然后发送完整的ICMP报文出去就可以了。
Part 03 ● ARP表项●
前面提到过,主机中会存一个IP地址和MAC地址的映射关系表,这就是ARP表项,因为如果每次主机A和主机B通信前都要发送一个广播的ARP请求报文,会极大的增加网络负担。而且同广播域的所有设备都需要接收和处理这个广播的ARP请求报文,也极大的影响了网络中设备的运行效率。
为了解决以上问题,每台主机或设备上都维护着一个高速缓存,这是ARP高效运行的一个关键。在这个高速缓存中,存放主机或设备最近学习到的IP地址到MAC地址的映射关系,即动态ARP表项。主机或设备每次发送报文时,会先在本地高速缓存中查找目的IP地址所对应的MAC地址。如果高速缓存中有对应的MAC地址,主机或设备不会再发送ARP请求报文,而是直接将报文发至这个MAC地址;如果高速缓存中没有对应的MAC地址,主机或设备才会广播发送ARP请求报文,进行ARP地址解析。
前面在ARP基本原理中反复提到过ARP表项,那么前面所说由ARP报文交互流程而学习到的ARP表项称之为动态ARP表项,通过静态配置生成的ARP表项称之为静态ARP表项。静态ARP表项的优点是配置上之后,不需要再发送ARP报文了,可以节省网络开销,缺点是如果对端的信息发生变化,这条表项就失去意义了。
一方面由于高速缓存的容量限制,另一方面为了保证高速缓存中ARP表项的准确性,设备会对动态ARP表项进行老化和更新。
动态ARP表项的老化参数有:老化超时时间、老化探测次数和老化探测模式。设备上动态ARP表项到达老化超时时间后,设备会发送老化探测报文(即ARP请求报文),如果能收到ARP应答报文,则更新该动态ARP表项,本次老化探测结束;如果超过设置的老化探测次数后仍没有收到ARP应答报文,则删除该动态ARP表项,本次老化探测结束。
Part 04 ● 静态ARP●
前文也提到过静态ARP,这里详细介绍一下静态ARP。静态ARP表项在网络中也有着重要作用,比如某些流程中,不想通过触发ARP报文或者不允许触发ARP报文来学习链路层地址,则可以通过配置静态ARP表项来实现,配置完静态ARP表项之后,当协议栈在需要封装链路层信息的时候,不会发起ARP请求流程,而是直接从ARP表项中拿到对应的MAC地址,封装完成直接发出去。另外静态ARP表项在应对ARP攻击的时候也有重要作用。
静态ARP表项分为长静态ARP表项和短静态ARP表项。
➤ 长静态ARP表项:手动建立IP和MAC间的映射关系,并同时指定该ARP表项所在出接口。长静态ARP表项可以直接用于报文转发。
➤ 短静态ARP表项:手动建立IP和MAC间的映射关系,未同时指定出接口。如果出接口是处于二层模式的以太网接口,短静态ARP表项不能直接用于报文转发。当需要发送报文时,设备会先发送ARP请求报文,如果收到的ARP应答报文中的源IP和源MAC与所配置的IP和MAC相同,则将收到ARP应答报文的接口加入该静态ARP表中,后续设备可直接用该静态ARP表项转发报文。
Part 05 ● 结语●
ARP协议非常重要并且常用,是数据通信的入门协议,在网络中扮演着十分重要的角色,但就是这么一个关键角色,却十分不安全,因为ARP协议是建立在网络中各个主机相互信任的基础上的,一旦有人利用这份信任,向某一主机发送伪ARP应答数据包,使该主机发送的信息无法到达预期的目的地或者走向错误的目的地,就是所谓的ARP欺骗或者ARP攻击。
ARP欺骗或者攻击可以导致目标主机与网关通信失败,也会让报文更改方向,所有的数据都会流入攻击者的主机中,造成数据外泄,影响安全。
当然,使用一些防范ARP攻击的杀毒软件可以提高一定的安全性,或者可以通过减少过期时间、建立静态ARP表项等手段去提高网络安全性。