ARP协议工作原理
约 1952 字大约 7 分钟
arpprotocol
2025-07-07
概述
ARP(Address Resolution Protocol,地址解析协议)用于将网络层的IP地址解析为数据链路层的MAC地址。在以太网中,数据帧的传输依赖MAC地址寻址,因此当主机知道目标IP但不知道其MAC地址时,就需要通过ARP协议来获取。
ARP的必要性
在TCP/IP网络中,IP地址用于逻辑寻址(跨网络路由),MAC地址用于物理寻址(同一局域网内帧传输)。两者之间的映射就由ARP协议完成。
ARP报文格式
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Hardware Type | Protocol Type |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| HW Len| PR Len| Operation |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Sender Hardware Address |
| (6 bytes for Ethernet) |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Sender Protocol Address |
| (4 bytes for IPv4) |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Target Hardware Address |
| (6 bytes for Ethernet) |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Target Protocol Address |
| (4 bytes for IPv4) |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+| 字段 | 大小 | 说明 |
|---|---|---|
| Hardware Type | 2B | 硬件类型(1=以太网) |
| Protocol Type | 2B | 协议类型(0x0800=IPv4) |
| Hardware Length | 1B | 硬件地址长度(6=MAC) |
| Protocol Length | 1B | 协议地址长度(4=IPv4) |
| Operation | 2B | 操作码(1=ARP请求,2=ARP应答) |
| Sender HW Address | 6B | 发送方MAC地址 |
| Sender Protocol Address | 4B | 发送方IP地址 |
| Target HW Address | 6B | 目标MAC地址 |
| Target Protocol Address | 4B | 目标IP地址 |
ARP报文封装在以太网帧中,EtherType字段值为0x0806。
ARP请求与应答流程
ARP请求帧详解:
以太网头部:
目的MAC: FF:FF:FF:FF:FF:FF(广播)
源MAC: AA:AA:AA:AA:AA:AA
Type: 0x0806(ARP)
ARP数据:
Operation: 1(请求)
Sender MAC: AA:AA:AA:AA:AA:AA
Sender IP: 192.168.1.10
Target MAC: 00:00:00:00:00:00(未知)
Target IP: 192.168.1.20ARP缓存
ARP缓存(ARP Cache/ARP Table)存储已解析的IP-MAC映射,避免重复广播。
# 查看ARP缓存
# Linux
arp -n
ip neigh show
# macOS
arp -a
# Windows
arp -a
# 输出示例:
# 192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
# 192.168.1.20 dev eth0 lladdr bb:bb:bb:bb:bb:bb STALE
# 192.168.1.30 dev eth0 lladdr cc:cc:cc:cc:cc:cc DELAY
# ARP缓存状态:
# REACHABLE - 可达(已确认有效)
# STALE - 过期(需要重新验证)
# DELAY - 延迟验证中
# PROBE - 正在探测
# FAILED - 解析失败
# INCOMPLETE - 正在解析
# 手动管理ARP缓存
# 添加静态条目
sudo arp -s 192.168.1.100 00:11:22:33:44:55
sudo ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0
# 删除条目
sudo arp -d 192.168.1.100
sudo ip neigh del 192.168.1.100 dev eth0
# 清空ARP缓存
sudo ip neigh flush all缓存超时:
# Linux ARP缓存时间参数
# base_reachable_time_ms: 基础可达时间(默认30秒)
cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time_ms
# gc_stale_time: 过期条目的回收时间(默认60秒)
cat /proc/sys/net/ipv4/neigh/eth0/gc_stale_time
# 调整ARP缓存大小
cat /proc/sys/net/ipv4/neigh/default/gc_thresh1 # 最小条目数
cat /proc/sys/net/ipv4/neigh/default/gc_thresh2 # 软上限
cat /proc/sys/net/ipv4/neigh/default/gc_thresh3 # 硬上限免费ARP(Gratuitous ARP)
免费ARP是主机主动发送的ARP请求/应答,其中源IP和目标IP都是自己的IP地址。
用途:
# 发送免费ARP(Linux)
arping -U -I eth0 192.168.1.10
# 发送免费ARP请求
arping -A -I eth0 192.168.1.10
# 使用nping发送
nping --arp-type ARP-reply --arp-sender-mac AA:BB:CC:DD:EE:FF \
--arp-sender-ip 192.168.1.10 --arp-target-mac FF:FF:FF:FF:FF:FF \
--arp-target-ip 192.168.1.10 -e eth0代理ARP(Proxy ARP)
代理ARP允许路由器代替另一个网络上的主机回复ARP请求,使不同子网的主机能够在不配置默认网关的情况下通信。
# Linux启用/禁用代理ARP
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
# 或通过sysctl
sysctl -w net.ipv4.conf.eth0.proxy_arp=1ARP欺骗(ARP Spoofing)
ARP协议没有认证机制,攻击者可以发送伪造的ARP应答来毒化目标主机的ARP缓存。
检测与防御:
# 检测ARP欺骗
# 1. 查看ARP表中是否有重复MAC
arp -a | awk '{print $4}' | sort | uniq -d
# 2. 使用arpwatch监控ARP变化
sudo arpwatch -i eth0
# 3. 使用arping验证网关MAC
arping -I eth0 192.168.1.1
# 防御措施:
# 1. 静态ARP绑定(小型网络)
sudo arp -s 192.168.1.1 00:11:22:33:44:55
# 2. 交换机端口安全 + DAI(Dynamic ARP Inspection)
# Cisco交换机配置示例:
# ip arp inspection vlan 10
# interface GigabitEthernet0/1
# ip arp inspection trust (上联端口设为信任)
# 3. Linux内核ARP保护
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announceRARP(反向地址解析协议)
RARP是ARP的反向操作:已知MAC地址,查询对应的IP地址。主要用于无盘工作站启动时获取IP地址。
RARP流程:
1. 无盘工作站广播RARP请求(携带自身MAC地址)
2. RARP服务器查询配置表
3. 返回对应的IP地址
现状:RARP已被BOOTP和DHCP取代NDP(IPv6邻居发现协议)
在IPv6中,NDP(Neighbor Discovery Protocol)取代了ARP,基于ICMPv6实现。
NDP的主要功能:
| ICMPv6类型 | 消息 | 功能 |
|---|---|---|
| 133 | Router Solicitation | 请求路由器通告 |
| 134 | Router Advertisement | 路由器通告(前缀、默认网关) |
| 135 | Neighbor Solicitation | 邻居请求(类似ARP请求) |
| 136 | Neighbor Advertisement | 邻居通告(类似ARP应答) |
| 137 | Redirect | 重定向 |
# 查看IPv6邻居表
ip -6 neigh show
# 输出示例:
# fe80::1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
# 2001:db8::100 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALENDP使用Solicited-Node组播地址(FF02::1:FFxx:xxxx)代替广播,大幅减少了网络中的无效流量。
ARP在VLAN环境中的行为
VLAN将广播域隔离,ARP广播只在同一VLAN内传播。跨VLAN通信需要通过三层设备(路由器或三层交换机)。
总结
ARP是IPv4网络中连接网络层和数据链路层的关键协议。虽然简单,但它的无认证特性带来了安全风险。在IPv6网络中,NDP以更安全和高效的方式替代了ARP。在生产环境中,应通过DAI、静态绑定等手段防御ARP欺骗攻击,并合理配置ARP缓存参数以适应网络规模。
贡献者
更新日志
9f6c2-feat: organize wiki content and refresh site setup于