ARP 协议
Address Resolution Protocol 地址解析协议,工作在 MAC 层,用于获得已知 IP 地址的 MAC 地址。
相同子网
普通ARP
假设 Client A 和 Client D 在 同一个子网中,Client A 要向 Client D 发送一个 IP 数据包(IP Packet)
Client A 查看自己的 ARP 缓存表,判断是否包含 Client D 对应的 ARP 表项。如果有,则直接利用 ARP 缓存表中的 MAC 地址,对 IP 数据包进行帧封装,发送数据帧给 Client D
若 Client A 的 ARP 缓存表中,没有包含 Client D 的信息,则 Client A 先将此数据帧缓存,以广播的形式发送 ARP 请求报文,交换机收到广播包时,会原样复制该包到除源端口外的所有端口,具体包格式如下图:
- dMAC 目标 MAC 地址 ff:ff:ff:ff:ff:ff ,即广播包
- sMAC 源 MAC 地址,即 Client A 的 MAC 地址
- type 数据帧类型为 ARP
- ARP 数据报文内容 1
- HType(Hardware Type)硬件类型,标识链路层协议,当为 1 时表示以太网
- PType(Protocol Type)协议类型,标识网络层协议,当为 0x0800 时表示 IPv4 协议
- HLen(Hardware Length),硬件地址长度,以太网的长度为 6
- PLen(Protocol Length),协议地址长度,IPv4 的长度为 4
- Opcode 操作码,1 表示 ARP 请求(“Request”)
- Sender MAC、Sender IP,为 Client A 的 MAC 地址 和 IP 地址
- Target MAC 为 00:00:00:00:00:00,说明此时 Client A 还不知道 Client D 的 MAC 地址
- Target IP 为 Client D 的 IP 地址
- dMAC 目标 MAC 地址,即 Client A 的 MAC 地址
- sMAC 源 MAC 地址,即 Client D 的 MAC 地址
- type 数据帧类型为 ARP
- ARP 数据报文内容
- HType、PType、HLen、PLen 与 ARP 包请求相似
- Opcode 为 “Reply”,即 ARP 响应包
- Sender MAC、Sender IP,为 Client D 的 MAC 地址 和 IP 地址
- Target MAC、Target IP, 为 Client A 的 MAC 地址 和 IP 地址
抓包实例
申请在同一个 VPC 下的 2 台云主机,内网地址分别为 10.23.139.22、10.23.197.59
登陆到 10.23.139.22,使用命令 arp -n 查看已经存在的 arp 缓存表项
-
如果此时已有 10.23.197.59 的缓存,使用命令 arp -d 10.23.197.59 删掉缓存,删完之后再次check ,如果没有的话就继续下一步
使用tcpdump -i eth0 arp -w arp.pcap
命令开始抓包
新开一个 tab,登陆到 10.23.139.22,使用 ping 10.23.197.59
,对 10.23.197.59 发送一个 ICMP 报文
结束抓包,将 arp.pcap 下载到本地,用 wireshark 打开 arp.pcap
-
ARP Request
- 可以看到 ARP 报文中的目标 MAC 地址是 00:00:00:00:00:00,而外层的目标 MAC 地址是 ff:ff:ff:ff:ff:ff,即广播
-
ARP Reply
- ARP Reply 报文中,由于已经知道目标 MAC 地址,直接以jj单播的形式返回
不同子网
假设 Client A 和 Client D 不在同一个子网中,Client A 要向 Client D 发送一个 IP 数据包(IP Packet),还会像在同一子网内那样发送 ARP 报文吗?答案是否定的,这里要分两种情况,Client A 本身是否存在网关。由于之前已经解析过 ARP 报文中的具体字段,之后的 ARP 报文我们就只关注于字段的值而不再赘述字段含义。
普通 ARP
Client A 和 Client D 不在同一个子网中且 Client A 存在网关
跨子网且有网关的抓包实例
gns3 网络拓扑及配置
-
路由器配置地址 192.168.1.1 和 10.10.10.1
- 进入配置模式 configure terminal
- 配置接口 int e0/0
- ip add 192.168.1.1 255.255.255.0
- no shut
- exit
- e1/0 与 e0/0 相同
-
Client D-ARP 配置地址 10.10.10.20
* ip 10.10.10.20/24 10.10.10.1 -
Client A 配置地址 192.168.1.100 和 网关地址 192.168.1.1
- 注意这里的 Client A 是由路由器模拟的,为了方便后续的 proxy arp 实验
- 进入配置模式 configure terminal
- 配置接口 int e0/0
- ip add 192.168.1.100 255.255.255.0
- no shut
- exit
- 关闭路由功能 no ip routing
- 设置默认网关 ip default-gateway 192.168.1.1
- 退出配置模式后,检查下是否配置成功 show ip route
开始抓包
在 Client A 上 ping 10.10.10.20
-
ARP Request
- 仍旧是广播的形式
- 可以看到 Target IP 是 192.168.1.1 即网关的地址,而不是 10.10.10.20
-
ARP Reply
- 网关单播回复 ARP Reply,附上自己的 MAC 地址
Proxy ARP(代理 ARP)
Client A 和 Client D 不在同一个子网中且 Client A 不存在网关
- 当局域网内部主机发起跨网段的 ARP 请求,网关设备开启 ARP 代理功能且知道目标的路由信息时,会使用自身的 MAC 地址回复该请求
- 这里有两个非常重要的点,一个是 Proxy ARP 需要网关设备支持且开启 ARP 代理功能,这说明 Proxy ARP 依赖且受限于网关设备,因此必定会来可扩展性差和不可靠的缺点。另一个是网关设备会用自身的 MAC 地址回复 ARP 请求报文。
跨子网无网关的 ARP 抓包实例
gns3 网络拓扑及配置
-
路由器和上述相同
-
Client D-ProxyARP 类似,配置地址换为 10.10.10.10
-
Client A 这里要关闭路由功能(上述已关闭)且去掉默认网关
- no ip default-gateway
开始抓包
在 Client A 上 ping 10.10.10.10
-
ARP Request
- 仍旧是广播的形式
- 可以看到 Target IP 是 10.10.10.10 即目标地址,而不是网关地址
-
ARP Reply
- 仍旧是网关单播回复 ARP Reply,附上自己的 MAC 地址
总结一下,在正常环境下,当主机接入网络时,得到 IP 地址和默认的网关信息。若有网关信息(网关一定和 IP 地址在同一网段内),则使用普通 ARP 请求,此时 ARP 请求的是网关的 MAC 地址,得到网关的 MAC 地址。若没有网关信息,则使用代理 ARP 请求,此时 ARP 请求的是目标地址的 MAC 地址,得到的仍旧是网关的 MAC 地址。因此,无论是 ARP 还是 Proxy ARP,此时的 ARP 请求得到的目标 MAC 地址都是网关的 MAC 地址。
ARP 动态表项、静态表项
ARP 动态表项:由 ARP 协议通过 ARP 报文自动生成和维护,可以被 ARP 静态表项覆盖,可以被 ARP 报文更新,可以过期
ARP 静态表项:手动配置和维护,不会被 ARP 动态表项覆盖,不会被 ARP 报文更新,不会过期
ARP 欺骗及防御
由于 ARP 请求不会验证 ARP 响应报文,若此时有主机在收到广播 ARP 请求报文后伪造 ARP 响应报文,则可以欺骗发送方,伪造 IP 地址 - MAC 地址 的映射关系,从而导致如下的问题:
- 劫持通信内容
- 广播攻击
- 丢弃通信,拒绝服务
防御措施
- 建立正确的 ARP 映射关系、检测并过滤伪造的 ARP 报文,保证经过其转发的 ARP报文正确合法
- 抑制短时间内大量 ARP 报文的冲击
Gratuitous ARP(免费 ARP)
Gratuitous ARP 是一种特殊的 ARP 请求,当主机启动时,发送一个 Gratuitous ARP 请求,即请求自己的 IP 地址和 MAC 地址,即目标 IP 地址为 自己的 IP 地址。
Gratuitous ARP 的作用:
ARP 常用命令
- 查看 arp 表项 arp -a/ arp -e
- 删除 arp 表项 arp -d,例:arp -i eth1 -d 192.168.60.1
- 添加 arp 表项 arp -s,例:arp -s IP MAC-ADDRESS
- 更多:arp -h
RARP 协议
反向地址转换协议(Reverse Address Resolution Protocol),用于获得已知 MAC 地址的 IP 地址。
一般在主机刚接入网络时,通过本地 MAC 地址来发送 RARP 请求,如果局域网内有 RARP Server 且 Server 上存在关于此 MAC 地址的映射 IP,则会返回 RARP Reply 响应,此时主机就获取了 IP 地址。
- 需要 RARP 服务器,一般用于无法使用 DHCP 或没有任何输入接口的小型嵌入式设备
- 主机以广播的形式发送 RARP 请求包,声明自己的 MAC 地址,并请求分配一个 IP 地址
- RARP 服务器收到 RARP 请求包后,检查 RARP 列表,查找该 MAC 地址对应的 IP 地址
- 若存在,则返回 RARP 响应包,成功分配 IP 地址
- 若不存在,则不做任何响应,分配 IP 地址失败
Footnotes
更多参数值查看:www.iana.org/assignments… ↩