linux arpwatch命令

命令简介

arpwatch 是一个网络监控工具,用于监听网络中的ARP(Address Resolution Protocol,地址解析协议)流量,并记录IP地址和MAC地址的对应关系变化。它能检测ARP欺骗攻击和IP地址冲突,是网络安全监控的重要工具。

安全提示:arpwatch可以帮助检测ARP欺骗攻击,但需要结合其他安全措施(如静态ARP表、端口安全等)来全面保护网络安全。

基本语法

# 基本格式
arpwatch [选项] [网络接口]

# 常用格式
arpwatch -i eth0
arpwatch -d -i eth0
arpwatch -f /var/lib/arpwatch/arp.dat -i eth0

ARP协议基础

ARP协议作用

ARP协议用于将IP地址解析为MAC地址,工作原理:

  1. 主机发送ARP请求广播询问目标IP的MAC地址
  2. 目标主机回复ARP响应包含其MAC地址
  3. 发送方将IP-MAC映射缓存到ARP表中
  4. ARP表有缓存时间,超时后需要重新解析
ARP欺骗攻击

攻击者发送伪造的ARP响应,目的是:

  • 中间人攻击(窃听通信)
  • 拒绝服务攻击(网络中断)
  • 流量重定向(劫持连接)
  • 会话劫持(获取敏感信息)

arpwatch可以检测异常的ARP变化!

常用选项

选项 描述
-i interface 指定要监听的网络接口(如eth0, enp3s0)
-d 前台调试模式运行(不进入后台)
-f file 指定ARP数据库文件(默认:/var/lib/arpwatch/arp.dat)
-r file 从指定的pcap文件中读取数据(而不是实时捕获)
-u user 指定运行arpwatch的用户(默认:arpwatch)
-e email 将报告发送到指定邮箱(需配置邮件服务器)
-n net[/len] 仅监控指定网络(如192.168.1.0/24)
-s sendmail_path 指定sendmail程序的路径
-m addr 从邮件地址中省略主机名
-N 不执行反向DNS查询
-F 不执行正向DNS查询
-a 忽略非本地网络地址的ARP数据包

实际示例

示例1:基本使用 - 启动arpwatch监控

在不同系统上启动arpwatch服务:

# 查看可用的网络接口
ip link show
# 或
ifconfig -a

# 在eth0接口上启动arpwatch(前台模式)
sudo arpwatch -i eth0 -d

# 在enp3s0接口上启动(后台模式)
sudo arpwatch -i enp3s0

# 启动并指定数据库文件
sudo arpwatch -i eth0 -f /var/lib/arpwatch/my_network.dat

# 启动并限制监控的网段
sudo arpwatch -i eth0 -n 192.168.1.0/24

# 启动并禁用DNS查询(提高性能)
sudo arpwatch -i eth0 -N -F

# 查看arpwatch进程
ps aux | grep arpwatch
# 输出示例:
# arpwatch  1234  0.0  0.1  12345  6789 ?        Ss   10:00   0:00 arpwatch -i eth0

示例2:系统服务管理

通过系统服务管理arpwatch:

# 安装arpwatch(如果未安装)
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install arpwatch

# RHEL/CentOS
sudo yum install arpwatch
# 或
sudo dnf install arpwatch

# 启动arpwatch服务
sudo systemctl start arpwatch
# 或
sudo service arpwatch start

# 停止arpwatch服务
sudo systemctl stop arpwatch
sudo service arpwatch stop

# 重启服务
sudo systemctl restart arpwatch
sudo service arpwatch restart

# 查看服务状态
sudo systemctl status arpwatch
sudo service arpwatch status

# 启用开机自启动
sudo systemctl enable arpwatch
sudo chkconfig arpwatch on  # 旧版系统

# 禁用开机自启动
sudo systemctl disable arpwatch
sudo chkconfig arpwatch off  # 旧版系统

# 查看服务日志
sudo journalctl -u arpwatch
sudo journalctl -u arpwatch -f  # 实时查看
sudo tail -f /var/log/syslog | grep arpwatch  # Debian/Ubuntu
sudo tail -f /var/log/messages | grep arpwatch  # RHEL/CentOS

示例3:查看和解析arpwatch数据

查看arpwatch收集的数据和报告:

# 查看ARP数据库文件
sudo cat /var/lib/arpwatch/arp.dat
# 输出示例:
# 192.168.1.1 00:11:22:33:44:55 hostname1
# 192.168.1.100 aa:bb:cc:dd:ee:ff hostname2
# 192.168.1.101 11:22:33:44:55:66 hostname3

# 查看ARP变化日志
sudo cat /var/log/arpwatch/*.log
# 或
sudo tail -f /var/log/arpwatch/arpwatch.log

# 查看系统日志中的arpwatch记录
sudo grep arpwatch /var/log/syslog
sudo grep arpwatch /var/log/messages

# 解析二进制ARP数据库
sudo arpfetch /var/lib/arpwatch/arp.dat
# 或
sudo strings /var/lib/arpwatch/arp.dat

# 查看当前ARP表
arp -a
arp -n
# 或
ip neigh show

# 比较当前ARP表和arpwatch数据库
arp -n | sort > current_arp.txt
sudo cat /var/lib/arpwatch/arp.dat | sort > arpwatch_db.txt
diff current_arp.txt arpwatch_db.txt

示例4:配置邮件警报

配置arpwatch发送邮件警报:

# 1. 首先安装和配置邮件服务器
# 安装postfix或sendmail
sudo apt-get install postfix mailutils  # Debian/Ubuntu
sudo yum install postfix mailx         # RHEL/CentOS

# 2. 配置arpwatch发送邮件
# 编辑arpwatch配置文件
sudo nano /etc/default/arpwatch  # Debian/Ubuntu
# 或
sudo nano /etc/sysconfig/arpwatch  # RHEL/CentOS

# 在配置文件中设置:
# 启用邮件通知
OPTIONS="-e admin@example.com -s /usr/sbin/sendmail"
# 指定网络接口
INTERFACES="eth0"
# 指定接收邮箱
EMAIL_FROM="arpwatch@example.com"

# 3. 通过命令行参数启动
sudo arpwatch -i eth0 -e admin@example.com -s /usr/sbin/sendmail

# 4. 测试邮件发送
echo "Test email from arpwatch" | mail -s "Test" admin@example.com

# 5. 重启服务
sudo systemctl restart arpwatch

# 6. 查看邮件日志
sudo tail -f /var/log/mail.log
# 或检查用户邮箱
# 典型的arpwatch邮件内容:
# 主题: new station
# 内容: 主机 192.168.1.50 的MAC地址为 aa:bb:cc:dd:ee:ff
#
# 主题: changed ethernet address
# 内容: 主机 192.168.1.50 的MAC地址从 aa:bb:cc:dd:ee:ff 变为 11:22:33:44:55:66
# (这可能表示ARP欺骗攻击!)

示例5:高级配置和脚本示例

自定义配置和监控脚本:

#!/bin/bash
# 文件名: arpwatch_monitor.sh
# 功能: 增强的ARP监控脚本

INTERFACE="eth0"
LOG_FILE="/var/log/arpwatch_monitor.log"
ALERT_EMAIL="admin@example.com"
KNOWN_HOSTS="/etc/arpwatch/known_hosts.txt"

# 创建日志目录
mkdir -p /var/log/arpwatch/

# 记录开始时间
echo "=== ARP监控开始于 $(date) ===" >> $LOG_FILE

# 启动arpwatch
echo "启动arpwatch监控接口 $INTERFACE ..." >> $LOG_FILE
arpwatch -i $INTERFACE -f /var/lib/arpwatch/arp.dat >> $LOG_FILE 2>&1 &

# 监控进程
sleep 2
if ps aux | grep -q "[a]rpwatch.*$INTERFACE"; then
    echo "arpwatch启动成功,PID: $(pgrep -f "arpwatch.*$INTERFACE")" >> $LOG_FILE
else
    echo "arpwatch启动失败!" >> $LOG_FILE
    exit 1
fi

# 每5分钟检查一次ARP变化
while true; do
    TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

    # 检查ARP变化
    CHANGES=$(tail -20 /var/log/syslog | grep -i "arpwatch.*changed\|arpwatch.*flip\|arpwatch.*new" | tail -5)

    if [ -n "$CHANGES" ]; then
        echo "[$TIMESTAMP] 检测到ARP变化:" >> $LOG_FILE
        echo "$CHANGES" >> $LOG_FILE

        # 检查是否是已知主机
        for change in $CHANGES; do
            IP=$(echo $change | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}')
            if [ -n "$IP" ]; then
                if grep -q $IP $KNOWN_HOSTS 2>/dev/null; then
                    echo "  $IP 是已知主机,可能是正常变更" >> $LOG_FILE
                else
                    echo "  [警告] $IP 是未知主机!" >> $LOG_FILE
                    # 发送警报邮件
                    echo "检测到未知主机的ARP变化: $change" | mail -s "ARP警报: 未知主机" $ALERT_EMAIL
                fi
            fi
        done
    fi

    # 检查ARP欺骗迹象(同一IP对应多个MAC)
    DUP_IPS=$(arp -n | awk '{print $1}' | sort | uniq -d)
    if [ -n "$DUP_IPS" ]; then
        echo "[$TIMESTAMP] [严重] 检测到可能的ARP欺骗:" >> $LOG_FILE
        for ip in $DUP_IPS; do
            MACS=$(arp -n | grep "^$ip" | awk '{print $3}' | sort | uniq)
            echo "  IP: $ip 对应多个MAC: $MACS" >> $LOG_FILE
            echo "严重警告: IP $ip 对应多个MAC地址: $MACS" | mail -s "ARP欺骗警报" $ALERT_EMAIL
        done
    fi

    sleep 300  # 等待5分钟
done

示例6:故障排查和调试

排查arpwatch问题和进行调试:

# 检查arpwatch是否正在运行
ps aux | grep arpwatch
sudo systemctl status arpwatch

# 检查网络接口是否正确
ip link show
# 确保接口处于UP状态
sudo ip link set eth0 up

# 以调试模式运行arpwatch
sudo arpwatch -i eth0 -d
# 在终端查看实时输出

# 检查ARP数据库文件权限
ls -la /var/lib/arpwatch/
# 确保arpwatch用户可以读写
sudo chown -R arpwatch:arpwatch /var/lib/arpwatch/
sudo chmod 755 /var/lib/arpwatch/

# 检查日志文件
sudo tail -f /var/log/syslog | grep arpwatch
sudo journalctl -f | grep arpwatch

# 测试ARP捕获
sudo tcpdump -i eth0 arp -n
# 应该能看到ARP请求和响应
# 如果看不到ARP流量,检查网络连接

# 手动发送ARP请求测试
arping -c 3 192.168.1.1
# 然后检查arpwatch日志
sudo tail -f /var/log/syslog | grep arpwatch

# 重置ARP数据库(谨慎操作)
sudo systemctl stop arpwatch
sudo mv /var/lib/arpwatch/arp.dat /var/lib/arpwatch/arp.dat.backup.$(date +%Y%m%d)
sudo systemctl start arpwatch

# 检查配置文件
cat /etc/default/arpwatch  # Debian/Ubuntu
cat /etc/sysconfig/arpwatch  # RHEL/CentOS

# 验证邮件配置
echo "Test" | mail -s "Test" admin@example.com

# 检查防火墙是否允许ARP流量
# ARP是二层协议,通常不受防火墙影响
# 但确保没有奇怪的iptables规则
sudo iptables -L -n -v

ARP攻击检测和防御

ARP欺骗迹象

arpwatch可检测的攻击迹象:

  • MAC地址翻转:同一IP频繁变更MAC地址
  • 多MAC对应一IP:多个MAC地址声称拥有同一IP
  • 异常MAC厂商:检测到不常见的MAC厂商前缀
  • 大量ARP请求:短时间内大量ARP请求
  • 广播地址欺骗:攻击者伪装成网关或DNS服务器
ARP攻击防御措施

结合arpwatch的其他防御手段:

  • 静态ARP表:关键设备设置静态ARP条目
  • 端口安全:交换机配置端口绑定MAC地址
  • DHCP侦听:防止恶意DHCP服务器
  • 动态ARP检测:交换机DAI功能验证ARP
  • VPN/加密:保护敏感数据传输
  • 网络分段:减少攻击面

配置文件说明

Debian/Ubuntu: /etc/default/arpwatch
# 网络接口配置
INTERFACES="eth0"
# 可以监控多个接口
# INTERFACES="eth0 eth1"

# 附加选项
OPTIONS=""
# 邮件警报
# OPTIONS="-e admin@example.com"
# 指定数据库文件
# OPTIONS="-f /var/lib/arpwatch/arp.dat"
# 限制监控网段
# OPTIONS="-n 192.168.1.0/24"

# 运行用户
USER="arpwatch"
GROUP="arpwatch"

# PID文件
PIDFILE="/var/run/arpwatch.pid"

# 其他选项
# -N: 禁用反向DNS查询
# -F: 禁用正向DNS查询
# -a: 忽略非本地网络地址
RHEL/CentOS: /etc/sysconfig/arpwatch
# 网络接口
IFACE="eth0"

# 附加参数
ARGS=""
# 邮件警报
# ARGS="-e admin@example.com"
# 调试模式
# ARGS="-d"

# 其他设置
# 数据库文件
# DATABASE="/var/lib/arpwatch/arp.dat"
# 运行用户
# USER="arpwatch"

# 日志文件
# LOGFILE="/var/log/arpwatch.log"

# 注意:RHEL/CentOS中通常还需要配置
# /etc/arpwatch/arpwatch.conf 文件

常见问题

可能原因和解决方案:

  1. 网络接口问题:确认接口正确并处于UP状态
    ip link show eth0
    sudo ethtool eth0 | grep "Link detected"
  2. 权限问题:确保arpwatch用户有权限捕获数据包
    # 检查arpwatch用户
    id arpwatch
    # 或设置capabilities
    sudo setcap cap_net_raw=ep /usr/sbin/arpwatch
  3. 防火墙/安全组:检查是否有过滤ARP的规则
  4. 网络静默:如果网络很空闲,可能没有ARP流量
    # 生成一些ARP流量测试
    arping -c 5 192.168.1.1
    # 或ping广播地址
    ping -c 3 192.168.1.255
  5. 日志配置:检查syslog配置
    grep arpwatch /etc/rsyslog.conf /etc/rsyslog.d/*.conf

正常变化:

  • DHCP分配新IP给设备
  • 设备更换网卡
  • 虚拟机迁移到不同主机
  • 网络设备维护(交换机重启)
  • 设备从睡眠/休眠恢复

攻击迹象:

  • 核心设备(网关、DNS、服务器)MAC频繁变化
  • 同一IP短时间内对应多个不同MAC地址
  • 检测到未知或不常见的MAC厂商前缀
  • ARP响应速率异常高
  • 检测到广播地址的异常ARP响应

最佳实践:建立已知主机白名单,对关键设备设置静态ARP条目。

arpwatch对网络性能影响很小,但需要考虑:

  • CPU使用:通常低于1%,但在高流量网络中可能稍高
  • 内存使用:约5-20MB,取决于数据库大小
  • 网络影响:只监听不发送,不增加网络流量
  • DNS查询:如果启用DNS查询,可能会有额外延迟

优化建议:

# 1. 禁用DNS查询
sudo arpwatch -i eth0 -N -F

# 2. 限制监控网段
sudo arpwatch -i eth0 -n 192.168.1.0/24

# 3. 增加数据库清理频率
# 编辑配置文件,添加定期清理任务
sudo crontab -e
# 添加:0 2 * * * /usr/sbin/arpwatch -k

# 4. 使用更高效的数据包捕获
# 确保使用PF_RING或AF_PACKET(如果支持)

集成方法:

  1. 日志收集:将arpwatch日志发送到中央日志服务器
    # 配置rsyslog发送日志
    # 在/etc/rsyslog.d/arpwatch.conf中添加:
    :programname, isequal, "arpwatch" @logserver.example.com:514
  2. 监控告警:使用监控工具解析日志
    # Nagios/Icinga插件示例
    #!/bin/bash
    # 检查最近的ARP变化
    CHANGES=$(tail -100 /var/log/syslog | grep -c "arpwatch.*changed")
    if [ $CHANGES -gt 3 ]; then
        echo "CRITICAL: 检测到 $CHANGES 次ARP变化"
        exit 2
    else
        echo "OK: ARP监控正常"
        exit 0
    fi
  3. 数据库集成:将ARP数据导入数据库
    # 定期导出ARP数据到MySQL
    #!/bin/bash
    mysql -u monitor -p密码 monitoring << EOF
    LOAD DATA LOCAL INFILE '/var/lib/arpwatch/arp.dat'
    INTO TABLE arp_table
    FIELDS TERMINATED BY ' ';
    EOF
  4. API集成:创建REST API提供ARP数据
    # Python Flask示例
    from flask import Flask, jsonify
    import subprocess
    
    app = Flask(__name__)
    
    @app.route('/api/arpwatch/status')
    def arp_status():
        result = subprocess.run(['arp', '-n'], capture_output=True, text=True)
        return jsonify({'arp_table': result.stdout})
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)