ARP 协议
Address Resolution Protocol 地址解析协议,工作在 MAC 层,用于获得已知 IP 地址的 MAC 地址。
同一子网中
假设 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 地址
同一子网内 ARP 抓包实践
- 申请在同一个 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 下,如果没有的话就继续下一步。
![arp -d](https://files.mdnice.com/user/49675/ac806183-5dd2-4a73-b833-296b9321eca6.png)
- 使用 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](https://files.mdnice.com/user/49675/535707b7-b9d1-40d0-b5b9-281126bd7be1.png)
- 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 响应报文
跨子网有网关的 ARP 抓包实践
gns3 网络拓扑及配置
- 路由器配置地址 192.168.1.1 和 10.10.10.1
![Router 配置](https://files.mdnice.com/user/49675/12f43a87-04ac-4cc1-ba8f-d4e58d789651.png)
- 进入配置模式 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
![Client D-ARP 配置](https://files.mdnice.com/user/49675/6efa67ec-02e3-4113-a5d9-46a6f7140446.png)
- ip 10.10.10.20/24 10.10.10.1
- Client A 配置地址 192.168.1.100 和 网关地址 192.168.1.1
![Client A 配置](https://files.mdnice.com/user/49675/dbcf1fb1-6fdf-468b-835e-70a47c50a0d3.png)
- 注意这里的 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](https://files.mdnice.com/user/49675/23e64820-5ca9-4580-8155-893ec71ec8ec.png)
- 网关单播回复 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
![ARP Request](https://files.mdnice.com/user/49675/4929dc1c-5cd4-4251-885e-2b6dcb91a423.png)
- 仍旧是广播的形式
- **可以看到 Target IP 是 10.10.10.10 即目标地址,而不是网关地址**
- ARP Reply
![ARP Reply](https://files.mdnice.com/user/49675/86c36a2a-c3f0-43f6-b256-e3a1255bf0c5.png)
- **仍旧是网关单播回复 ARP Reply,附上自己的 MAC 地址**
ARP 动态表项、静态表项
ARP 动态表项
由 ARP 协议通过 ARP 报文自动生成和维护,可以被 ARP 静态表项覆盖,可以被 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 响应报文,若此时有主机在收到广播 ARP 请求报文后伪造 ARP 响应报文,则可以欺骗发送方,伪造 IP 地址 - MAC 地址 的映射关系
- 劫持通信内容
- 广播攻击
- 丢弃通信,拒绝服务
防御措施
- 建立正确的 ARP 映射关系、检测并过滤伪造的 ARP 报文,保证经过其转发的 ARP报文正确合法
- 抑制短时间内大量 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 地址失败
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。