Snort IPS脚本部分IP未拦截问题排查求助
问题:UFW无法拦截部分Snort高优先级告警IP
我用bash脚本搭建服务,通过UFW拦截Snort告警中优先级1和2的IP,但部分IP未被拦截。相关信息如下:
脚本代码
#!/bin/bash LOG_FILE="/var/log/snort/alert" while true; do tail -fn0 "$LOG_FILE" | while read -r line; do if echo "$line" | grep -E "Priority: 1|Priority: 2"; then IP=$(echo "$line" | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") if [ -n "$IP" ]; then ufw deny from "$IP" echo "$(date): Blocked IP $IP" >> /var/log/ufw_block.log fi fi done sleep 10 done
运行日志
2024-05-20 14:30:00: Blocked IP 192.168.1.100
2024-05-20 14:35:00: Blocked IP 10.0.0.5
(未被拦截的IP无对应日志记录)
Snort优先级1告警示例
[Priority: 1] {TCP} 172.16.0.20:443 -> 192.168.2.3:8080
05/20-14:40:00.123456 [Priority: 1] ET EXPLOIT Possible Remote Code Execution Attempt
排查方向
- IP提取逻辑偏差:脚本用
grep -oE会提取告警行中所有IP,若告警同时包含源IP(攻击IP)和目标IP(本地IP),可能误拦截本地IP而漏掉攻击源。可调整正则精准提取源IP,比如:IP=$(echo "$line" | grep -oE "\{[^}]+\} ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)" | cut -d' ' -f2) - 权限不足:脚本未以root运行时,
ufw deny命令会静默失败。检查ufw_block.log是否有未被拦截IP的记录,确认脚本执行权限,建议用root运行或给脚本添加sudo权限。 - 日志格式不匹配:部分Snort告警的优先级字段可能有格式差异(比如大小写、多余空格),用
grep "Priority: [12]" /var/log/snort/alert搜索未被拦截的告警,确认这些行能否被脚本的grep -E匹配到。 - 日志轮转导致读取中断:若Snort日志用logrotate轮转,
tail -fn0可能丢失轮转后的新日志。可改用inotifywait监控文件变化,或在脚本中加入日志重新读取逻辑。 - UFW规则优先级冲突:执行
ufw status numbered查看规则列表,若未被拦截的IP存在允许规则且顺序在拒绝规则之前,会导致拦截失效,需调整规则顺序或删除对应允许规则。 - 脚本循环异常:内层
while read可能因tail输出中断而停止,可给tail加--follow=name参数,确保跟踪文件本身而非文件描述符,避免日志轮转后脚本停止读取新内容。
内容的提问来源于stack exchange,提问作者D J
相关产品推荐
相关产品推荐

