要让Linux系统日志真正收集防火墙拦截告警信息,必须显式启用firewalld日志并分离存储,或在iptables规则中前置LOG动作;日志需独立归档、便于检索分析,并可通过rsyslog集中管理与LogAnalyzer可视化。

要让 Linux 系统日志真正收集防火墙的拦截告警信息,关键不是“开了日志就完事”,而是确保每条 DROP/REJECT 行为都被明确记录、独立归档、便于检索和分析。firewalld 和 iptables 实现方式不同,但目标一致:不漏记、不混杂、不难查。
firewalld:启用拦截日志并分离存储
firewalld 默认完全不记录被拒流量,必须显式开启且配置落地路径:
- 运行 firewall-cmd --permanent --set-log-denied=all(或更轻量的
unicast),再执行 firewall-cmd --reload —— 缺少 reload,配置不会生效 - 验证是否启用:firewall-cmd --get-log-denied 应返回
all或unicast - 默认日志混在
/var/log/messages(RHEL/CentOS)或/var/log/syslog(Debian/Ubuntu)中,不建议直接 tail 查看;可用 journalctl -u firewalld -f | grep "_DROP\|_REJECT" 实时过滤 - 为避免污染主日志,用 rsyslog 单独分流:在
/etc/rsyslog.d/firewalld.conf中写入
:msg, contains, "_DROP" /var/log/firewalld.log<br>:msg, contains, "_REJECT" /var/log/firewalld.log<br>& stop
然后创建文件、设权限(chmod 644 /var/log/firewalld.log)、重启 rsyslog 和 firewalld
iptables:在规则链中插入 LOG 动作
iptables 日志依赖手动插入 LOG 规则,位置和顺序决定是否真正记录到拦截行为:
- LOG 规则必须放在 DROP/REJECT 规则之前,例如:
iptables -I INPUT -p tcp --dport 22 -s 192.168.100.50 -j LOG --log-prefix "SSH-BLOCK: " --log-level 6iptables -I INPUT -p tcp --dport 22 -s 192.168.100.50 -j DROP -
--log-prefix(如
SSH-BLOCK:)和 --log-level 6(info 级别)便于后续 grep 或日志系统识别;级别过高(如 7)可能产生冗余 - 规则需持久化:
CentOS/RHEL 运行service iptables save;
Debian/Ubuntu 执行iptables-save > /etc/iptables/rules.v4 - 日志走内核日志子系统,查看方式:
tail -f /var/log/kern.log(Debian)或tail -f /var/log/messages(RHEL),也可用journalctl -k -f | grep "SSH-BLOCK"
日志集中管理:rsyslog + LogAnalyzer(可选进阶)
当需要统一收集交换机、防火墙等多设备日志时,可部署 rsyslog 服务端 + LogAnalyzer Web 前端:
- 在日志服务器上安装 rsyslog、MariaDB、httpd、PHP,并创建专用数据库(如
rsyslog)和用户 - 配置 rsyslog 接收远程 UDP/TCP 日志(如监听 514 端口),并按 Facility/Program 分流写入数据库或文件
- 部署 LogAnalyzer,连接数据库,即可通过 Web 界面搜索、过滤、统计防火墙拦截事件(如高频源 IP、被拒端口分布)
- 注意:网络设备(如飞塔、华为交换机)需配置 syslog server 地址指向该日志服务器,且路由互通
快速验证与日常分析
配置完成后,用以下命令确认日志已生成并可读取:
- 触发一次拒绝(如用未开放端口 telnet 自己),立即检查:
tail -n 20 /var/log/firewalld.log或journalctl -u firewalld --since "1 minute ago" | grep -E "(DROP|REJECT)" - 基础分析示例:
提取高频攻击源:awk '/SRC=/ {print $10}' /var/log/firewalld.log | sort | uniq -c | sort -nr | head -10
统计被拒端口:awk '/DPT=/ {match($0, /DPT=([0-9]+)/, arr); print arr[1]}' /var/log/firewalld.log | sort | uniq -c | sort -nr - 结合 fail2ban 可自动响应:它能扫描
/var/log/firewalld.log或/var/log/auth.log,匹配失败行为后调用 firewalld 封禁 IP


















