ARP (Address Resolution Protocol) 地址解析协议,位于 TCP/IP 协议栈中的链路层。

当局域网内主机间(或者是主机与网关间)需要通信时,通过使用 ARP 协议获取目标 IP 地址所对应的硬件 MAC 地址,然后在主机间通过 MAC 地址来完成数据包的发送和接收。

一、ARP 协议

1.1 ARP 协议介绍

通过使用ARP协议获取目标IP地址所对应硬件MAC地址的具体过程如下:

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

1.2 ARP 缓存

如果像上面说的那样,每次发包之前都要发送 ARP 请求硬件地址,这样会不会效率太低,实际上 ARP 的运行是非常高效的。这是因为每一个主机上都有一个 ARP 高速缓存,我们可以通过命令 arp -a 获取本机 ARP 高速缓存的所有内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
arp -a

接口: 192.168.42.26 --- 0xb
Internet 地址 物理地址 类型
192.168.1.1 00-00-00-00-00-ff 静态
192.168.40.1 f8-75-88-c2-df-c1 动态
192.168.40.74 c8-5b-76-86-c6-06 动态
192.168.40.245 38-d5-47-e1-8a-2f 动态
192.168.42.131 60-a4-4c-65-9f-68 动态
224.14.51.28 01-00-5e-0e-33-1c 静态
224.19.133.150 01-00-5e-13-85-96 静态
224.49.6.212 01-00-5e-31-06-d4 静态
224.50.134.225 01-00-5e-32-86-e1 静态
224.68.111.100 01-00-5e-44-6f-64 静态
224.80.154.130 01-00-5e-50-9a-82 静态
224.88.174.75 01-00-5e-58-ae-4b 静态

通过命令 arp -d 可以清除 arp 缓存。

1.3 ARP 缓存生存周期

在默认情况下,Windows Server 2003 家族和 Windows XP 中,ARP 缓存中的表项仅存储 2 分钟。如果一个 ARP 缓存表项在 2 分钟内被用到,则其期限再延长 2 分钟,直到最大生命期限 10 分钟为止。超过 10 分钟的最大期限后,ARP 缓存表项将被移出,并且通过另外一个 ARP 请求来获得新的对应关系。

ARP 缓存表项的存放时间可以通过改变 ArpCacheLifeArpCacheMinReferencedLife 的注册表值来重新设置。

1
2
3
4
5
6
7
8
9
10
11
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

键值:
ArpCacheLife,设置未被使用的ARP缓存表项可以被保持的时间,类型为 DWORD,单位为秒,默认值为120。
ArpCacheMinReferencedLife,设置被重复使用的表项可以在ARP缓存中存放的时间,类型为 DWORD,单位为秒,默认值为600。

ArpCacheMinReferencedLife和ArpCacheLife的值的使用方法如下:
如果 ArpCacheLife >= ArpCacheMinReferencedLife,则被使用和未被使用的ARP缓存表项可存储的时间都是 ArpCacheLife。
如果 ArpCacheLife < ArpCacheMinReferencedLife,则未被使用的ARP缓存表项在 ArpCacheLife 秒的时间后就过期了,被使用的表项的生存期为ArpCacheMinReferencedLife秒。

注意:这些键值默认是不存在的,如果你想修改,必须自行创建;修改后还需重启计算机才生效。

1.3 ARP 帧格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
以太网目的地址:目的主机的硬件地址。目的地址全部为 1 的特殊地址是广播地址。

以太网源地址:源主机的硬件地址。

帧类型:对于ARP协议,该字段为0x0806。对于RARP协议,该字段为0x8035。

硬件类型:表示硬件地址的类型。值为1时表示以太网地址。ARP协议不仅仅应用于以太网协议,还可以支持别的链路层协议。

协议类型:表示要映射的协议地址类型。值为0x0800时表示IP协议。

硬件地址长度:与硬件类型对应的硬件地址的长度,以字节为单位。如果是以太网,则是6字节(MAC长度)。

协议地址长度:与协议类型对应的协议地址长度,以字节为单位。如果是IP协议,则是4字节(IP地址长度)。

操作类型(op):四种操作类型。ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。

发送端硬件地址:如果是以太网,则是源主机以太网地址,此处和以太网头中的源地址对应。

发送端协议地址:如果是IP协议,则表示源主机的IP地址。

目的端硬件地址:如果是以太网,则是目的以太网地址,和以太网头中的目的地址对应。

目的端协议地址:如果是IP协议,则表示源主机要请求硬件地址的IP地址。

对应ARP请求包来说,目的端的硬件地址字段无须填充,其他字段都需要填充;对于ARP响应包来说,所有字段都需要填充。

1.4 ARP 欺骗

ARP 欺骗一般目的是通过某种方式把自己伪装成网关,从而欺骗目标机器,使本应发送到真实网关的数据包发送到欺骗者的机器。

现有如下网络:

1.4.1 如何伪装成网关?

我们以主机 A 请求 www.csdn.net 网站为例,涉及到 ARP 的主要流程如下:

  1. 主机 A 通过浏览器打开 www.csdn.net(假设通过 DNS 得到的 IP 是 47.95.163.175),然后组装需要发送 http 请求包。

  2. 主机 A 准备根据默认路由(网关)将数据包发送给 192.168.0.1, 但是最开始的时候主机 A 不知道 192.168.0.1 的 MAC 地址, 所以主机 A 广播一条 ARP 请求, 询问 192.168.0.1 的 MAC 地址。

  3. 路由器(网关)收到该 ARP 请求, 发现自己就是 192.168.0.1,于是向主机 A 回复一条 ARP 应答包, 告诉主机 A 192.168.0.1 的 MAC 地址是 xxxGW。

  4. 主机 A 收到该 ARP 响应包, 并向该响应包中的 MAC 地址发送一个 Http 请求包。

  5. 路由器(网关)收到该 Http 请求包, 发现目标 IP 是公网 IP, 便将该包放送到公网, 公网返回 Http 应答包给路由器(网关)。

  6. 路由器(网关)准备将 Http 响应包发送给 192.168.0.100, 但是同第 2 步, 路由器最开始的时候也不知道 192.168.0.100 的 MAC 地址是多少, 所以路由器会广播一条 ARP 请求, 询问 192.168.0.100 的 MAC 地址是多少。

  7. 主机 A 收到 ARP 请求, 发现自己就是 192.168.0.100, 于是向路由器回复了一个 ARP 应答包, 告诉路由器 192.168.0.100 的 MAC 地址是 xxxA.

  8. 路由器(网关)收到 ARP 应答包, 并使用该 APR 应答包中的 MAC 地址将第 5 步收到 Http 响应包发送出去。

试想,如果现在主机 B 做了如下 2 件事情会有什么后果:

  1. 主机 B 不停的向主机 A 发送 ARP 应答包, 告诉路由器(网关)192.168.0.1 的 MAC 地址是 xxxB, 会发生什么?
  2. 主机 B 不停的向路由器(网关)发送 ARP 应答包, 告诉主机 A 192.168.0.100 的 MAC 是 xxxB, 会发生什么?

如果主机 B 做了上面说的两件事的, 那么主机 A 访问网络的所有数据都会先经过主机 B, 并且从网关发送到主机 A 的数据也都会经过 B, 至此, 整个 ARP 欺骗完成。

但是,如果欺骗者机器不对这些数据包作处理,当被欺骗数据包到达后就会被本机丢弃(因为自己到底不是网关,还不知道如何处理这类数据包),这当然是不允许的。这时开启 IP 转发功能可以解决该问题,IP 转发负责把该类数据包再转发给真正的网关处理,开启 IP 转发的方法:

1
sysctl net.ipv4.ip_forward=1

1.4.2 arpspoof 使用

在 Ubuntu 或 Kali 等系统上有 arpspoof 工具可以轻松实现 ARP 欺骗的整个流程。

1
2
3
4
5
6
7
8
9
10
11
12
arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host

参数:
-i 指定用攻击机的哪个网络接口,可以使用ifconfig命令查看攻击机接口列表。

-c own|host|both

-t 指定arp攻击的目标。如果不指定,则目标为该局域网内的所有机器。可以指定多个目标,如:
arpspoof -i etho -t 192.168.32.100 -t 192.168.32.101

-r host
希望拦截攻击机和哪个host之间的通信,一般都是网关。

二、RARP 协议

RARP 协议(Reverse Address Resolution Protocol),反向地址转换协议,也叫逆地址解析协议,主要被那些没有磁盘驱动器的系统使用,如无盘工作站等。

具有本地磁盘的系统引导时,一般是从磁盘中的配置文件读取 IP 地址。但是无盘机,如无盘工作站,则需要采用其他方法获取 ip 地址。
网络上的每个系统都具有唯一的硬件地址,它是由网络接口生产厂家配置的。无盘系统的 RARP 实现过程是从网卡上读取唯一的硬件地址,然后发送 RARP 请求到 RARP 服务器,请求该主机在无盘系统的 IP 地址。

文章参考:https://segmentfault.com/a/1190000009562333

文章图片带有“CSDN”水印的说明:
由于该文章和图片最初发表在我的CSDN 博客中,因此图片被 CSDN 自动添加了水印。