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 漂移) arpwatchXArp、交换机的 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

扫描二维码,在手机上阅读