浅谈 ARP

1、概述

ARP 的全称是 Address Resolution Protocol,即地址解析协议,由 RFC826 定义。正如 RFC 中描述的那样,ARP 的作用是将网络协议地址转换为 48 bit 的以太网地址,以便在以太网设备中传输数据包。

2、为什么需要 ARP ?

在 TCP/IP 协议中,主机与主机之间的网络通信,需要基于两个网络地址来实现:

  • IP 地址(Internet Protocol Address):在三层网络中,主机之间通过 IP 地址来建立逻辑通信路径。例如,ping 使用的是 IP 地址,访问某个网络服务,也是使用 IP 地址。
  • MAC 地址(Media Access Control Address):在二层网络中,主机将实际的数据包封装在以太网帧,并且在帧头封装上源和目标的 MAC 地址。

ARP 的工作,就是将 IP 地址转换为 MAC 地址,以完成网络数据传输。

3、ARP 的报文格式

ARP 的报文格式如下:

image

前 14 个字节是通用的以太网首部,分别表示目标以太网地址、源以太网地址和帧类型。ARP 的帧类型是 0x0806。

后 28 个字节则是 ARP 的报文内容:

  • 硬件类型:如以太网(0x0001)。
  • 协议类型:如 IP 协议(0x0800)。
  • 硬件地址长度:硬件地址的字节长度,如以太网为 6。
  • 协议地址长度:协议地址的字节长度,如 IPv4 为 4。
  • 操作码:如 1 为 ARP 请求,2 为 ARP 应答,具体的操作码定义见 https://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml。
  • 源硬件地址:n 个字节(n 由硬件地址长度指定),一般为发送方 MAC 地址。
  • 源协议地址:m 个字节(m 由协议地址长度指定),一般为发送方 IP 地址。
  • 目标硬件地址):n 个字节(n 由硬件地址长度指定),一般为目标 MAC 地址。
  • 目标协议地址:m 个字节(m 由协议地址长度指定),一般为目标 IP 地址。

4、ARP 的应用

4.1、ARP 的基本行为

ARP 的基本行为可以概括如下:

  1. 当一个设备接收到一个 ARP 报文(无论是请求还是应答),都会从 ARP 的源硬件地址和源协议地址学习到 IP 地址到 MAC 地址的对应关系。
  2. 任何设备只会处理目标协议地址与本机 IP 地址一致的 ARP 报文。
  3. 对于一个 ARP ,单播还是广播,由以太网首部中的目标以太网地址决定,而非以太网报文内容中的目标硬件地址。

4.2、ARP 如何在二层网络获取其他主机的 MAC 地址?

假设在一个二层网络中存在设备 A 和设备 B,IP 地址分别为 10.0.0.1 和 10.0.0.2。当设备 A 想要 ping 设备 B 时,为了完成 ICMP 报文的封装,设备 A 需要知道设备 B 的 MAC 地址。因此,设备 A 会首先查找了本地的 ARP 缓存表,如果表中存在设备 B 的 IP 地址(10.0.0.2)所对应的 MAC 地址,则直接使用这个地址来封装报文;如果查找不到,设备 A 则发出一个 ARP 请求,这个 ARP 报文的字段如下:

  • 源以太网地址和源硬件地址等于设备 A 的 MAC 地址;
  • 源协议地址等于设备 A 的 IP 地址;
  • 目标以太网地址等于广播地址,即 FF:FF:FF:FF:FF:FF;
  • 目标硬件地址等于 0,表示不知道设备 B 的 MAC 地址;
  • 目标协议地址等于设备 B 的 IP 地址;
  • 操作码等于 1,表示 ARP 请求。

由于目标以太网地址等于广播地址,整个二层网络中的所有设备都接收到了这个 ARP 请求报文。从上文的“ARP 的基本行为”章节中得知,只有目标协议地址等于本机 IP 地址的 ARP 报文,才会被目标设备处理,所以只有设备 B 在接收到这个 ARP 请求后,会发送一个 ARP 应答报文。其余设备都会在接收到这个 ARP 报文之后丢弃。设备 B 发出的 ARP 应答报文的字段如下:

  • 源以太网地址和源硬件地址等于设备 B 的 MAC 地址;
  • 源协议地址等于设备 B 的 IP 地址;
  • 目标以太网地址和目标硬件地址等于设备 A 的 MAC 地址;
  • 目标协议地址等于设备 A 的 IP 地址;
  • 操作码等于 2,表示 ARP 应答。

4.2.1、ARP 缓存

上文提到 ARP 缓存。如果每次封装以太网帧都需要先发送 ARP 请求,则会导致无谓的带宽浪费。ARP 缓存则是解决方案。从上文的“ARP 的基本行为”章节中得知,当一个设备接收到一个 ARP 报文,都会从 ARP 的源硬件地址和源协议地址学习到 IP 地址到 MAC 地址的对应关系。根据 RFC826,设备在学习到这个对应关系后,都必须更新 ARP 缓存表中的相应记录。

在 Linux 上可以通过 arp -aip neigh 查看 ARP 缓存表:

$ arp -a
? (10.0.2.3) at 08:00:27:2b:c5:8a [ether] on enp0s3
? (192.168.107.1) at 0a:00:27:00:00:04 [ether] on enp0s8
? (10.0.2.1) at 52:54:00:12:35:00 [ether] on enp0s3
$ ip neighbor 
10.0.2.3 dev enp0s3 lladdr 08:00:27:2b:c5:8a STALE
192.168.107.1 dev enp0s8 lladdr 0a:00:27:00:00:04 REACHABLE
10.0.2.1 dev enp0s3 lladdr 52:54:00:12:35:00 REACHABLE

4.3、ARP 欺骗

从 ARP 报文格式和工作过程可知,ARP 并没有安全认证机制。假设在一个二层网络中,攻击者在接收到其他设备发出的 ARP 请求之后,会将本机的 MAC 地址封装为源硬件地址,并作为 ARP 应答发送回去。那么,这个二层网络的所有数据包都会发到攻击者所在的设备上。这就是 ARP 欺骗(ARP spoofing)。

4.4、代理 ARP

代理 ARP(proxy ARP) 与 ARP 欺骗的原理相似,不同的是,攻击者变成了安全可靠的网关设备,该设备负责这个二层网络与其他网络之间的代理转发。

4.5、Inverse ARP 和 Reverse ARP

Inverse ARP 由 RFC2390 定义,作用与 ARP 相反,使用 MAC 地址来查找 IP 地址。

Reverse ARP 则是用于在主机启动时,访问局域网内的 RARP 服务器以获取自身的 IP 地址。RARP 已被 DHCP 取代。

4.6、免费 ARP

免费 ARP 即 Gratuitous ARP,又叫做无故 ARP,是指无故地发送一个 ARP(无故是指既不是为了请求 MAC 地址,也不是为了应答)。

从上文的“ARP 的基本行为”章节中得知,当一个设备接收到一个 ARP 报文,都会从 ARP 的源硬件地址和源协议地址学习到 IP 地址到 MAC 地址的对应关系。GARP 正式利用了这一特性,通过发送一个无故的 ARP 报文来通知其他设备自己的 IP 地址和 MAC 地址的对应关系。典型的应用场景就是 VRRP,在虚拟 IP 发生切换后,设备则通过 GARP 来通知虚拟 IP 当前所对应的 MAC 地址。

GARP 的特征是:

  1. 源协议地址和目标协议地址必须一致,这是 GARP 最本质的特征。
  2. 可以通过 ARP 请求和 ARP 响应来实现。

4.7、ARP 探测

ARP 探测(ARP probe)用于检测一个二层网络中是否存在 IP 冲突。假设一个设备在上线前,为了避免网络中是否存在一个具有相同 IP 地址的设备,则可以通过发出 ARP 探测报文来进行探测。

ARP probe 的特征是:

  1. 源协议地址等于 0.0.0.0,表示这是一个无效的 ARP 请求,目的是不让其他接收到 ARP probe 报文的设备更新 IP 地址与 MAC 地址的对应关系。
  2. 目标协议地址等于需要探测的 IP 地址。
  3. 目标以太网地址等于广播地址。

如果网络中存在与目标协议地址相同 IP 的设备,在接收到 ARP probe 之后,该设备则会发送一个 ARP 应答,那么源设备也就知道了网络中存在一个具有相同 IP 地址的设备。

4.8、ARP 在 SDN 中的应用

设备在与其他设备进行网络通信时,第一步就是发送 ARP 广播。然而,如果在一个大二层网络中,这种 BUM 流量(Broadcast/广播、Multicast/多播、Unknown Unicast/未知单播)可能会导致过多的网络带宽消耗。因此需要对 ARP 请求进行抑制和代答。

在 SDN 网络中,如果需要屏蔽某些 ARP 请求,控制平面可以为数据平面下发以下流表:

arp,op_code=1,arp_spa=26.0.0.1,arp_tpa=26.0.0.2 actions=drop

这条流表将会匹配源协议地址为 26.0.0.1、目标协议地址为 26.0.0.2 的 ARP 请求,然后将其丢弃,从而实现将 ARP 请求抑制在某个网络范围内。

如果需要对某些 ARP 请求进行代答,可以为数据平面下发以下流表:

arp,op_code=1,arp_spa=26.0.0.1,arp_tpa=26.0.0.2 actions=load:0x8002756e718->NXM_OF_ETH_DST[],load:0x800278d1377->NXM_OF_ETH_SRC[],load:0x2->NXM_OF_ARP_OP[],load:0x8002756e718->NXM_NX_ARP_THA[],load:0x800278d1377->NXM_NX_ARP_SHA[],load:0x1a000001->NXM_OF_ARP_TPA[],load:0x1a000002->NXM_OF_ARP_SPA[],IN_PORT

同样,这条流表将会匹配源协议地址为 26.0.0.1、目标协议地址为 26.0.0.2 的 ARP 请求,然后重新设置源和目标以太网地址、源和目标硬件地址、源和目标协议地址以及操作码,将请求报文修改为 ARP 代答报文,然后回送到输入端口,从而实现了 ARP 代答。

5、总结

本文介绍了 ARP 的报文格式和工作过程,并列举了 ARP 的常见应用场景。特别是在 SDN 网络中,如果对 ARP 的代答和抑制逻辑设计得当,将有效减少 BUM 流量。

参考资料

  1. https://www.geeksforgeeks.org/arp-reverse-arprarp-inverse-arp-inarp-proxy-arp-and-gratuitous-arp/
  2. https://zhuanlan.zhihu.com/p/26701077

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注