ARP 协议
RFC 826 (ARP), RFC 5227 (IPv4 Address Conflict Detection, ACD) | OSI 第 2 层(数据链路层) / 第 3 层(网络层)之间
1. 协议原理
1.1 ARP 定位
ARP(Address Resolution Protocol,地址解析协议)用于将 IPv4 地址解析为 MAC 地址,工作在数据链路层与网络层的接口处。IPv4 数据包在网络层封装后,必须通过数据链路层发送到目标设备,这时需要知道目标设备的 MAC 地址。ARP 的目标就是通过广播获取这个映射关系。
IPv6 使用 NDP(Neighbor Discovery Protocol, RFC 4861)替代 ARP,通过 ICMPv6 消息完成邻居发现。
| 对比项 | ARP (IPv4) | NDP (IPv6) |
|---|---|---|
| 协议依赖 | 单独协议,以太网类型 0x0806 | ICMPv6(类型 133–137) |
| 传输方式 | 广播(Broadcast) | 组播(Multicast, 所有节点地址 FF02::1) |
| 安全性 | 无认证 → 易欺骗 | SEND (RFC 3971) 可选:CGA + 签名 |
| 可靠性 | 无确认机制 | RS/RA、NS/NA 成对消息 |
| 重复地址检测 | ARP Probe(ACD, RFC 5227) | DAD(Duplicate Address Detection, RFC 4862) |
1.2 ARP 报文结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 硬件类型(HTYPE) | 协议类型(PTYPE) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 硬件地址长度(HLEN)| 协议地址长度(PLEN)| 操作码(OPER) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 发送端硬件地址(SHA)(第 0-3 字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 发送端硬件地址(SHA)(第 4-5 字节) | 发送端协议地址(SPA)(第 0-1 字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 发送端协议地址(SPA)(第 2-3 字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 目标硬件地址(THA)(第 0-3 字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 目标硬件地址(THA)(第 4-5 字节) | 目标协议地址(TPA)(第 0-1 字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 目标协议地址(TPA)(第 2-3 字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
| 字段 | 典型值(以太网 + IPv4) | 说明 |
|---|---|---|
| HTYPE | 1(以太网) | 数据链路层协议类型 |
| PTYPE | 0x0800(IPv4) | 网络层协议类型 |
| HLEN | 6 | MAC 地址长度(6 字节) |
| PLEN | 4 | IPv4 地址长度(4 字节) |
| OPER | 1=请求, 2=应答 | 操作码 |
| SHA | 发送端 MAC | 请求方/应答方的 MAC |
| SPA | 发送端 IP | 请求方/应答方的 IP |
| THA | 请求时为 0,应答时为目标 MAC | 目标 MAC |
| TPA | 目标 IP | 需要解析的 IP |
1.3 ARP 工作流程
sequenceDiagram
participant A as 主机 A (192.168.1.10, AA:AA:AA:AA:AA:AA)
participant B as 主机 B (192.168.1.20, BB:BB:BB:BB:BB:BB)
participant Switch as 交换机
A->>A: 检查 ARP 缓存:192.168.1.20 是否已知?
Note over A: 缓存未命中
A->>Switch: ARP 请求(广播)
Note over A,Switch: 目标 MAC = FF:FF:FF:FF:FF:FF<br/>SHA = AA:AA:AA:AA:AA:AA, SPA = 192.168.1.10<br/>THA = 00:00:00:00:00:00, TPA = 192.168.1.20
Switch->>Switch: 泛洪广播帧到所有端口(除来源端口)
Switch->>B: ARP 请求(广播到达主机 B)
B->>B: TPA=192.168.1.20 匹配本机 IP
B->>B: 更新 ARP 缓存:192.168.1.10 → AA:AA:AA:AA:AA:AA
B->>Switch: ARP 应答(单播)
Note over B,Switch: SHA = BB:BB:BB:BB:BB:BB, SPA = 192.168.1.20<br/>THA = AA:AA:AA:AA:AA:AA, TPA = 192.168.1.10
Switch-->>A: ARP 应答
A->>A: 更新 ARP 缓存:192.168.1.20 → BB:BB:BB:BB:BB:BB
A->>B: 现在可以直接发送 IP 数据帧到 BB:BB:BB:BB:BB:BB
1.4 ARP 缓存
ARP 缓存存储已知的 IP→MAC 映射,减少广播开销:
| 缓存类型 | 来源 | 特点 |
|---|---|---|
| 动态(Dynamic) | ARP 应答自动添加 | 超时后删除(Windows 通常 15–45 秒,Linux 通常 60–300 秒) |
| 静态(Static) | 手动配置 | 永久存在,不会被动态条目覆盖 |
# Windows 查看 ARP 缓存 arp -a # Linux 查看 ARP 缓存 ip neigh show
1.5 无故 ARP(Gratuitous ARP)
主机在以下场景主动发送 ARP 请求(SHA=本机 MAC, SPA=本机 IP, THA=00:00:00:00:00:00, TPA=本机 IP):
- IP 地址冲突检测:收到自己的无故 ARP 应答说明 IP 冲突(ACD, RFC 5227)
- MAC 地址变化通知:网卡更换后通知网络中所有设备更新缓存
- 高可用/VRRP 主备切换:虚拟 IP 漂移时新主设备发送无故 ARP 更新交换机 MAC 表
- 负载均衡器 VIP 失效转移:类似 VRRP
2. 攻击面
2.1 协议设计层面
| 攻击面 | 成因 | 风险 |
|---|---|---|
| 无认证机制 | ARP 请求/应答无签名、无密码,任意设备可发送 | ARP 欺骗、中间人 |
| 无状态 | ARP 接受任何收到的应答,不验证请求是否发出过 | 伪造应答直接注入到目标 ARP 缓存 |
| 广播透明 | ARP 请求广播到局域网所有设备 | 局域网所有设备可看到通信模式,利于侧信道分析 |
| 无故 ARP 无条件信任 | 无故 ARP 可被任意设备发送 | 攻击者发送无故 ARP 声明自己的 MAC 对应目标 IP |
| 无速率限制 | ARP 不限制单位时间接收量 | ARP 泛洪导致 CPU 过载或 CAM 表溢出 |
| 无确认机制 | ARP 请求无收据,发送者无法确认哪台设备在线 | 攻击者可静默监听不响应,也可选择性响应 |
2.2 实现层面
| 攻击面 | 成因 | 典型案例 |
|---|---|---|
| 静默节点忽略 | ARP 请求未到,但实现不缓存信息 | 部分 OS 缓存超时太短或为空,频繁广播暴露流量模式 |
| 静态 ARP 溢出 | 静态 ARP 条目过多(手动配置) | 管理不当可导致数据发送到错误设备 |
| ARP 表满 | OS ARP 表大小有限(Linux 默认 1024 条) | 攻击者构造大量伪造 ARP 条目填满后,新合法条目被拒绝 |
| 无保护的动态覆盖静态 | 部分 OS 允许动态 ARP 覆盖静态条目 | 安全配置被绕过 |
3. 攻击手法
覆盖原则:穷举 ARP 协议已知攻击手段。
3.1 ARP 欺骗(ARP Spoofing / ARP Poisoning)
原理:攻击者向局域网中的目标主机发送伪造的 ARP 应答(或无故 ARP),将目标 IP 对应的 MAC 地址篡改为攻击者的 MAC。此后,目标主机发往该 IP 的流量均发送到攻击者设备。
适用版本:所有 ARP 协议实现(不区分 OS 版本)。
前提条件:攻击者与目标在同一广播域(同一二层网络/同一 VLAN)。
操作示意:
# 使用 arpspoof(dsniff 工具包) # 欺骗目标 192.168.1.100:网关 192.168.1.1 的 MAC 是攻击者的 MAC target_ip=192.168.1.100 gateway_ip=192.168.1.1 arpspoof -i eth0 -t $target_ip -r $gateway_ip # -r 同时双向欺骗(目标和网关) # 流量路径:目标 ─→ 攻击者 ─→ 网关
单向欺骗 vs 双向欺骗:
| 方式 | 欺骗对象 | 流量可见性 | 备注 |
|---|---|---|---|
| 单向(目标侧) | 仅欺骗目标:网关 MAC=攻击者 | 目标→网关可见,网关→目标不可见 | 目标出站流量可嗅探 |
| 双向(全双工) | 同时欺骗目标和网关 | 全双工流量可见 | 需开启 IP 转发 |
自动双向 ARP 欺骗后 IP 转发:
# 开启 IP 转发(Linux) echo 1 > /proc/sys/net/ipv4/ip_forward # 或 sysctl -w net.ipv4.ip_forward=1
工具:
| 工具 | 特点 |
|---|---|
| arpspoof (dsniff) | 简单实用,双向欺骗 |
| ettercap | 图形/命令行,支持 ARP 欺骗 + 插件嗅探 |
| bettercap | 现代替代,内置 HTTP/HTTPS 代理、DNS 欺骗等 |
| Cain & Abel | Windows 平台(旧但可用) |
检测:
# 在目标主机上检查网关 MAC 是否一致 arp -a | findstr 192.168.1.1 # 检查网关 192.168.1.1 的 MAC 是否与真实网关 MAC 不符 # 使用 arpwatch(持续监控 ARP 表变化) arpwatch -i eth0
3.2 无故 ARP 攻击(Gratuitous ARP Attack)
原理:攻击者发送无故 ARP 请求/应答,声明自己的 MAC 地址对应某个 IP(如网关 IP),无需等目标发出 ARP 请求。网络中所有设备收到无故 ARP 后会自动更新 ARP 缓存。
适用版本:所有 ARP 实现。
前提条件:攻击者在同一广播域。
操作示意:
# scapy 发送无故 ARP 声明本机 MAC 对应网关 IP
from scapy.all import *
send(Ether(dst="ff:ff:ff:ff:ff:ff")/
ARP(op=2, # 应答
hwsrc="攻击者 MAC", # 攻击者 MAC
psrc="192.168.1.1", # 伪造为网关 IP
hwdst="ff:ff:ff:ff:ff:ff",
pdst="192.168.1.1"),
iface="eth0")
3.3 ARP 泛洪(ARP Flooding)
原理:
| 变体 | 原理 | 效果 |
|---|---|---|
| MAC 泛洪(CAM 表溢出) | 发送大量源 MAC 各异的伪造帧填满交换机 CAM 表 | 交换机退化为集线器,攻击者可嗅探所有端口流量(同OSI 七层模型 3.2.2) |
| ARP 拒绝服务 | 发送大量伪造 ARP 请求/应答,填满目标主机的 ARP 表 | 新合法 ARP 条目无法加入,正常通信中断 |
| ARP 风暴 | 触发广播风暴(如环路 + 大量 ARP) | 网络整体瘫痪 |
工具:
# macof (dsniff) — MAC 泛洪 macof -i eth0 -s random -d 192.168.1.1 -n 100000
防御:
- 交换机启用 Port Security(限制每端口 MAC 数量)
- 启用 MAC 地址漂移检测
- ARP 速率限制(部分交换机支持 ARP 包限速)
3.4 ARP 中间人后的后续攻击
一旦通过 ARP 欺骗建立了中间人位置,攻击者可进一步实施:
| 后续攻击 | 原理 |
|---|---|
| 流量嗅探 | 读取明文协议(HTTP、FTP、Telnet)的凭证和内容 |
| TLS 剥离 | 将 HTTPS 替换为 HTTP 或插入自签名证书 |
| DNS 欺骗 | 在转发的流量中篡改 DNS 响应(见DNS协议.md) |
| Session 劫持 | 窃取 HTTP Cookie 重放认证会话 |
| 数据篡改 | 修改传输中的内容(如注入恶意脚本到 HTTP 页面) |
| 凭证抓取 | 使用 ettercap/bettercap 的 HTTP 凭证嗅探插件 |
3.5 攻击手法选择决策图
flowchart TD
A["局域网 ARP 攻击"] --> B{"攻击目标"}
B -->|"劫持流量"| C1{"攻击方式"}
C1 -->|"针对特定主机"| D1["ARP 欺骗 + 双向欺骗"]
C1 -->|"全局劫持"| D2["无故 ARP 声明网关 IP"]
D1 --> D3["IP 转发开启"]
D2 --> D3
D3 --> D4{"后续利用"}
D4 -->|"嗅探凭证"| E1["ettercap/bettercap 插件"]
D4 -->|"篡改流量"| E2["注入恶意脚本/重定向"]
D4 -->|"TLS 剥离"| E3["sslstrip"]
B -->|"拒绝服务"| F1{"方法"}
F1 -->|"填满 ARP 表"| G1["ARP 泛洪"]
F1 -->|"填满交换机 CAM"| G2["MAC 泛洪(macof)"]
B -->|"信息收集"| H1["被动 ARP 监听 + arpsniffer"]
4. 防御加固
4.1 协议层防御
| 措施 | 对抗攻击 | 配置示例 |
|---|---|---|
| 静态 ARP 条目 | ARP 欺骗 | arp -s 192.168.1.1 AA:BB:CC:DD:EE:FF(大网络不可行) |
| ARP 表最大条目限制 | ARP 泛洪 | Linux:sysctl net.ipv4.neigh.default.gc_thresh3=1024 |
| Gratuitous ARP 忽略 | 无故 ARP 攻击 | 部分 OS 可配置(非通用) |
4.2 实现层防御
交换机防御
| 特性 | 说明 | 对抗攻击 |
|---|---|---|
| Port Security | 限制每端口最大 MAC 数 + 违反策略 | MAC 泛洪、ARP 泛洪 |
| Dynamic ARP Inspection (DAI) | 交换机验证 ARP 包的 IP-MAC 绑定与 DHCP Snooping 数据库的一致性 | ARP 欺骗 |
| DHCP Snooping | 构建信任的 IP-MAC 绑定数据库(DAI 依赖) | ARP 欺骗(提供 DAI 数据源) |
| ARP ACL | 允许/拒绝特定 ARP 消息 | 细粒度 ARP 控制 |
| BPDU Guard | 非 Trunk 端口收到 BPDU 时关闭端口 | STP 操纵 |
| VLAN 划分 | 将网络划分为多个广播域 | ARP 无法跨越 VLAN |
| Private VLAN | 同 VLAN 内限制端口间通信 | 限制横向 ARP 攻击 |
| MAC 漂移检测 | 同一 MAC 出现在多个端口时告警 | ARP 欺骗(MAC 漂移) |
| ARP 速率限制 | 限制每秒钟经过 CPU 的 ARP 包数量 | ARP 泛洪 |
Cisco DAI 配置示例
! 全局启用 DHCP Snooping
ip dhcp snooping
ip dhcp snooping vlan 1,10,20
! 信任端口(连接到 DHCP 服务器和上行交换机的端口)
interface GigabitEthernet1/0/1
ip dhcp snooping trust
! 非信任端口(连接到终端的端口)
interface GigabitEthernet1/0/2
ip dhcp snooping limit rate 10 ! 限制 DHCP 包速率
! 启用 Dynamic ARP Inspection
ip arp inspection vlan 1,10,20
! DAI 信任端口(上行链路)
interface GigabitEthernet1/0/1
ip arp inspection trust
! 非信任端口的 DAI 验证
interface GigabitEthernet1/0/2
ip arp inspection validate src-mac dst-mac ip
! 验证源 MAC、目标 MAC 和 IP 是否与 DHCP Snooping 数据库一致
主机级防御
# Linux # 设置 ARP 缓存阈值 sysctl -w net.ipv4.neigh.default.gc_thresh1=1024 sysctl -w net.ipv4.neigh.default.gc_thresh2=2048 sysctl -w net.ipv4.neigh.default.gc_thresh3=4096 # 忽略无故 ARP(部分内核支持) sysctl -w net.ipv4.conf.all.arp_ignore=1 sysctl -w net.ipv4.conf.all.arp_announce=2 # 非网关禁用 IP 转发 sysctl -w net.ipv4.ip_forward=0
网络分段
- VLAN 隔离:不同安全级别的设备分在不同 VLAN,ARP 攻击无法跨 VLAN
- 802.1X(NAC):认证后才能接入网络,阻止未授权设备
- 物理安全:锁定配线架和交换机端口
4.3 监控与检测
| 检测项 | 方法 | 工具 |
|---|---|---|
| ARP 欺骗 | 监控 IP-MAC 映射变化(MAC 漂移) | arpwatch、XArp、交换机的 MAC 漂移检测 |
| MAC 泛洪 | 交换机日志显示 CAM 表满 | 交换机 SNMP 告警 |
| ARP 泛洪 | 监控端口的 ARP 包速率异常 | 交换机的 ARP rate-limit 日志 |
| 无故 ARP 异常 | 出现不应有的无故 ARP(如网关 IP 出现在非网关端口) | tcpdump arp + 周期性基线 |
| 双 MAC 冲突 | 同一 IP 对应多个 MAC 出现在网络中 | arp -a 交叉检查 |
| 中间人延迟 | ARP 欺骗后流量经攻击者转发,延迟突增 | Ping 延迟基线监控 |
4.4 加固决策流程
flowchart TD
A["ARP 安全加固"] --> B{"网络层级"}
B -->|"网络设备(交换机)"| C1["启用 DHCP Snooping"]
C1 --> C2["启用 Dynamic ARP Inspection"]
C2 --> C3["启用 Port Security"]
C3 --> C4["VLAN 划分 + Private VLAN"]
C4 --> C5["启用 MAC 漂移检测"]
B -->|"主机"| D1["静态 ARP(关键设备)"]
D1 --> D2["ARP 缓存内核参数优化"]
D2 --> D3["禁用 IP 转发"]
D3 --> D4["安装 arpwatch"]
B -->|"架构"| E1["网络分段(VLAN)"]
E1 --> E2["802.1X 端口认证"]
E2 --> E3["最小化广播域"]
subgraph 监控
M1["arpwatch 持续监控"]
M2["交换机 MAC 漂移日志"]
M3["ARP 包速率基线"]
end
C5 --> M1
D4 --> M1
E3 --> M2

文章有(0)条网友点评