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 地址
- Client D 比较自己的 IP 地址和 ARP 请求报文中的 Target IP 地址,若二者相同,将 ARP 请求报文中的 Sender MAC、Sender IP 地址信息存入自己的 ARP 缓存表中,以单播 的形式返回 ARP 响应报文 (Client C 也会将 Client A 的 IP、MAC 地址缓存在自己的 ARP 缓存表中,但并不响应 ARP 请求)。
- 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 存在网关
- Client A 首先发现目标 IP 是跨网段的,并且 Client A 此时有网关,那么 Client A 就会发送 ARP 报文去查找网关的 MAC 地址,而不是跨网段的目标 IP 的 MAC 地址(本地无网关 MAC 地址缓存)
- Client A 以广播的形式发送 ARP 请求报文
- 网关以单播的形式返回 ARP 响应报文
跨子网且有网关的抓包实例
-
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 不存在网关
- 先来看看什么是 Proxy ARP
- 当局域网内部主机发起跨网段的 ARP 请求,网关设备开启 ARP 代理功能且知道目标的路由信息时,会使用自身的 MAC 地址回复该请求
- 这里有两个非常重要的点,一个是 Proxy ARP 需要网关设备支持且开启 ARP 代理功能,这说明 Proxy ARP 依赖且受限于网关设备 ,因此必定会来可扩展性差和不可靠的缺点。另一个是网关设备会用自身的 MAC 地址回复 ARP 请求报文。
- Proxy ARP 和普通 ARP 的请求路径类似,唯一不同的是 ARP 请求报文中的 Target IP Address 中的值是目标 IP(而不是网关 IP)
跨子网无网关的 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 地址
-
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 的作用:
- 以广播的形式发送自己的 IP 地址 和 MAC 地址,在网络中宣告自己的信息,可以是宣告新添加的主机或者更新自己的 MAC 地址
- 检测 IP 地址冲突,若收到了 ARP 响应报文,则说明网络中已存在使用该 IP 地址的主机
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... ↩