ARP:地址解析协议

地址解析协议 ARP 的原理、攻击与防御学习总结。


  在网络通信中,主机和主机通信的数据包需要依据 OSI 模型从上到下进行数据封装,当数据封装完整后,再向外发出。在网络层上,主机和路由器用逻辑地址来标志,逻辑地址在本地是唯一的,但在全局上不一定。在TCP/IP 协议族中称为 IP 地址,现在常用的版本是 IPv4,长度是 32 位。在链路层上,主机和路由器用他们的物理地址来标志,即 48 位的物理地址,也是是我们通常所说的网卡地址(MAC地址)。

  因此,需要能够将逻辑地址和相应的物理地址之间进行映射,完成这样的映射可以使用静态映射和动态映射:

  • 静态映射:创建一个表,存储逻辑地址和物理地址之间的关联关系,然后将网络上的每个主机都存储这张表。缺点是,映射表必须周期的更新,增加了网络的开销。
  • 动态映射:采用 ARP(Address Resolution Protocol,地址解析协议),它负责完成逻辑地址向物理地址的动态映射,将 32 位逻辑地址(IP地址)转换为 48 位的物理地址(MAC地址)。

ARP 基本原理

  ARP 通过一个查找表(ARP缓存)来执行地址转换的。当在 ARP 缓存中没有找到地址时,则向网络发送一个广播请求,网络上所有的主机和路由器都接收和处理这个 ARP 请求,但是只有相同 IP 地址的接收到广播请求的主机或路由器,发回一个 ARP 应答分组,应答中包含它的 IP 地址和物理地址,并保存在请求主机的 ARP 缓存中。其他主机或路由器都丢弃此分组。

  具体过程如下:

  1. 本地主机在局域网中广播 ARP 请求,ARP 请求数据帧中包含目的主机的 IP 地址,意思是“如果你是这个 IP 地址的拥有者,请回答你的硬件地址”。
  2. 目的主机的 ARP 层解析这份广播报文,识别出是询问其硬件地址。于是发送 ARP 应答包,里面包含 IP 地址及其对应的硬件地址。
  3. 本地主机收到 ARP 应答后,知道了目的地址的硬件地址,之后的数据报就可以传送了。

  注意:点对点链路不使用 ARP 协议。APR 请求包是广播的,但是 ARP 应答帧是单播的。

ARP 高速缓存

  ARP 高效运行的关键是由于每个主机上都有一个 ARP 高速缓存。这个高速缓存存放了最近 Internet 地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。

  常用 ARP 高速缓存操作命令:

  • 缓存查看
1
$ arp -a # 参数-a的意思是显示高速缓存中所有的内容。
  • 缓存清空
1
$ arp -d

代理 ARP

  如果 ARP 请求是从一个网络的主机发往另一个网络上的主机,可能需要经过很多路由器,而路由器隔离广播域,每个接口/网段都是独立的广播域, ARP 请求又是二层广播包,所以 ARP 广播包没法通过过路由器。。因此,网关设备收到此 ARP 请求,会用自己的 MAC 地址返回给请求者,这便是代理 ARP(Proxy ARP)。

  上图中,PC 发送 ARP 请求服务器 8.8.8.8 的 MAC 地址,路由器(网关)收到这个请求时会进行判断,由于目标 8.8.8.8 不属于本网段(即跨网段),此时便返回自己的接口 MAC 地址给 PC,后续电脑访问服务器时,目标 MAC 直接封装为 MAC254。

  实际网络中,无论是同网段还是跨网段通信(例如访问互联网),绝大情况下都是使用正常的 ARP,而不是代理ARP。

  • 代理 ARP 仅仅是正常ARP的一个拓展使用,是可选项而不是必要项;
  • 代理 ARP 有特定的应用场景,与网关/路由的设置有直接关系:当电脑没有网关/路由功能时,并且需要跨网站通信时,则会触发代理 ARP 。换句话说,如果有网关/路由功能,则不需要代理 ARP;
  • 正常环境下,当用户接入网络时,都会通过 DHCP 协议或手工配置的方式得到 IP 和网关信息(所以不需要代理ARP)。

  那么什么时候使用正常 ARP ?什么时候使用代理 ARP 呢?总结如下:

  • 电脑没有网关时,ARP 直接询问目标 IP 对应的 MAC 地址(跨网段),采用代理 ARP;
  • 电脑有网关时,ARP 只需询问网关 IP 对应的 MAC 地址(同网段),采用正常 ARP;
  • 无论是正常 ARP 还是代理 ARP,电脑最终都拿到同一个目标 MAC 地址:网关 MAC。

免费 ARP

  免费 ARP 是指主机发送 ARP 查找自己的 IP 地址,用于检测局域网内的IP地址冲突。免费 ARP 可以有两个方面的作用:

  • 一个主机可以通过它来确定另一个主机是否设置了相同的 IP 地址。
  • 如果发送免费 ARP 的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。

  免费 ARP 的报文发出去是不希望收到回应的,只希望是起宣告作用;如果收到回应,则证明对方也使用自己目前使用的 IP 地址。当电脑检测到自己的IP地址跟其他电脑冲突时,它们会相互发送免费 ARP,用来提醒对方:你的IP地址跟我的冲突啦!冲突方之间可能会一直发送,直到有一边做出让步并修改IP地址(不同系统解决方法不同)。

ARP 攻击与防御

攻击原理

  ARP 欺骗攻击,考虑如下图的情景,在局域网里面,PC1、PC2、PC3三台主机共同连接到交换机 SW1 上面,对应 3 个接口 port 1/2/3。

  PC1 需要跟 PC2 通信,通过 ARP 请求包询问 PC2 的 MAC 地址,由于采用广播形式,所以交换机将 ARP 请求包从接口 P1 广播到 P2 和 PC3。

  PC2 根据询问信息,返回ARP单播回应包;此时 PC3 作为攻击者,没有返回 ARP 包,但是处于“监听”状态,为后续攻击做准备。

  PC1 和 PC2 根据 ARP 问答,将各自的 ARP 映射信息(IP-MAC)存储在本地 ARP 缓存表。

  交换机根据其学习机制,记录 MAC 地址对应的接口信息,存储在 CAM 缓存表(也称为 MAC 地址表)。交换机收到数据包时,会解封装数据包,根据目标 MAC 字段进行转发。

  正常情况下,若收到的 ARP 请求不是给自己的,则直接丢弃;而攻击者 PC3 在监听之后,发起了 ARP 回应包:我就是 PC2(IP2-MAC3)。PC1 收到两个 ARP 回应包,内容分别如下:

  • 我是 PC2,我的 IP 地址是 IP2,我的 MAC 地址是 MAC2;

  • 我是 PC2,我的 IP 地址是 IP2,我的 MAC 地址是 MAC3;

  网络协议里各种表在处理缓存信息的方式要么是”先到先得”,要么”后到优先”。上面提到的 ARP 和 CAM 表,就是遵循”后到优先”原则。因此,作为攻击者,只要持续不停发出 ARP 欺骗包,就一定能够覆盖掉正常的ARP回应包。

  根据数据封装规则,此后,当 PC1 要跟 PC2 进行通信时,无论是发送 PING 包还是发送其他数据,首先要查找 ARP 表,然后在网络层打上源目 IP,在链路层打上源目 MAC,然后将数据包发送给交换机。交换机收到之后对数据进行解封装,并且查看 CAM 表(基于目的 MAC 转发),由于目标 MAC3 对应 Port3,所以交换机自然而然将其转发给 PC3。就这样,PC1 本来要发给 PC2 的数据包,落到了攻击者 PC3 手里,这就完成了一次完整的 ARP 攻击。

防御原理

  ARP攻击的罪魁祸首就是 ARP 欺骗包,处理这种欺骗行为的两个解决方法:

  • 保证电脑不接收欺骗包。

  • 保证电脑收到欺骗包之后不相信。

  ARP防御可以在网络设备上实现,也可以在用户端实现,更可以在网络设备和用户端同时实现。局域网安全里比较常用的 ARP 防御技术被称为DAI(Dynamic ARP Inspection)- 动态ARP检测,原理可以简单概括:

  • 交换机记录每个接口对应的 IP 地址和 MAC,即 port<->mac<->ip,生成 DAI 检测表;

  • 交换机检测每个接口发送过来的 ARP 回应包,根据 DAI 表判断是否违规,若违规则丢弃此数据包并对接口进行惩罚。

  DAI 是目前防御ARP攻击最有效的方法之一,但是大部分能支持这种动态ARP监测技术的交换机或者无线路由器,都基本是企业级的产品。简单的交换机不具备动态ARP监测技术。普通用户(电脑或手机)可以通过安装ARP防火墙做安全防御,可使用360安全卫士、腾讯电脑管家等软件来实现 ARP 攻击的防御。

参考资料:

[1] Fall K R, Stevens W R. TCP/IP illustrated, volume 1: The protocols[M]. addison-Wesley, 2011.

[2] 图解ARP协议(一)

[3] 图解ARP协议(二)ARP攻击篇

坚持原创技术分享,您的支持将鼓励我继续创作!