Linux防火墙日志准确分析的关键路径
要实现准确分析,首先需要保证日志的完整性、可读性和规范性。
iptables -A INPUT -j LOG命令添加全局日志规则;若需聚焦特定IP或端口(如192.168.1.0/24网段),可细化为iptables -A INPUT -s 192.168.1.0/24 -j LOG。为便于后续过滤,建议添加自定义前缀(如--log-prefix "** SUSPECT **"),使可疑日志更易识别。/etc/firewalld/firewalld.conf文件,将LogDenied设置为all(记录所有被拒流量);再创建/etc/rsyslog.d/firewalld.conf文件,添加kern.* /var/log/firewalld.log,将firewalld日志定向到独立文件。/etc/logrotate.conf或在/etc/logrotate.d/syslog中添加规则(如rotate 7保留7天日志、compress压缩旧日志),避免日志文件过大占用磁盘空间,同时保留足够的历史数据用于回溯分析。iptables -L -v -n查看规则是否生效(pkts计数增加说明日志规则被触发);检查日志文件(如/var/log/kern.log、/var/log/firewalld.log)是否有新日志生成,确保日志通道畅通。防火墙日志的格式因工具而异,需通过正则表达式提取核心字段(时间、源IP、目的IP、端口、协议、动作)。以iptables日志为例,常见格式如下:
Oct 29 10:05:23 localhost kernel: [12345.678901] IPTables-Dropped: IN=eth0 OUT= MAC=... SRC=192.168.1.100 DST=192.168.1.200 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=54321 PROTO=TCP SPT=56789 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0
关键字段说明:
Oct 29 10:05:23(系统时间);IPTables-Dropped(拒绝)或IPTables-Accepted(允许);SRC=192.168.1.100;DPT=22(SSH端口);PROTO=TCP。可通过Python的re模块编写解析脚本(如前面提到的parse_firewall_log函数),将日志转换为结构化数据(如字典列表),便于后续分析。
通过命令行工具或脚本快速识别异常行为,重点关注以下场景:
grep过滤被拒绝的连接(如grep "DPT=22" /var/log/firewalld.log | grep "DROP"),再用awk提取源IP并统计次数(awk '{print $9}' | sort | uniq -c | sort -nr),找出多次尝试登录的IP(如1分钟内超过5次)。grep "DPT=" /var/log/firewalld.log | awk -F'DPT=' '{print $2}' | cut -d' ' -f1 | sort | uniq -c | sort -nr),若发现非业务端口(如6667、6697,常见于IRC服务)被频繁访问,可能存在端口扫描行为。grep "SRC=192.168.1.100" /var/log/firewalld.log | awk '{print $10}',结合LEN字段计算流量),若某IP的流量远超正常业务需求,可能是DDoS攻击。将分析结果转化为图表或报表,提升可读性。例如使用Python的matplotlib库绘制:
fail2ban工具自动封禁恶意IP(如连续5次SSH登录失败),配置/etc/fail2ban/jail.local文件([sshd]部分启用enabled = true,设置maxretry = 5),当达到阈值时自动执行iptables -A INPUT -s <恶意IP> -j DROP命令。smtplib库),当某IP的拦截次数超过10次时,自动发送包含IP地址、拦截时间和端口的邮件给管理员。iptables -A INPUT -s 192.168.1.100 -j DROP);iptables -A INPUT -p tcp --dport 23 -j DROP,禁用Telnet服务);/var/log/firewalld.log)应设置为root:root所有,权限为600(chown root:root /var/log/firewalld.log; chmod 600 /var/log/firewalld.log),防止未授权访问。rsync或scp),避免本地日志丢失(如磁盘损坏)。