TCP/IP之ARP详解

1. ARP概述

     地址解析协议(ARP-Address Resolution Protocol )是一种网络协议,用于从IP地址中查找主机的硬件(MAC)地址。在以太网局域网上使用ARP是因为希望相互通信的主机需要知道它们各自的MAC地址。这是一个请求-应答协议;ARP请求消息用于请求MAC地址,而ARP应答消息用于发送请求的MAC地址。

     以太网 (Ethernet) 网络中的主机只有知道主机的以太网地址(MAC地址),才能与该主机通信。 像IP这样的高级协议使用了一种不同于像MAC地址这样的低级硬件寻址方案。 ARP用于从主机的IP地址获取主机的以太网地址。 ARP被以太网网络中的所有主机广泛使用。以太网中数据链路驱动程序从不去检查IP数据包中的目的IP地址。
在这里插入图片描述
     ARP提供了IP地址到对应MAC地址之间的动态映射,这个过程用户是不感知的。
     

2. ARP首部结构

     ARP(地址解析协议)的首部结构图如下所示。
在这里插入图片描述

     Hardware Type: ARP消息中的“硬件类型”字段指定硬件的类型,用于本地网络传输地址解析协议(ARP)信息。以太网是常见的硬件类型,它的值为1。这个字段的大小是2字节。更多关于“硬件类型”的功能请参考 Address Resolution Protocol (ARP) Parameters

     Protocol Type: 每个协议都被分配一个用于该字段的数字。IPv4是0x0800。更多关于“协议类型(Protocol Type)”的功能请参考 Address Resolution Protocol (ARP) Parameters

     Hardware Address Length: ARP消息中的硬件地址长度是以字节为单位的硬件(MAC)地址长度。以太网MAC地址是6字节长。

     Protocol Address Length: 逻辑地址(IPv4地址)的长度(以字节为单位)。IPv4地址有4个字节长。

     Operation: 操作码,该字段用来说明ARP数据包是请求数据包还是应答数据包和地址解析协议类型(ARP/RARP)。RARP是RAP的一个逆向过程,旨在让某个主机从数据链路层获取网络地址IP的过程。ARP和RARP的操作码及对应操作类型如下:
     1-ARP请求; 2-ARP应答; 3-RARP请求; 4-RARP应答。

     Sender Hardware Address: 源主机硬件地址(MAC)。

     Sender Protocol Address: 源主机协议(IP)地址。

     Target Hardware Address: 目标主机硬件地址(MAC)。ARP请求数据包中该字段被忽略,置为0.

     Target Protocol Address: 目的主机协议(IP)地址。
     

     ARP包被直接封装到数据链路帧中。如下图所示,一个ARP包封装在一个以太网帧中。请注意,type字段表示由帧携带的数据是ARP包

在这里插入图片描述
                    图片来自 Address Resolution Protocol (ARP)

     

3. ARP工作原理

3.1 MAC硬件地址

     一个MAC地址由六个十六进制数组成。可能的最高十六进制数是FF:FF:FF:FF:FF:FF,之间用冒号分隔,它是广播地址。前3个字节表示网卡制造商的唯一标识,后3个字节是网卡制造商分配给网络适配器(NIC,NIC本质上是一种计算机电路卡,可让您的计算机连接到网络。NIC将数据转换为可以通过网络传输的电信号)的唯一ID序列号,常见的著名网卡制造商有 Dell, Belkin, Nortel 和 Cisco。比如MAC地址:98:8b:0a:db:76:6b, 前三个8位组“98:8b:0a”表示该网卡的制造商,后面三个8位组(db:76:6b)表示该网络适配器的唯一序列ID。

     一些著名网卡制造商的“组织唯一标识”ID如下:
          Dell:    00-14-22
          Nortel:  00-04-DC
          Cisco:   00-40-96
          Belkin: 00-30-BD

     每个NIC都有一个称为MAC的硬件地址,用于媒体访问控制。IP地址与TCP/IP(网络软件)相关联时,MAC地址链接到网络适配器的硬件。制造时,会将MAC地址分配给网络适配器。它被硬连线或硬编码到计算机的网络接口卡(NIC)上,并且是唯一的。称为ARP(地址解析协议)的东西将IP地址转换为MAC地址。ARP就像通行证一样,通过实际的计算机硬件从IP地址获取数据(参考 WhatIsMyIPAddress )。

     MAC地址也是有可能重复出现的,因为一些制造商已经开始重新使用它们的号码。这通常不是一个问题,因为相同MAC地址的复制品几乎从不出现在同一个网络上。有些卡允许你通过使用特殊的软件或方式来更改MAC地址(可参考 How do I change my MAC address?)。

3.2 ARP缓存

     每一次的网络通信,应用层的数据都需要经过从应用层到物理层的封装步骤,即数据链路层在封装数据帧的时候都需要用到目的MAC地址信息。如果每次通信都需要广播一个ARP请求,那么对网络压力、带宽、设备性能都会有很大的影响,毕竟整个设备(服务器)还有太多的东西跑。为了降低因广播ARP请求获取目的设备MAC地址对网络压力的影响,每台IP主机在自己内存中维护了一个ARP缓冲区。类似一张表,该缓冲区记录了各IP地址与其对应的MAC地址信息间的映射关系,可动态添加和删除

     使用命令: arp -a 可以获取当前设备的ARP缓冲表。

|-------IP-----------|------MAC-------|---网卡绑定模式---|
? (10.66.114.4) at 38:ad:be:c1:15:b0 [ether] on bond0
? (10.66.114.11) at 74:ea:c8:a7:80:b2 [ether] on bond0
? (10.254.254.19) at <incomplete> on ens2
gateway (10.66.114.254) at ac:74:09:66:be:e7 [ether] on bond0
? (10.254.254.9) at <incomplete> on ens2
? (10.254.254.18) at <incomplete> on ens2
? (10.254.254.8) at <incomplete> on ens2
.................
? (10.254.254.1) at 00:00:23:34:45:01 [ether] on ens2
? (10.254.254.20) at <incomplete> on ens2
? (10.66.114.253) at 70:4d:7b:33:9d:d1 [ether] on bond0
? (10.66.114.10) at 74:ea:c8:a7:7c:f2 [ether] on bond0
? (10.254.254.10) at <incomplete> on ens2

     ARP缓冲区支持系列手动的操作,比如手动添加一个IP地址和对应的MAC地址信息,手动删除一个ARP缓冲数据等。详情 arp --help.

     若想手动删除一个指定IP的ARP缓存信息,则使用 “arp -d 指定ip”。

arp -d 指定IP 
如: arp -d 10.66.114.115, 该指定执行结束,ARP内存缓冲区中将移除该ARP缓存信息

     若要手动添加一个指定IP的ARP缓存映射信息,则使用“arp -s ip MAC”

[root@Thor tcpdump]# arp -s 10.66.114.117 98:8b:0a:db:76:9f
//当添加成功之后,再次使用 arp -a 可查看到ARP缓冲区信息中有10.66.114.117IP的对应MAC映射信息
[root@Thor tcpdump]# arp -a
............................
............................
? (10.66.114.117) at 98:8b:0a:db:76:9f [ether] PERM on bond0

3.2.1 ARP静态缓存

     ARP缓冲区有动态和静态两种类型之分。对于静态ARP缓存,地址解析被手动添加(即arp -s IP MAC)到设备的缓存表,并永久保存在缓存中(2020/04/07补充: 除非在末尾加上temp. 即 arp -s IP MAC temp)。我在115设备上面手动添加了117设备(即设备ip是xx.xx.xx.117)IP到MAC地址映射,确认是永久生效

3.2.2 ARP动态缓存

     广播的ARP请求,在收到响应之后,会将其目的IP和MAC映射关系存储到ARP内存缓冲区中,保留一段时间再进行刷新(删除)。ARP缓存区可同时包括“静态缓存”和“动态缓存”。
     

3.3 ARP如何工作

     ARP的功能是通过向同一个局域网(若在另外一个网络,则需要路由表的加入)广播一个ARP请求,以获得通信目的主机的MAC(硬件地址)信息。

     它的主要流程如下:
     1. 本机ARP内存缓冲区中查找目标IP主机的MAC信息;
     2. 若找到,则直接使用,反之则执行流程3.
     3. 广播一条ARP请求报文,等待响应,并解析ARP报文且将对应IP地址和MAC地址映射到缓存中。

     通常局域网(LAN)中并不会仅仅只有几台设备,多数情况下,都是成百上千台设备的。为了简化流程,用下图中的五台设备来充当若干台主机设备,其实无论两台还是若干台,其原理实现过程是一样的。

在这里插入图片描述
     现假设主机PC5需要和主机PC2进行通信,但是主机PC5不知道主机PC2的MAC地址,所以需要广播ARP请求,以获取对应主机的MAC地址。首先主机PC5会在自身ARP缓存区内存中查找是否有IP为10.66.114.117的主机MAC地址,若找到,则直接使用,就不必发送ARP广播请求。反之,则需要广播一条ARP请求报文,位于该局域网(LAN)上的其他主机(本处只有:PC1、PC2、PC3、PC4)都会收到来自主机PC5的广播数据,这些主机在收到请求数据包之后,解析并查看其中的目的IP地址信息是否和本身的IP对应,若不是,则丢失该包并忽略(即不回应该请求);反之,则解析包并获取源IP+源MAC信息,并将这些必要信息组包(填充本机的IP和MAC数据)响应给发送ARP请求的主机PC5(只有对应的目的主机IP才会响应请求消息)。

     PC5主机在收到来自PC2主机的响应之后,解析出其中的IP和MAC,并将其存入自己的ARP内存缓冲区中,以便下次通信响应。为了节省内存空间和降低维护成本,ARP缓冲区中的每条数据都是有生命周期的,默认记录2min中(120s),之后便删除掉。避免维护一些长时间不通信使用的ARP缓存信息。

     这里仍以 TCP/IP之传输层详解 中的客户端、服务端代码作为演示。其中10.66.114.115设备是服务端,10.66.114.95是客户端,我们先手动清楚掉两台设备上面的对应ARP缓存内存信息(10.66.114.95, arp -d 10.66.114.115,10.66.14.115,arp -d 10.66.114.95)。

     先启动115上的服务进程,然后tcpdump在该设备上面开启抓包,同时在95设备上面开启客户端进程。
在这里插入图片描述
     将tcpdump抓包得到的文件使用Wireshark打开,通过显示过滤器(手动输入过滤条件)来筛选出本次通信中的各请求交互过程如下图所示:
在这里插入图片描述
     因为ARP缓存中的信息已被手动清除,所以在建立握手前,需要获取目的主机的MAC地址,之后并开始握手连接和通信,然后再关闭连接。

     下图是广播ARP请求的首部信息。ARP请求数据包中包括: 源硬件(MAC)地址、源IP(协议)地址、目的IP(协议)地址。目的(标)硬件地址(MAC)字段全部设置为0,指明其信息是未知的。
在这里插入图片描述

     
     下图是ARP的响应数据包首部结构图信息,可以看到在响应报文中,目的主机115已经将其自身的MAC地址填充到对应的首部结构字段中。
在这里插入图片描述
     Wireshark中关于显示过滤器筛选ARP的相关字段请求参考: Display Filter Reference: Address Resolution Protocol

     ARP在响应其请求时,仅回复请求主机(本例中PC5)的单播消息,而不是广播给同一局域网(LAN)中的所有主机。一些消息来源提到ARP是第2层协议,而另一些消息来源则把ARP放在第3层。
在这里插入图片描述
                              来自 GEEK UNIVERSITY

     所有与ARP相关的问题,都可以在 ARP - Q&A 找到答案。

     IP引入的这个额外的地址解析协议(ARP),它用于在MAC帧中的目标硬件地址和IP网络地址之间进行映射。从ARP所处TCP/IP协议族看,它是属于数据链路层。

在这里插入图片描述
                              图片来自 IPv4 over Ethernet
     

3.4 ARP使用情形

     下面是可以使用ARP服务的四种不同情况:

     1. 发送方是一个主机,希望将数据包发送到同一网络上的另一个主机.在这种情况下,必须映射到物理地址的逻辑地址是数据报头中的目标IP地址。

     2. 发送方是一个主机,希望将数据包发送到另一个网络上的另一个主机。主机查看它的路由表,并查找此目的地的下一跳(路由器)的IP地址。如果没有路由表,则查找默认路由器的IP地址。路由器的IP地址成为必须映射到物理地址的逻辑地址。

     3. 发送者是一个路由器,它接收了一个发送到另一个网络主机的数据报。它检查它的路由表并找到下一个路由器的IP地址。下一个路由器的IP地址成为必须映射到物理地址的逻辑地址。

     4. 发送者是一个路由器,它接收到一个数据报,目的地是同一网络中的一个主机。数据报的目标IP地址成为必须映射到物理地址的逻辑地址。

     如图所示:
在这里插入图片描述
                    图片来自 Address Resolution Protocol (ARP)

     比如一个IP地址为130.23.43.20和物理地址为B2:34:55:10:22:10的主机有一个数据包要发送给另一个IP地址为130.23.43.25和物理地址为A4:6E:F4:59:83:AB的主机(这是第一个主机所不知道的)。这两个主机在同一个以太网中。显示封装在以太网帧中的ARP请求和应答包。
在这里插入图片描述
                    图片和示例来自 Address Resolution Protocol (ARP)

     

4. ARP攻击

     也被称为ARP中毒路由(APR)或ARP缓存中毒,一种攻击以太局域网的方法,通过更新目标计算机的ARP缓存,同时使用伪造的ARP请求和应答包,努力改变第2层以太网MAC地址(即,网卡的地址)发送到攻击者可以监视的地址。由于ARP应答是伪造的,目标计算机首先向攻击者的计算机发送原本要发送给原始目的地的帧,以便读取帧。一个成功的APR尝试对用户来说是不可见的。

     具体ARP欺骗原理和防备参考 基于ARP协议的欺骗及其预防
     

5. 总结

     本节对ARP的定义、首部结构图和功能作了比较详细的说明,同时对其工作原理作了简要剖析,说明ARP使用的场景和方式。也提到了ARP协议欺骗大致原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章