问题描述
除了知道 IP 地址,IP 报文还必须封装成帧,然后通过数据链路层来发送,而数据帧必须包含目的 MAC 地址。
解决方案
通过 IP 地址而获取目的 MAC 地址的过程是通过 ARP 协议实现的。
原理简述
当 主机A 发送数据包给 主机C 之前,首先要获取 主机C 的 MAC 地址:
除了相应 MAC 地址,主机还会绑定请求者的 MAC 地址。
在发送数据包之前先触发 ARP 查询。有些时候首个 ping 包会丢失,是因为完成 ARP 查询的时间比较久。
ARP 缓存表作用
一般缓存 1200s (20min)
能够手动绑定。
Proxy ARP(代理 ARP)
PC1 和 PC2 虽然属于不同的广播域,但它们处于同一网段中,因此PC1会向PC2发出ARP请求广播包,请求获得PC2的MAC地址。由于路由器不会转发广播包,因此ARP请求只能到达路由器,不能到达PC2。
当在路由器上启用 Proxy ARP 后,路由器会查看 ARP 请求,发现 IP 地址 172.16.20.100 属于它连接的另一个网络,因此路由器用自己的接口 MAC 地址代替PC2 的 MAC 地址,向 PC1 发送了一个 ARP 应答。
PC1收到ARP应答后,会认为PC2的MAC地址就是00-00-0c-94-36-ab(路由器接口的 MAC 地址),不会感知到ARP代理的存在。0
# 07/21/2021 目前,已经很少使用 Proxy ARP 特性。该特性需要在支持该功能的路由设备上开启。
Gratuitous ARP(无故 ARP、无偿 ARP、免费 ARP)
普通 ARP 请求报文,其 ARP 封装内的“目的 IP 地址”是其他机器的 IP 地址,而 Gratuitous ARP 的请求报文,其 ARP 封装内的“目的 IP 地址”是其自己的 IP 地址。如果有人响应,则表示该地址已经被使用(能够用作 IP 地址冲突检测)。
所有设备初始都具有该功能,无需开启。
1,利用免费ARP确认设备接口地址
一般的设备在网卡地址加载阶段都会向网络中发送免费的ARP报文(也有些安全设备为了安全起见,让设备在加载地址期间不向外发送免费ARP报文),当我们想知道某些设备的接口地址但又没有相应记录可查时,我们就可以利用设备的这种特性,抓取其免费ARP报文,从而分析出其接口使用的IP地址。这个方法曾数次在用户处使用,效率很高,效果非常明显。
2,使用免费ARP报文,更新某些设备的ARP表项
在《TCP/IP详解卷1》的第四章中,有讲到使用免费ARP报文,更新其他主机设备的ARP表项的应用。在我们的工作环境中最常见的应用可能是网关设备双机热备的应用场景,网关在双机热备的工作模式下,由主设备切换到备用设备时,与之相连的设备的ARP表项需要由以前主设备的MAC地址更新为现在主设备(切换前的从设备)的MAC地址,这时,一般从设备在切换为主设备时,就利用向网络中发送免费ARP请求报文, 达到让其他设备更新ARP表项的效果。
3,利用免费ARP的攻击
在实际环境中,如果构造网关地址的免费ARP报文,并将ARP的源MAC地址设为任何非网关的MAC地址,再把构造的这个虚假的网关免费ARP报文向网络中发送,那么所有接收到这个免费ARP报文的主机都会更新自己的ARP表项中网关地址对应的MAC地址,导致这些主机的数据报文全部会被转发到错误的MAC地址上,从而实现了ARP欺骗的攻击。
4,网关设备利用免费ARP防止ARP攻击
有些网关设备为了防止内部中毒机器对内部其他机器实施网关的ARP欺骗攻击,其会在一定的时间间隔内向网络中主动发送免费ARP报文,让网络内的主机更新ARP表项中的网关MAC地址信息,从而达到防止或缓解ARP攻击的效果。
报文格式
Hardware Type:硬件类型
Protocol Type:IPv4,而 IPv6 没有 ARP 协议。
Source Hardware Address:实际的源 MAC 地址;
Source Protocol Address:实际的源网络地址;
Destination Hardware Address:
1)使用 00:00:00:00:00:00 地址(在某些系统实现中为全 F 地址);
2)但是,上层 Ethernet II 使用 FF:FF:FF:FF:FF:FF,二层广播地址,不能穿越路由器;注意区分这两个 MAC 地址;
Destination Protocol Address: 实际的目的地址
注意事项
并非在所有的协议中都使用 ARP 协议。比如在 HDLC、PPP 中,是不使用 ARP 协议的。