linux arping命令

简介:arping是一个用于发送ARP请求到相邻主机的工具。它可以通过发送ARP请求包来测试网络连通性、检测IP地址冲突、查询MAC地址、测试网络设备响应等,是网络管理员常用的诊断工具。
arping的主要功能
  • 网络连通性测试:检查主机是否在线
  • IP地址冲突检测:发现重复的IP地址
  • MAC地址查询:获取IP对应的MAC地址
  • ARP缓存更新:主动更新本地ARP缓存
  • 网络设备测试:测试交换机、路由器等设备
  • ARP欺骗检测:检测ARP欺骗攻击
  • 网络故障诊断:定位网络层问题
  • 网络拓扑发现:帮助了解网络结构
  • 主机存活检测:替代ping的另一种方式
  • 防火墙测试:测试防火墙的ARP过滤规则

语法格式

arping [选项] 目标IP地址
arping [选项] -s 源IP地址 目标IP地址

常用选项

选项 说明
-A 发送ARP应答包而不是请求包
-b 发送广播ARP请求(默认)
-c 数量 发送指定数量的ARP请求后停止
-D 重复地址检测模式(检测IP冲突)
-f 收到第一个响应后立即退出
-I 接口 指定网络接口(如eth0、wlan0)
-q 安静模式,不显示详细信息
-s 源IP 指定源IP地址
-U 发送未经请求的ARP(更新邻居ARP缓存)
-V 显示版本信息
-w 超时 设置超时时间(秒)
-h 显示帮助信息

ARP数据包类型

数据包类型 选项 用途
ARP请求(广播) -b(默认) 查询IP地址对应的MAC地址
ARP应答(单播) -A 响应ARP请求,通告自己的MAC地址
无偿ARP(广播) -U 主动通告IP-MAC映射,更新邻居缓存
重复地址检测 -D 检测网络中是否有IP地址冲突

使用示例

示例1:基本使用 - 检测主机是否在线
# 检测192.168.1.1是否在线
arping 192.168.1.1

# 发送5个ARP请求后停止
arping -c 5 192.168.1.1

# 指定网络接口(多网卡环境)
arping -I eth0 192.168.1.1

# 安静模式,只显示结果
arping -c 3 -q 192.168.1.1 && echo "主机在线" || echo "主机离线"
# arping输出示例:
ARPING 192.168.1.1 from 192.168.1.100 eth0
Unicast reply from 192.168.1.1 [00:11:22:33:44:55]  0.873ms
Unicast reply from 192.168.1.1 [00:11:22:33:44:55]  0.921ms
Unicast reply from 192.168.1.1 [00:11:22:33:44:55]  0.891ms
Sent 3 probes (1 broadcast(s))
Received 3 response(s)
示例2:IP地址冲突检测
# 检测IP地址是否已被使用(DAD模式)
arping -D 192.168.1.100

# 检测并指定网络接口
arping -D -I eth0 192.168.1.100

# 检测冲突并显示详细信息
arping -D -c 3 192.168.1.100
# 无冲突时输出(只有一个响应):
ARPING 192.168.1.100 from 0.0.0.0 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)

# 有冲突时输出(多个响应):
ARPING 192.168.1.100 from 0.0.0.0 eth0
Unicast reply from 192.168.1.100 [AA:BB:CC:DD:EE:FF]  1.234ms
Unicast reply from 192.168.1.100 [11:22:33:44:55:66]  2.345ms  # 冲突!
Sent 1 probes (1 broadcast(s))
Received 2 response(s)
如果收到多个响应,表示有IP地址冲突,需要立即解决。
示例3:主动更新ARP缓存
# 发送无偿ARP更新邻居缓存
sudo arping -U 192.168.1.100

# 指定源IP地址
sudo arping -U -s 192.168.1.100 192.168.1.255

# 发送ARP应答包
sudo arping -A 192.168.1.100

# 广播无偿ARP更新整个网络
sudo arping -U -c 2 -I eth0 192.168.1.100
无偿ARP(Gratuitous ARP)用于主动通知网络中的其他设备自己的MAC地址,常用于高可用切换或MAC地址变更时更新邻居缓存。
示例4:高级用法和组合选项
# 快速检测,收到第一个响应就退出
arping -f 192.168.1.1

# 设置超时时间(秒)
arping -w 3 192.168.1.1

# 指定源IP地址(模拟其他主机)
sudo arping -s 192.168.1.50 192.168.1.1

# 连续检测并显示时间戳
while true; do
    echo -n "$(date '+%H:%M:%S') - "
    arping -c 1 -q 192.168.1.1 && echo "在线" || echo "离线"
    sleep 5
done
示例5:输出结果处理和分析
#!/bin/bash
# arping结果分析脚本

TARGET="192.168.1.1"
INTERFACE="eth0"

echo "测试目标: $TARGET"
echo "开始时间: $(date)"
echo ""

# 运行arping并捕获输出
OUTPUT=$(arping -c 5 -I $INTERFACE $TARGET 2>&1)

# 提取统计信息
SENT=$(echo "$OUTPUT" | grep "Sent" | awk '{print $2}')
RECEIVED=$(echo "$OUTPUT" | grep "Received" | awk '{print $2}')

echo "发送包数: $SENT"
echo "接收响应: $RECEIVED"

# 计算成功率
if [ "$SENT" -gt 0 ]; then
    SUCCESS_RATE=$((RECEIVED * 100 / SENT))
    echo "成功率: $SUCCESS_RATE%"

    if [ "$SUCCESS_RATE" -lt 80 ]; then
        echo "警告: 网络质量较差!"
    fi
fi

# 提取MAC地址
MAC=$(echo "$OUTPUT" | grep "reply from" | head -1 | awk '{print $4}')
echo "MAC地址: $MAC"

# 提取平均延迟(如果有响应)
if [ "$RECEIVED" -gt 0 ]; then
    AVG_LATENCY=$(echo "$OUTPUT" | grep "reply from" | awk -F' ' '{sum+=$5} END {print sum/NR}')
    echo "平均延迟: ${AVG_LATENCY}ms"
fi

实战应用场景

场景1:ARP欺骗检测和防护
检测ARP欺骗攻击:
#!/bin/bash
# arp_spoof_detection.sh

GATEWAY="192.168.1.1"
KNOWN_MAC="00:11:22:33:44:55"
INTERFACE="eth0"
LOG_FILE="/var/log/arp_spoof.log"

echo "=== ARP欺骗检测开始: $(date) ===" >> $LOG_FILE

while true; do
    # 获取网关的当前MAC地址
    CURRENT_MAC=$(arping -c 1 -I $INTERFACE $GATEWAY 2>/dev/null | \
                 grep "reply from" | awk '{print $4}' | tr -d '[]')

    if [ -n "$CURRENT_MAC" ]; then
        if [ "$CURRENT_MAC" != "$KNOWN_MAC" ]; then
            echo "警报: 检测到ARP欺骗!" >> $LOG_FILE
            echo "时间: $(date)" >> $LOG_FILE
            echo "预期MAC: $KNOWN_MAC" >> $LOG_FILE
            echo "实际MAC: $CURRENT_MAC" >> $LOG_FILE

            # 发送警报
            wall "ARP欺骗警报!网关MAC地址被篡改!"

            # 恢复正确的ARP条目
            sudo arp -d $GATEWAY
            sudo arping -c 1 -I $INTERFACE $GATEWAY > /dev/null 2>&1
        fi
    fi

    sleep 30  # 每30秒检查一次
done
场景2:网络设备发现和监控
批量扫描网络中的活动设备:
#!/bin/bash
# network_scanner.sh

NETWORK="192.168.1"
INTERFACE="eth0"
OUTPUT_FILE="network_devices_$(date +%Y%m%d).csv"

echo "IP地址,MAC地址,设备名,响应时间(ms),状态" > $OUTPUT_FILE

echo "开始扫描网络 $NETWORK.0/24..."
echo "IP地址       MAC地址             状态"
echo "----------------------------------------"

for i in {1..254}; do
    IP="$NETWORK.$i"

    # 发送单个ARP请求(安静模式)
    RESULT=$(arping -c 1 -w 1 -I $INTERFACE -q $IP 2>&1)

    if [ $? -eq 0 ]; then
        # 获取MAC地址和延迟
        DETAIL=$(arping -c 1 -I $INTERFACE $IP 2>/dev/null | grep "reply from")
        MAC=$(echo $DETAIL | awk '{print $4}' | tr -d '[]')
        LATENCY=$(echo $DETAIL | awk '{print $5}' | sed 's/ms//')

        # 尝试获取主机名
        HOSTNAME=$(nslookup $IP 2>/dev/null | grep "name =" | awk '{print $4}' | sed 's/\.$//')
        if [ -z "$HOSTNAME" ]; then
            HOSTNAME="未知"
        fi

        echo "$IP  $MAC  在线"
        echo "$IP,$MAC,$HOSTNAME,$LATENCY,在线" >> $OUTPUT_FILE
    else
        echo "$IP                 离线"
        echo "$IP,,,0,离线" >> $OUTPUT_FILE
    fi
done

echo ""
echo "扫描完成,结果已保存到: $OUTPUT_FILE"
echo "在线设备总数: $(grep -c "在线" $OUTPUT_FILE)"
场景3:服务器高可用切换测试
测试高可用集群的ARP切换:
#!/bin/bash
# ha_arp_test.sh

VIRTUAL_IP="192.168.1.100"
PRIMARY_MAC="aa:bb:cc:dd:ee:01"
BACKUP_MAC="aa:bb:cc:dd:ee:02"
INTERFACE="eth0"
LOG_FILE="/var/log/ha_arp_test.log"

echo "=== 高可用ARP切换测试开始: $(date) ===" >> $LOG_FILE

while true; do
    # 检测当前活动的MAC地址
    CURRENT_MAC=$(arping -c 1 -I $INTERFACE $VIRTUAL_IP 2>/dev/null | \
                 grep "reply from" | awk '{print $4}' | tr -d '[]')

    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

    if [ "$CURRENT_MAC" = "$PRIMARY_MAC" ]; then
        STATUS="主服务器活动"
    elif [ "$CURRENT_MAC" = "$BACKUP_MAC" ]; then
        STATUS="备份服务器活动"
    else
        STATUS="未知MAC: $CURRENT_MAC"
    fi

    echo "$TIMESTAMP - $STATUS" >> $LOG_FILE

    # 测试连接性
    if arping -c 1 -I $INTERFACE -q $VIRTUAL_IP > /dev/null 2>&1; then
        LATENCY=$(arping -c 1 -I $INTERFACE $VIRTUAL_IP 2>/dev/null | \
                 grep "reply from" | awk '{print $5}' | sed 's/ms//')
        echo "  响应时间: ${LATENCY}ms" >> $LOG_FILE
    else
        echo "  错误: 虚拟IP无响应!" >> $LOG_FILE
    fi

    sleep 10  # 每10秒检查一次
done
arping的优势
  • 工作在数据链路层,不受防火墙ICMP规则影响
  • 可以检测IP地址冲突
  • 能够获取准确的MAC地址
  • 可以测试ARP缓存更新
  • 检测网络设备响应更准确
  • 适合局域网内部诊断
  • 可以主动更新邻居ARP缓存
注意事项
  • 需要root权限执行某些操作
  • 只能在局域网内使用
  • 可能被网络设备的安全策略阻止
  • 频繁使用可能影响网络性能
  • 不同系统的arping版本可能有差异
  • 某些选项需要特定内核支持
  • 不能跨路由器使用
网络故障诊断流程
  1. 症状:网络连接不稳定,时断时续
  2. 检查ARP缓存arp -a 查看是否有异常条目
  3. 测试连通性arping 目标IP 检查是否可达
  4. 检测IP冲突arping -D 目标IP 检查IP地址冲突
  5. 检查MAC地址:对比已知正确的MAC地址
  6. 测试网关arping 网关IP 检查网关响应
  7. 监控ARP变化:使用脚本监控ARP表变化
  8. 解决问题:根据发现的问题采取相应措施
自动化诊断脚本:
#!/bin/bash
# network_diagnosis.sh

GATEWAY="192.168.1.1"
DNS_SERVER="8.8.8.8"
INTERFACE="eth0"

echo "=== 网络诊断报告 $(date) ==="
echo ""

echo "1. 测试本地接口..."
ip addr show $INTERFACE | grep "inet " | awk '{print "IP地址: "$2}'
echo ""

echo "2. 测试网关连通性..."
if arping -c 2 -I $INTERFACE $GATEWAY > /dev/null 2>&1; then
    echo "网关 $GATEWAY 可达"
    MAC=$(arping -c 1 -I $INTERFACE $GATEWAY 2>/dev/null | grep "reply from" | awk '{print $4}')
    echo "网关MAC地址: $MAC"
else
    echo "错误: 网关不可达!"
fi
echo ""

echo "3. 检测IP地址冲突..."
if arping -D -c 1 -I $INTERFACE $GATEWAY > /dev/null 2>&1; then
    echo "网关IP无冲突"
else
    echo "警告: 检测到IP地址冲突!"
fi
echo ""

echo "4. 测试外部网络..."
if ping -c 2 -W 1 $DNS_SERVER > /dev/null 2>&1; then
    echo "外部网络可达"
else
    echo "错误: 外部网络不可达"
fi
常见问题解答
Q: 如何安装arping?
# Ubuntu/Debian
sudo apt install iputils-arping

# RHEL/CentOS 7及以下
sudo yum install iputils

# RHEL/CentOS 8/Fedora
sudo dnf install iputils

# 从源码编译(iputils包)
wget https://github.com/iputils/iputils/archive/refs/tags/20211215.tar.gz
tar xzf 20211215.tar.gz
cd iputils-20211215
meson build
cd build
ninja
sudo ninja install
Q: arping和ping有什么区别?

A: 主要区别:

特性 arping ping
工作层级 数据链路层(二层) 网络层(三层)
协议 ARP协议 ICMP协议
使用范围 仅限于局域网 可以跨网络
防火墙影响 通常不受ICMP规则影响 可能被ICMP规则阻止
主要用途 MAC地址查询、IP冲突检测 网络连通性测试
Q: 为什么arping有时需要sudo权限?

A: 以下情况需要root权限:

  • 发送无偿ARP(-U选项)
  • 发送ARP应答(-A选项)
  • 指定源IP地址(-s选项)
  • 在某些系统上发送原始ARP包
  • 操作需要RAW socket权限
Q: 如何检测ARP欺骗攻击?
# 方法1:监控网关MAC地址变化
KNOWN_GATEWAY_MAC="00:11:22:33:44:55"
while true; do
    CURRENT_MAC=$(arping -c 1 192.168.1.1 | grep "reply from" | awk '{print $4}')
    if [ "$CURRENT_MAC" != "$KNOWN_GATEWAY_MAC" ]; then
        echo "ARP欺骗警报!"
    fi
    sleep 30
done

# 方法2:检测同一MAC地址对应多个IP
arp -a | awk '{print $4}' | sort | uniq -d | while read MAC; do
    echo "警告: MAC地址 $MAC 对应多个IP:"
    arp -a | grep "$MAC"
done
相关工具对比
工具 主要功能 适用场景
arping ARP协议测试和诊断 局域网连通性、IP冲突检测、MAC地址查询
ping ICMP协议测试 网络层连通性测试
arp ARP缓存管理 查看和修改本地ARP缓存表
nmap 网络扫描和发现 全面的网络设备发现和端口扫描
arp-scan ARP扫描工具 快速扫描局域网所有设备
ip neigh 邻居缓存管理 现代Linux的邻居发现管理