ARP (Address Resolution Protocol) 地址解析协议,位于 TCP/IP 协议栈中的链路层。
当局域网内主机间(或者是主机与网关间)需要通信时,通过使用 ARP 协议获取目标 IP 地址所对应的硬件 MAC 地址,然后在主机间通过 MAC 地址来完成数据包的发送和接收。
一、ARP 协议
1.1 ARP 协议介绍
通过使用ARP协议获取目标IP地址所对应硬件MAC地址的具体过程如下:
- 本地主机在局域网中
广播
ARP 请求,ARP 请求数据帧中包含目的主机的 IP 地址。意思是“如果你是这个 IP 地址的拥有者,请回答你的硬件 MAC 地址”。 - 目的主机的 ARP 层解析这份
广播
报文,识别出是询问其硬件地址。于是发送(单播
)ARP 应答包,里面包含 IP 地址及其对应的硬件地址。 - 本地主机收到 ARP 应答后,知道了目的地址的硬件地址,之后的数据报就可以传送了。
1.2 ARP 缓存
如果像上面说的那样,每次发包之前都要发送 ARP 请求硬件地址,这样会不会效率太低,实际上 ARP 的运行是非常高效的。这是因为每一个主机上都有一个 ARP 高速缓存,我们可以通过命令 arp -a
获取本机 ARP 高速缓存的所有内容:
1 | arp -a |
通过命令 arp -d
可以清除 arp 缓存。
1.3 ARP 缓存生存周期
在默认情况下,Windows Server 2003 家族和 Windows XP 中,ARP 缓存中的表项仅存储 2 分钟。如果一个 ARP 缓存表项在 2 分钟内被用到,则其期限再延长 2 分钟,直到最大生命期限 10 分钟为止。超过 10 分钟的最大期限后,ARP 缓存表项将被移出,并且通过另外一个 ARP 请求来获得新的对应关系。
ARP 缓存表项的存放时间可以通过改变 ArpCacheLife
和 ArpCacheMinReferencedLife
的注册表值来重新设置。
1 | HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters |
1.3 ARP 帧格式
1 | 以太网目的地址:目的主机的硬件地址。目的地址全部为 1 的特殊地址是广播地址。 |
对应ARP请求包来说,目的端的硬件地址字段无须填充,其他字段都需要填充;对于ARP响应包来说,所有字段都需要填充。
1.4 ARP 欺骗
ARP 欺骗一般目的是通过某种方式把自己伪装成网关,从而欺骗目标机器,使本应发送到真实网关的数据包发送到欺骗者的机器。
现有如下网络:
1.4.1 如何伪装成网关?
我们以主机 A 请求 www.csdn.net 网站为例,涉及到 ARP 的主要流程如下:
主机 A 通过浏览器打开 www.csdn.net(假设通过 DNS 得到的 IP 是
47.95.163.175
),然后组装需要发送 http 请求包。主机 A 准备根据默认路由(网关)将数据包发送给
192.168.0.1
, 但是最开始的时候主机 A 不知道192.168.0.1
的 MAC 地址, 所以主机 A 广播一条 ARP 请求, 询问192.168.0.1
的 MAC 地址。路由器(网关)收到该 ARP 请求, 发现自己就是 192.168.0.1,于是向主机 A 回复一条 ARP 应答包, 告诉主机 A 192.168.0.1 的 MAC 地址是 xxxGW。
主机 A 收到该 ARP 响应包, 并向该响应包中的 MAC 地址发送一个 Http 请求包。
路由器(网关)收到该 Http 请求包, 发现目标 IP 是公网 IP, 便将该包放送到公网, 公网返回 Http 应答包给路由器(网关)。
路由器(网关)准备将 Http 响应包发送给
192.168.0.100
, 但是同第 2 步, 路由器最开始的时候也不知道192.168.0.100
的 MAC 地址是多少, 所以路由器会广播一条 ARP 请求, 询问 192.168.0.100 的 MAC 地址是多少。主机 A 收到 ARP 请求, 发现自己就是
192.168.0.100
, 于是向路由器回复了一个 ARP 应答包, 告诉路由器192.168.0.100
的 MAC 地址是 xxxA.路由器(网关)收到 ARP 应答包, 并使用该 APR 应答包中的 MAC 地址将第 5 步收到 Http 响应包发送出去。
试想,如果现在主机 B 做了如下 2 件事情会有什么后果:
- 主机 B 不停的向主机 A 发送 ARP 应答包, 告诉路由器(网关)192.168.0.1 的 MAC 地址是 xxxB, 会发生什么?
- 主机 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 | arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host |
二、RARP 协议
RARP 协议(Reverse Address Resolution Protocol),反向地址转换协议,也叫逆地址解析协议,主要被那些没有磁盘驱动器的系统使用,如无盘工作站等。
具有本地磁盘的系统引导时,一般是从磁盘中的配置文件读取 IP 地址。但是无盘机,如无盘工作站,则需要采用其他方法获取 ip 地址。
网络上的每个系统都具有唯一的硬件地址,它是由网络接口生产厂家配置的。无盘系统的 RARP 实现过程是从网卡上读取唯一的硬件地址,然后发送 RARP 请求到 RARP 服务器,请求该主机在无盘系统的 IP 地址。
文章图片带有“CSDN”水印的说明:
由于该文章和图片最初发表在我的CSDN 博客中,因此图片被 CSDN 自动添加了水印。