ARP协议的主要功能是在局域网中根据IP地址获取对应的MAC地址。工作原理如下:
arp [选项] [主机名或IP地址]
arp [-v] [-i 接口] -a [主机名]
arp [-v] [-i 接口] -s 主机名 MAC地址 [temp]
arp [-v] [-i 接口] -d 主机名 [pub]
arp [-v] [-i 接口] -f [文件]
| 选项 | 说明 |
|---|---|
| -a | 显示所有ARP缓存条目(等价于 arp -v) |
| -e | 以默认格式显示ARP缓存条目(Linux默认) |
| -n | 以数字形式显示IP地址(不进行DNS解析) |
| -i 接口 | 指定网络接口(如eth0、wlan0等) |
| -v | 详细模式,显示更多信息 |
| -s IP地址 MAC地址 | 添加静态ARP条目 |
| -d IP地址 | 删除指定的ARP条目 |
| -f 文件 | 从文件批量添加ARP条目 |
| --help | 显示帮助信息 |
| -V | 显示版本信息 |
| 标志位 | 状态 | 说明 |
|---|---|---|
| C | Complete | 条目完整且有效 |
| M | Permanent | 静态条目(手动添加) |
| P | Published | 发布模式,回应其他主机的ARP请求 |
| I | Invalid | 条目无效或已过期 |
| ? | Incomplete | ARP请求已发出,等待响应 |
# 查看所有ARP缓存条目
arp -a
# 以默认格式显示
arp -e
# 显示详细信息和统计
arp -v
# 不进行DNS解析,直接显示IP地址
arp -n
# arp -n 输出示例:
Address HWtype HWaddress Flags Mask Iface
192.168.1.1 ether 00:11:22:33:44:55 C eth0
192.168.1.100 ether aa:bb:cc:dd:ee:ff C eth0
192.168.1.101 ether ff:ee:dd:cc:bb:aa C eth0
# 查看eth0接口的ARP缓存
arp -i eth0
# 查看wlan0接口的ARP缓存
arp -i wlan0 -n
# 同时查看所有接口的ARP缓存
arp -a
# 查看docker虚拟接口的ARP缓存
arp -i docker0 -n
# 添加静态ARP条目(需要root权限)
sudo arp -s 192.168.1.200 00:aa:bb:cc:dd:ee
# 添加永久静态条目(重启后仍然有效)
sudo arp -s 192.168.1.200 00:aa:bb:cc:dd:ee -i eth0
# 添加发布模式的ARP条目
sudo arp -s 192.168.1.200 00:aa:bb:cc:dd:ee pub
# 添加临时静态条目(temp参数)
sudo arp -s 192.168.1.200 00:aa:bb:cc:dd:ee temp
# 删除特定IP的ARP条目
sudo arp -d 192.168.1.200
# 删除特定接口上的ARP条目
sudo arp -d 192.168.1.200 -i eth0
# 清除所有ARP缓存
sudo ip neigh flush all
# 清除特定接口的所有ARP缓存
sudo ip neigh flush dev eth0
ip neigh命令来管理ARP缓存,功能更强大。
# 创建ARP条目文件
cat > arp_entries.txt << EOF
192.168.1.201 aa:bb:cc:dd:ee:01
192.168.1.202 aa:bb:cc:dd:ee:02
192.168.1.203 aa:bb:cc:dd:ee:03
EOF
# 从文件批量添加ARP条目
sudo arp -f arp_entries.txt
# 查看添加的结果
arp -n | grep -E "192.168.1.20[1-3]"
| 字段 | 说明 | 示例 |
|---|---|---|
| Address | IP地址 | 192.168.1.1 |
| HWtype | 硬件类型(通常是ether以太网) | ether |
| HWaddress | MAC地址(硬件地址) | 00:11:22:33:44:55 |
| Flags | 标志位(C=Complete, M=Permanent等) | C(完整条目) |
| Mask | 掩码(通常为空) | * |
| Iface | 网络接口名称 | eth0 |
#!/bin/bash
# arp_monitor.sh - 监控ARP表异常变化
INTERFACE="eth0"
LOG_FILE="/var/log/arp_monitor.log"
KNOWN_MACS="/etc/known_macs.txt"
echo "开始ARP监控: $(date)" >> $LOG_FILE
while true; do
# 获取当前ARP表
CURRENT_ARPS=$(arp -n -i $INTERFACE | grep -v "incomplete")
# 检查是否有重复的MAC地址
echo "$CURRENT_ARPS" | awk '{print $3}' | sort | uniq -d | while read DUP_MAC; do
if [ -n "$DUP_MAC" ]; then
echo "警告: 检测到重复MAC地址 $DUP_MAC" >> $LOG_FILE
echo "相关IP地址:" >> $LOG_FILE
echo "$CURRENT_ARPS" | grep "$DUP_MAC" >> $LOG_FILE
echo "---" >> $LOG_FILE
fi
done
# 检查未知MAC地址
if [ -f "$KNOWN_MACS" ]; then
echo "$CURRENT_ARPS" | while read line; do
MAC=$(echo $line | awk '{print $3}')
if ! grep -q "$MAC" "$KNOWN_MACS"; then
echo "发现未知MAC地址: $MAC" >> $LOG_FILE
echo "对应条目: $line" >> $LOG_FILE
fi
done
fi
sleep 60 # 每分钟检查一次
done
#!/bin/bash
# arp_defense.sh - ARP欺骗防护脚本
GATEWAY_IP="192.168.1.1"
GATEWAY_MAC="00:11:22:33:44:55"
INTERFACE="eth0"
echo "启动ARP欺骗防护..."
# 1. 添加网关的静态ARP条目
sudo arp -s $GATEWAY_IP $GATEWAY_MAC
# 2. 设置内核参数,忽略ARP更新
sudo sysctl -w net.ipv4.conf.$INTERFACE.arp_ignore=1
sudo sysctl -w net.ipv4.conf.$INTERFACE.arp_announce=2
sudo sysctl -w net.ipv4.conf.$INTERFACE.arp_filter=1
# 3. 监控ARP表变化
while true; do
CURRENT_MAC=$(arp -n $GATEWAY_IP | awk '{print $3}' | grep -v "HWaddress")
if [ "$CURRENT_MAC" != "$GATEWAY_MAC" ]; then
echo "警告: 网关MAC地址被修改!可能遭受ARP欺骗攻击" | wall
echo "恢复正确的ARP条目..."
sudo arp -d $GATEWAY_IP
sudo arp -s $GATEWAY_IP $GATEWAY_MAC
fi
sleep 30
done
#!/bin/bash
# network_discovery.sh - 发现局域网中的设备
NETWORK="192.168.1"
INTERFACE="eth0"
echo "开始扫描网络 $NETWORK.0/24..."
echo "时间戳 | IP地址 | MAC地址 | 状态"
echo "----------------------------------"
for i in {1..254}; do
IP="$NETWORK.$i"
# 发送ARP请求
arping -c 1 -I $INTERFACE $IP > /dev/null 2>&1
# 检查ARP缓存中是否有响应
MAC=$(arp -n $IP 2>/dev/null | awk '{print $3}' | grep -v "HWaddress")
if [ -n "$MAC" ]; then
STATUS="在线"
else
STATUS="离线"
fi
echo "$(date '+%H:%M:%S') | $IP | $MAC | $STATUS"
done
# 生成设备列表
echo ""
echo "=== 在线设备列表 ==="
arp -n | grep -v "incomplete" | awk '{print $1 "\t" $3 "\t" $5}'
ip neigh命令功能更强大,推荐使用A: 主要区别:
| 特性 | arp命令 | ip neigh命令 |
|---|---|---|
| 功能范围 | 仅ARP相关操作 | 完整的邻居发现管理(ARP+NDP) |
| IPv6支持 | 不支持 | 完全支持 |
| 输出格式 | 固定格式 | 更灵活,可读性更好 |
| 状态显示 | 有限的状态标志 | 详细的状态信息 |
| 推荐程度 | 传统工具,逐步淘汰 | 现代Linux系统推荐 |
A: arp命令添加的静态条目重启后会丢失。永久保存方法:
# 方法1:使用network-scripts(RHEL/CentOS)
# 在 /etc/sysconfig/network-scripts/ifcfg-eth0 中添加:
ARP=yes
ARPCHECK=no
ARP_ENTRIES="192.168.1.1 00:11:22:33:44:55"
# 方法2:使用systemd-networkd(现代Linux)
# 创建 /etc/systemd/network/10-static-arp.network
[Match]
Name=eth0
[Network]
DHCP=no
[Neighbor]
Address=192.168.1.1
MACAddress=00:11:22:33:44:55
# 方法3:使用启动脚本
# 在 /etc/rc.local 中添加:
arp -s 192.168.1.1 00:11:22:33:44:55
# 使用ip命令(推荐)
sudo ip neigh flush all
# 使用arp命令(较旧系统)
sudo ip -s -s neigh flush all
# 清除特定接口的ARP缓存
sudo ip neigh flush dev eth0
# 通过proc文件系统
echo 1 > /proc/sys/net/ipv4/neigh/eth0/gc_stale_time
A: 检测和防御方法:
| 命令 | 主要功能 | 适用场景 |
|---|---|---|
| arp | ARP缓存管理和查看 | 传统的ARP表操作,兼容性要求 |
ip neigh |
邻居发现管理(IPv4/IPv6) | 现代Linux系统,完整功能 |
arping |
发送ARP请求探测主机 | 检测主机是否在线,ARP欺骗测试 |
arptables |
ARP包过滤 | ARP防火墙,防御ARP欺骗 |
arpwatch |
ARP变化监控 | 网络监控,异常检测 |
arp-scan |
局域网设备发现 | 网络设备扫描和发现 |
现代Linux推荐使用ip neigh命令代替arp命令:
# 查看邻居表(等价于 arp -a)
ip neigh show
# 查看特定接口的邻居表
ip neigh show dev eth0
# 添加静态ARP条目
ip neigh add 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# 删除ARP条目
ip neigh del 192.168.1.1 dev eth0
# 查看邻居表状态
ip -s neigh show
# 修改ARP条目状态
ip neigh change 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud reachable
ip neigh命令支持更多状态:permanent(永久)、noarp(不ARP)、reachable(可达)、stale(陈旧)、delay(延迟)、probe(探测)等。