arpwatch 是一个网络监控工具,用于监听网络中的ARP(Address Resolution Protocol,地址解析协议)流量,并记录IP地址和MAC地址的对应关系变化。它能检测ARP欺骗攻击和IP地址冲突,是网络安全监控的重要工具。
# 基本格式
arpwatch [选项] [网络接口]
# 常用格式
arpwatch -i eth0
arpwatch -d -i eth0
arpwatch -f /var/lib/arpwatch/arp.dat -i eth0
ARP协议用于将IP地址解析为MAC地址,工作原理:
攻击者发送伪造的ARP响应,目的是:
arpwatch可以检测异常的ARP变化!
在不同系统上启动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
通过系统服务管理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
查看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
配置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欺骗攻击!)
自定义配置和监控脚本:
#!/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
排查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
arpwatch可检测的攻击迹象:
结合arpwatch的其他防御手段:
/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: 忽略非本地网络地址
/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 文件
可能原因和解决方案:
ip link show eth0
sudo ethtool eth0 | grep "Link detected"
# 检查arpwatch用户
id arpwatch
# 或设置capabilities
sudo setcap cap_net_raw=ep /usr/sbin/arpwatch
# 生成一些ARP流量测试
arping -c 5 192.168.1.1
# 或ping广播地址
ping -c 3 192.168.1.255
grep arpwatch /etc/rsyslog.conf /etc/rsyslog.d/*.conf
正常变化:
攻击迹象:
最佳实践:建立已知主机白名单,对关键设备设置静态ARP条目。
arpwatch对网络性能影响很小,但需要考虑:
优化建议:
# 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(如果支持)
集成方法:
# 配置rsyslog发送日志
# 在/etc/rsyslog.d/arpwatch.conf中添加:
:programname, isequal, "arpwatch" @logserver.example.com:514
# 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
# 定期导出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
# 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)