linux系统不内置内网扫描自动告警功能,需通过监控高频arp请求、密集端口探测、icmp风暴三类行为特征,结合日志分析与auditd命令审计,部署定时脚本实现轻量实时告警。

Linux系统本身不内置“检测内网扫描→自动告警”功能,因为扫描行为(如nmap、fping、arping)在网络层是合法流量,系统不会主动标记为威胁。真正可行的方案是:监控异常网络行为模式 + 日志分析 + 触发告警,而不是等待“扫描完成”才响应。
监控哪些典型扫描行为特征
内网扫描通常表现出可识别的流量规律,重点盯住以下三类信号:
-
高频ARP请求:短时间内对大量IP发送ARP探测(如
arping -c 100 192.168.1.0/24),可用tcpdump -i eth0 arp -c 500 | wc -l统计单位时间ARP包数 -
密集端口探测:同一源IP在短时间(如60秒内)尝试连接多个不同端口(常见于
nmap -sT或masscan),可通过ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -5快速筛查高频连接源 -
ICMP风暴式探测:用
fping或hping3批量ping大量主机,表现为/proc/net/snmp中IcmpOutEchoReps突增,或tcpdump -i eth0 icmp[icmptype] == icmp-echo -c 100在10秒内捕获超50个请求
注意:需先排除合法运维行为——比如Zabbix、Ansible或备份脚本的周期性探测,建议在非业务时段做基线统计(如连续3天凌晨2点采样),再设动态阈值。
部署轻量实时监控脚本
新建 /usr/local/bin/alert-scan.sh,内容如下:
#!/bin/bash
INTERFACE="eth0" # 替换为实际内网接口名
ALERT_LOG="/var/log/scan-alert.log"
THRESHOLD_ARP=200 # 每30秒ARP请求数上限
THRESHOLD_PORT=80 # 每60秒新连接目标端口数上限
# 统计30秒内ARP请求数
ARP_COUNT=$(timeout 30 tcpdump -i "$INTERFACE" -c 1000 arp 2>/dev/null | wc -l 2>/dev/null)
if [ "$ARP_COUNT" -gt "$THRESHOLD_ARP" ]; then
MSG="HIGH-ARP: $ARP_COUNT ARP requests in 30s on $INTERFACE"
echo "$(date): $MSG" >> "$ALERT_LOG"
logger -t SCAN-ALERT "$MSG"
echo "$MSG" | mail -s "SCAN ALERT: High ARP on $(hostname)" admin@example.com
fi
# 统计60秒内新连接的目标端口去重数(仅established状态)
PORT_COUNT=$(timeout 60 ss -tn state established 2>/dev/null | awk '{print $5}' | cut -d: -f2 | sort -u | wc -l 2>/dev/null)
if [ "$PORT_COUNT" -gt "$THRESHOLD_PORT" ]; then
MSG="HIGH-PORT: $PORT_COUNT unique ports hit in 60s"
echo "$(date): $MSG" >> "$ALERT_LOG"
logger -t SCAN-ALERT "$MSG"
echo "$MSG" | mail -s "SCAN ALERT: Port Sweep on $(hostname)" admin@example.com
fi
赋予执行权限并加入定时任务:
sudo chmod +x /usr/local/bin/alert-scan.sh sudo crontab -e # 添加一行: */2 * * * * /usr/local/bin/alert-scan.sh
每2分钟运行一次,兼顾灵敏度与资源开销。
补充日志级防护增强告警可信度
仅靠流量统计易误报,建议叠加系统日志线索提升准确率:
- 启用
auditd监控可疑命令调用:sudo auditctl -a always,exit -F path=/usr/bin/nmap -F perm=x sudo auditctl -a always,exit -F path=/usr/bin/fping -F perm=x sudo auditctl -a always,exit -F path=/usr/bin/arping -F perm=x
- 在告警脚本中追加检查(放在脚本末尾):
RECENT_SCAN=$(ausearch -m execve -ts recent --raw 2>/dev/null | aureport -f -i 2>/dev/null | grep -E "(nmap|fping|arping)" | tail -3) if [ -n "$RECENT_SCAN" ]; then echo "$(date): SUSPICIOUS TOOL EXECUTED — $RECENT_SCAN" >> "$ALERT_LOG" logger -t SCAN-ALERT "Suspicious tool run detected" echo "Suspicious tool run: $RECENT_SCAN" | mail -s "TOOL ALERT on $(hostname)" admin@example.com fi
邮件通知前务必验证通路
- 确保系统已配置可用的MTA(如
ssmtp、msmtp或postfix),测试命令:echo "test" | mail -s "mail-test" admin@example.com
- 若用外部SMTP,推荐
msmtp配TLS,避免被当作垃圾邮件拦截。
不复杂但容易忽略。











