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
以太网目的地址:目的主机的硬件地址。目的地址全为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 自动添加了水印。