跳至主要內容

ARP(地址解析协议,Address Resolution Protocol)

LincZero大约 18 分钟

ARP(地址解析协议,Address Resolution Protocol)

参考

概念

一些概念

  • 定义

    • 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
  • 直接作用

    • IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。
  • 大致原理

    • 主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;
  • ARP缓存

    • 收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
  • ARP欺骗

    • 是一种非常不安全的协议。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;这就有可能产生ARP欺骗或ARP攻击
  • IPV6问题

    • ARP(地址解析协议,Address Resolution Protocol):只用于IPV4,IPV6不用这个
    • NDP(邻居发现协议,Neighbor Discovery Protocol):这个是IPV6使用的

沟通L2和L3

大家都知道,OSI模式把网络工作分为七层,彼此不直接打交道,只通过接口 (layre interface).

IP地址在第三层(网络层), MAC地址在第二层(数据链路层)。协议在发送数据包时,首先要封装第三层(IP地址)和第二层 (MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务拿到MAC地址。

OSI定位问题

ARP应该是L2层还是L3层有争议(OSI模型中有很多协议都是这样,可A层可B层的,ICMP也是)

从使用信息的角度看是L2,从作用的角度看是L3 (打通L3和L2)

维基中特别提到了这点:

地址解析协议#协议的分层open in new window

ARP协议在互联网协议包open in new windowOSI模型open in new window的位置可能会造成混乱和争议。 在 RFCopen in new window 1122open in new window 仅仅在数据链路层open in new window提及ARP协议当并未说明将此协议置于该层[2]open in new window。 一些较旧的文档将ARP置于OSI的数据链路层open in new window[3]open in new window,但是一些新的版本却将其与网络层open in new window联系起来。[4]open in new window

工作过程

工作过程

假设主机A和B在同一个网段,主机A要向主机B发送信息,具体的地址解析过程如下:

  1. 主机A -> 主机B:

    • 主机A首先检查自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。

    • 如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装并发送给主机B。并跳过后续步骤

    • 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文

      该请求报文中

      • 发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址

      • 目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址

      由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。

  2. 主机B <- 主机A:

    • 主机B更新ARP缓存表:比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。
    • 之后以单播方式发送ARP响应报文给主机A,即ARP应答,其中包含了自己的MAC地址。
  3. 主机A <- 主机B:

    • 主机A收到ARP响应报文后,更新ARP缓存表,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发。
    • 同时将IP数据包进行封装并发送出去。

跨网段

当主机A和主机B不在同一网段时,有一些不同:

  1. 主机A -> 网关

    • 检查ARP表,如果有主机B的ARP表项,则直接发。并跳过后续步骤

    • 主机A会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。

      当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。

  2. 网管 <- 主机A

    • 检查ARP表,如果有主机B的ARP表项,则直接发。并跳过后续步骤

    • 如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址

      当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文给主机B;

补充:如果目标设备位于其他网络则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。

ARP缓存表和TTL

ARP表 / ARP缓存

几个不同的叫法:ARP表 / ARP缓存 (ARP Cache) / ARP缓存表。而缓存的过程又叫ARP表的学习

网络设备一般都有一个ARP缓存(除了收发设备有,路由网关自己也会有),ARP缓存用来存放IP地址和MAC地址的关联信息。

  • 在发送数据前,设备会先查找ARP缓存表。
    • 如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。
    • 如果缓存表中不存在相应的信息,则通过发送ARP request报文来获得它。
  • 学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间
    • 在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。
    • 过了这段有效期,ARP表现会被自动删除。

ARP表项又分为:

  • 动态ARP表项
  • 静态ARP表项
    • 长静态ARP表项
    • 短静态ARP表项

动态ARP表项、静态ARP表项

特点

  • 动态ARP表项

    • 由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖

      一般情况下,ARP动态执行并自动寻求IP地址到以太网MAC地址的解析,无需管理员的介入。

  • 静态ARP表项

    • 通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。直到重新启动计算机为止。
    • 配置静态ARP表项可以增加通信的安全性。静态ARP表项可以限制和指定IP地址的设备通信时只使用指定的MAC地址,此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间的正常通信。

动态ARP - 生命周期 (老化机制)

新加到缓存中的项目带有时间戳,每个动态ARP缓存项的潜在生命周期是10分钟

如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除;

如果某个项目已在使用,则又收到2分钟的生命周期;如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。

静态ARP - 短静态ARP表项的配置

静态ARP表项分为短静态ARP表项和长静态ARP表项:

  • 配置项:只需要配置IP地址和MAC地址项。
    • 如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发;
    • 如果出接口是VLAN虚接口,短静态ARP表项不能直接用于报文转发,当要发送IP数据包时,先发送ARP请求报文,如果收到的响应报文中的源IP地址和源MAC地址与所配置的IP地址和MAC地址相同,则将接收ARP响应报文的接口加入该静态ARP表项中,之后就可以用于IP数据包的转发
  • 选用:当希望设备和指定用户只能使用某个固定的IP地址和MAC地址通信时,可以配置短静态ARP表项

静态ARP - 长静态ARP表项的配置

  • 配置项:除了配置IP地址和MAC地址项外,还必须配置该ARP表项所在VLAN和出接口。长静态ARP表项可以直接用于报文转发
  • 选用:当进一步希望限定这个用户只在某VLAN内的某个特定接口上连接时,可以配置长静态ARP表项

ARP报文格式

在局域网中,当主机或其它网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过物理网络发送,因此发送站还必须有接收站的物理地址,所以需要一个从IP地址到物理地址的映射。APR就是实现这个功能的协议。

ARP协议是通过报文进行工作的,是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议(如以太网协议)进行封装。

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

下图中,前面Ethernet Address of destination、Ethernet Address of sender、Frame Type 属于数据链路层的封装,往后的就是真正的ARP报文数据结构。

img
img

ARP请求

下面是Wireshark抓的ARP请求报文,大家可以看到:

  • 数据链路层的 Ethernet Address of destination是全ff,说明这是一个广播包,是为了获取指定IP的MAC地址
  • 可以看到ARP包中的Target IP address是192.168.0.7
  • 但Target MAC address是全0,说明当前还不知道目标主机的MAC地址
  • Opcode为1,说明这是一个ARP请求报文
img
img

ARP响应

下面是Wireshark抓的ARP响应报文,大家参照上面的报文格式解析一下咯:

img
img

免费ARP

免费 ARP(Gratuitous ARP)包是一种特殊的ARP请求。 它并非期待得到IP对应的 MAC 地址,而是当主机启动的时候,发送一个 Gratuitous ARP请求,即请求自己的IP地址的MAC地址

img
img

与普通ARP的区别:(在于报文中的目标IP地址)

  • 普通ARP报文中的目标IP地址是其他主机的IP地址
  • 而免费ARP的请求报文中,目标IP地址是自己的IP地址。

三个作用:

  • 该类型报文起到一个宣告作用。它以广播的形式将数据包发送出去,不需要得到回应,只为了告诉其他计算机自己的IP地址和MAC地址。
  • 可用于检测IP地址冲突。当一台主机发送了免费ARP请求报文后,如果收到了ARP响应报文,则说明网络内已经存在使用该IP地址的主机。
  • 可用于更新其他主机的ARP缓存表。如果该主机更换了网卡,而其他主机的ARP缓存表仍然保留着原来的MAC地址。这时,可以发送免费的 ARP数据包。其他主机收到该数据包后,将更新ARP缓存表,将原来的 MAC地址替换为新的MAC地址。

其他用途

ARP代理

当局域网内部主机发起跨网段的ARP请求时,出口路由器/网关设备将自身MAC地址回复该请求时,这个过程称为代理ARP。(eg:1.没有路由功能的主机;2.有路由功能,目的地指向本地出口)

地址解析协议工作在一个网段中,而代理ARP(Proxy ARP,也被称作混杂ARP(Promiscuous ARP))工作在不同的网段间,其一般被像路由器这样的设备使用,用来代替处于另一个网段的主机回答本网段主机的ARP请求。

例如,主机PC1(192.168.20.66/24)需要向主机PC2(192.168.20.20/24)发送报文,因为主机PC1不知道子网的存在且和目标主机PC2在同一主网络网段,所以主机PC1将发送ARP协议请求广播报文请求192.168.20.20的MAC地址。这时,路由器将识别出报文的目标地址属于另一个子网(注意,路由器的接口IP地址配置的是28位的掩码),因此向请求主机回复自己的硬件地址(0004.dd9e.cca0)。之后,PC1将发往PC2的数据包都发往MAC地址0004.dd9e.cca0(路由器的接口E0/0),由路由器将数据包转发到目标主机PC2。(接下来路由器将为PC2做同样的代理发送数据包的工作)。代理ARP协议使得子网化网络拓扑对于主机来说是透明的(或者可以说是路由器以一个不真实的PC2的MAC地址欺骗了源主机PC1)。

ARP欺骗

地址解析协议是建立在网络中各个主机互相信任的基础上的,它的诞生使得网络能够更加高效的运行,但其本身也存在缺陷:

ARP地址转换表是依赖于计算机中高速缓冲存储器动态更新的,而高速缓冲存储器的更新是受到更新周期的限制的,只保存最近使用的地址的映射关系表项,这使得攻击者有了可乘之机,可以在高速缓冲存储器更新表项之前修改地址转换表,实现攻击。ARP请求为广播形式发送的,网络上的主机可以自主发送ARP应答消息,并且当其他主机收到应答报文时不会检测该报文的真实性就将其记录在本地的MAC地址转换表,这样攻击者就可以向目标主机发送伪ARP应答报文,从而篡改本地的MAC地址表。ARP欺骗可以导致目标计算机与网关通信失败,更会导致通信重定向,所有的数据都会通过攻击者的机器,因此存在极大的安全隐患。

「防御措施」

  • 不要把网络安全信任关系建立在IP基础上或MAC基础上(RARP同样存在欺骗的问题),理想的关系应该建立在IP+MAC基础上。
  • 设置静态的MAC-->IP对应表,不要让主机刷新设定好的转换表。
  • 除非很有必要,否则停止使用ARP,将ARP做为永久条目保存在对应表中。
  • 使用ARP服务器。通过该服务器查找自己的ARP转换表来响应其他机器的ARP广播。确保这台ARP服务器不被黑。
  • 使用“proxy”代理IP的传输。
  • 使用硬件屏蔽主机。设置好路由,确保IP地址能到达合法的路径(静态配置路由ARP条目),注意,使用交换集线器和网桥无法阻止ARP欺骗。
  • 管理员定期用响应的IP包中获得一个RARP请求,然后检查ARP响应的真实性。
  • 管理员定期轮询,检查主机上的ARP缓存。
  • 使用防火墙连续监控网络。注意有使用SNMP的情况下,ARP的欺骗有可能导致陷阱包丢失。
  • 若感染ARP病毒,可以通过清空ARP缓存、指定ARP对应关系、添加路由信息、使用防病毒软件等方式解决。

ARP攻击

ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的进行。基于ARP协议的这一工作特性,黑客向对方计算机不断发送有欺诈性质的ARP数据包,数据包内包含有与当前设备重复的Mac地址,使对方在回应报文时,由于简单的地址重复错误而导致不能进行正常的网络通信,或者如果不及时处理,便会造成网络通道阻塞、网络设备的承载过重、网络的通讯质量不佳等情况。。

一般情况下,受到ARP攻击的计算机会出现两种现象:

  1. 不断弹出“本机的XXX段硬件地址与网络中的XXX段地址冲突”的对话框。
  2. 计算机不能正常上网,出现网络中断的症状。

因为这种攻击是利用ARP请求报文进行“欺骗”的,所以防火墙会误以为是正常的请求数据包,不予拦截。因此普通的防火墙很难抵挡这种攻击。

ARP 是一种非常不安全的协议,目前已经有很多涉及 ARP 的攻击,最主要的就是使用代理 ARP 功能假扮主机,对 ARP 请求作出应答,通过伪造 ARP 数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害。

ARP 主要攻击方式分为下面这几种:

  • ARP 泛洪攻击:通过向网关发送大量 ARP 报文,导致网关无法正常响应。首先发送大量的 ARP 请求报文,然后又发送大量虚假的 ARP 响应报文,从而造成网关部分的 CPU 利用率上升难以响应正常服务请求,而且网关还会被错误的 ARP 缓存表充满导致无法更新维护正常 ARP 缓存表,消耗网络带宽资源。
  • ARP 欺骗主机攻击:ARP 欺骗主机的攻击也是 ARP 众多攻击类型中很常见的一种。攻击者通过 ARP 欺骗使得局域网内被攻击主机发送给网关的流量信息实际上都发送给攻击者。主机刷新自己的 ARP 使得在自己的ARP 缓存表中对应的 MAC 为攻击者的 MAC,这样一来其他用户要通过网关发送出去的数据流就会发往主机这里,这样就会造成用户的数据外泄。
  • 欺骗网关的攻击: 欺骗网关就是把别的主机发送给网关的数据通过欺骗网关的形式使得这些数据通过网关发送给攻击者。这种攻击目标选择的不是个人主机而是局域网的网关,这样就会攻击者源源不断的获取局域网内其他用户韵数据.造成数据的泄露,同时用户电脑中病毒的概率也会提升。
  • 中间人攻击: 中间人攻击是同时欺骗局域网内的主机和网关,局域网中用户的数据和网关的数据会发给同一个攻击者,这样,用户与网关的数据就会泄露。
  • IP地址冲突攻击: 通过对局域网中的物理主机进行扫描,扫描出局域网中的物理主机的 MAC 地址,然后根据物理主机的 MAC 进行攻击,导致局域网内的主机产生 IP 地址冲突,影响用户的网络正常使用。