[title-plane title=”前言”]

如果要在TCP/IP协议栈中选择一个“最不安全的协议”,那么我会毫不犹豫把票投给ARP协议。我们经常听到的这些术语,包括”网络扫描”、”内网渗透”、”中间人拦截”、”局域网流控”、”流量欺骗”,基本都跟ARP脱不了干系。大量的安全工具,例如大名鼎鼎的Cain、功能完备的Ettercap、操作傻瓜式的P2P终结者,底层都要基于ARP实现。

听上去这么”逆天”的协议,其实技术原理又简单的难以置信,例如ARP整个完整交互过程仅需要两个包,一问一答即可搞定!但是ARP协议也有它令初学者迷惑的地方,例如由它本身延伸出来的”代理ARP”、”免费ARP”、”翻转ARP”、”逆向ARP”,而这些不同种类的ARP,又应用于不同的场景。

[/title-plane]

ARP协议概述

       ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。

       简单来说,ARP协议将IP地址解析为以太网MAC地址(或称物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另—个主机或设备时,必须知道对方的IP地址和MAC地址。

ARP出现原因

  • 在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。
  • 一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。

ARP工作实例

[c-alert type=”info”]ARP地址解析协议是如何把目的地址的IP地址转化为MAC地址的?[/c-alert]

  1. 首先,主机A向主机B发送消息,但它不知道主机B的MAC地址,只知道主机B的IP地址。此时,主机A会在当前局域网下以广播的形式发送ARP请求数据报,表示主机A想知道主机B的MAC地址。https://z3.ax1x.com/2021/07/11/WCrOcq.png
  2. 局域网中的毎一台主机都会接受并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址,除了主机B外,在这个局域网内的其他主机都会丢弃数据报。
  3. 验证成功的主机会返回—个ARP响应报文这个响应报文包含接收方的IP地址和物理地址。这个报文以单播的方式直接发送给ARP请求报文的请求方。https://z3.ax1x.com/2021/07/11/WCssK0.png

[c-alert type=”success”]小结:ARP协议通过”一问一答”实现交互,但是”问”和”答”都有讲究,”问”是通过广播形式实现,”答”是通过单播形式。[/c-alert]

ARP缓存表

  • 为了实现IP地址与MAC地址的查询与转换,ARP协议引入了ARP缓存表的概念。
  • 这个表包含IP地址到MAC地址的映射关系,表中记录了<P地址,MAC地址>对,称之为ARP表项。
  • 当需要发送数据时,主机会根据数据报中的目标I地址信息,然后在ARP缓存表中查找对应的MAC地址,最后通过网卡将数据发送出去。

[c-alert type=”warning”]注意:arp缓存表中每—项都被设置了生存时间,一般是20分钟,从被创建时开始计时,到时则清除。[/c-alert]

[c-alert type=”success”]在我们的windows/macos系统下,可以通过命令行”arp -a“查看具体信息=>[/c-alert]

https://z3.ax1x.com/2021/07/11/WCgULq.png

ARP报文格式

ARP报文分为ARP请求和ARP应答报文两种,它们的报文格式可以统一为如下图

https://z3.ax1x.com/2021/07/11/WCgWex.png

字段的说明:

  1. 硬件类型:占2字节,表示ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
  2. 上层协议类型:占2字节,表示硬件地址要映射的协议地址类型。其中,0x0800表示IP协议
  3. MAC地址长度:占1字节,标识MAC地址长度。
  4. IP地址长度:占1字节,标识IP地址长度。
  5. 操作类型:占2字节,指定本次ARP报文类型。1表示ARP请求报文,2表示ARP应答报。
  6. 源MAC地址:占6字节,表示发送方设备的硬件地址。
  7. 源IP地址:占4字节,表示发送方设备的IP地址。
  8. 目的MAC地址:占6字节,表示接收方设备的硬件地址,在请求报文中该字段值全为0,即00-00-00-00-00-00 表示任意地址,因为现在不知道这个MAC地址。
  9. 目的IP地址:占4字节,表示接收方设备的IP地址。

ARP数据包解读

为了让大家更好的理解ARP协议以及广播和单播的概念,我们来看一下用Wireshark抓取到的真实网络中的ARP过程,通过数据包的方式来呈现,地址信息如下,部分MAC信息隐去。(建议初学者用GNS3配合Wireshark来抓取协议包进行分析,相比真实网络更加干净,方便分析)

[c-alert type=”success”]主机1 <———-> 主机2

主机1: IP1:10.1.20.64       MAC1:00:08:ca:xx:xx:xx

主机2: IP2:10.1.20.109     MAC2:44:6d:57:xx:xx:xx

[/c-alert]

https://z3.ax1x.com/2021/07/11/WCRDxJ.png

[title-plane title=”分析”]

我是主机1<IP1:10.1.20.64,MAC1:00:08:ca:xx:xx:xx>
请问主机2<IP2:10.1.20.109,你的MAC是多少?>
000000空位(留坑),表示询问者不知道,等待接收方回应(填坑)[/title-plane]

https://z3.ax1x.com/2021/07/11/WCRbZt.png

[title-plane title=”分析”]

我是主机2<IP2:10.1.20.109,MAC2:44:6d:57:xx:xx:xx>
你好主机1<IP1:10.1.20.64,MAC1:00:08:ca:xx:xx:xx>

[/title-plane]

【ARP协议字段解读】

Hardware type :硬件类型,标识链路层协议

Protocol type: 协议类型,标识网络层协议

Hardware size :硬件地址大小,标识MAC地址长度,这里是6个字节(48bti)

Protocol size: 协议地址大小,标识IP地址长度,这里是4个字节(32bit)

Opcode: 操作代码,标识ARP数据包类型,1表示请求,2表示回应

Sender MAC address :发送者MAC

Sender IP address :发送者IP

Target MAC address :目标MAC,此处全0表示在请求

Target IP address: 目标IP

参考博文:

https://zhuanlan.zhihu.com/p/28771785