linux arp命令

简介:arp命令用于显示和修改系统的ARP缓存表。ARP(Address Resolution Protocol)是将IP地址解析为MAC地址的协议,是局域网通信的基础。
ARP协议基本原理

ARP协议的主要功能是在局域网中根据IP地址获取对应的MAC地址。工作原理如下:

  1. ARP请求:主机A需要与主机B通信,但不知道B的MAC地址
  2. 广播查询:主机A向整个局域网广播ARP请求包
  3. ARP响应:主机B收到请求后,单播回复自己的MAC地址
  4. 缓存记录:主机A将IP-MAC映射存入ARP缓存表
ARP缓存表:存储在内存中的IP-MAC地址映射表,避免每次通信都需要ARP查询,提高网络效率。

语法格式

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 显示版本信息

ARP缓存条目状态

标志位 状态 说明
C Complete 条目完整且有效
M Permanent 静态条目(手动添加)
P Published 发布模式,回应其他主机的ARP请求
I Invalid 条目无效或已过期
? Incomplete ARP请求已发出,等待响应

使用示例

示例1:查看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
示例2:查看特定接口的ARP缓存
# 查看eth0接口的ARP缓存
arp -i eth0

# 查看wlan0接口的ARP缓存
arp -i wlan0 -n

# 同时查看所有接口的ARP缓存
arp -a

# 查看docker虚拟接口的ARP缓存
arp -i docker0 -n
示例3:添加静态ARP条目
# 添加静态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
注意:静态ARP条目可以防止ARP欺骗攻击,但配置错误会导致网络连接问题。
示例4:删除ARP条目
# 删除特定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
现代Linux系统更推荐使用ip neigh命令来管理ARP缓存,功能更强大。
示例5:从文件批量添加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]"

ARP缓存字段详解

输出字段说明
字段 说明 示例
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

实战应用场景

场景1:网络故障排查
排查IP地址冲突或ARP欺骗:
#!/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
场景2:ARP欺骗防护
防御ARP欺骗攻击:
#!/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
场景3:网络设备发现
#!/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}'
ARP正常情况
  • 网关有正确的MAC地址条目
  • 常用设备有稳定的ARP条目
  • 没有重复的MAC地址
  • ARP表大小稳定
  • 标志位多为"C"(Complete)
  • 条目老化时间正常
  • 没有大量"Incomplete"条目
ARP异常情况
  • 网关MAC地址频繁变化
  • 同一MAC对应多个IP
  • 大量"Incomplete"条目
  • ARP表大小异常增长
  • 出现未知的MAC地址
  • 网络时断时续
  • MAC地址全为0或全为F
重要注意事项
  • 权限要求:修改ARP表需要root权限
  • 临时性:ARP缓存条目在重启后会丢失(静态条目除外)
  • 接口限制:不同网络接口有独立的ARP缓存表
  • 老化时间:动态ARP条目有老化时间,默认15-20分钟
  • 网络范围:ARP仅用于同一局域网(广播域)
  • 安全风险:ARP没有认证机制,易受欺骗攻击
  • IPv6不同:IPv6使用NDP(邻居发现协议),不是ARP
  • 现代替代ip neigh命令功能更强大,推荐使用
常见问题解答
Q: arp和ip neigh命令有什么区别?

A: 主要区别:

特性 arp命令 ip neigh命令
功能范围 仅ARP相关操作 完整的邻居发现管理(ARP+NDP)
IPv6支持 不支持 完全支持
输出格式 固定格式 更灵活,可读性更好
状态显示 有限的状态标志 详细的状态信息
推荐程度 传统工具,逐步淘汰 现代Linux系统推荐
Q: 如何永久保存静态ARP条目?

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
Q: 如何清除所有ARP缓存?
# 使用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
Q: ARP欺骗攻击如何检测和防御?

A: 检测和防御方法:

  1. 检测:监控ARP表变化,检查MAC地址冲突
  2. 静态ARP:为关键设备(网关、服务器)设置静态ARP条目
  3. ARP防火墙:使用arptables或网络设备的ARP防护功能
  4. 网络隔离:使用VLAN隔离敏感设备
  5. 加密通信:使用IPsec或SSL/TLS加密数据
相关命令对比
命令 主要功能 适用场景
arp ARP缓存管理和查看 传统的ARP表操作,兼容性要求
ip neigh 邻居发现管理(IPv4/IPv6) 现代Linux系统,完整功能
arping 发送ARP请求探测主机 检测主机是否在线,ARP欺骗测试
arptables ARP包过滤 ARP防火墙,防御ARP欺骗
arpwatch ARP变化监控 网络监控,异常检测
arp-scan 局域网设备发现 网络设备扫描和发现
ip neigh命令参考

现代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(探测)等。