Firewalld 日志配置 3 步实战:从默认关闭到独立日志文件(附 rsyslog 规则)
Firewalld 日志配置 3 步实战:从默认关闭到独立日志文件(附 rsyslog 规则)
在 Linux 服务器运维中,防火墙日志是排查网络问题、分析安全事件的重要依据。然而 Firewalld 默认关闭日志记录功能,且日志混杂在系统消息文件中,给日常运维带来诸多不便。本文将手把手带你完成 Firewalld 日志从零配置的全流程,重点解决三个核心问题:如何启用日志记录?如何分离日志到独立文件?如何验证配置生效?
1. 理解 Firewalld 日志机制
Firewalld 作为 RHEL/CentOS 等主流 Linux 发行版的默认防火墙解决方案,其日志系统设计有以下几个特点:
- 默认关闭策略:出于性能考虑,新安装的系统不会记录被拒绝的连接请求
- 四级粒度控制:支持按单播(unicast)、广播(broadcast)、组播(multicast)或全部(all)类型记录
- 内核级日志:通过内核的 netfilter 框架生成日志,原始日志默认写入
/var/log/messages - 动态生效:多数配置变更无需重启服务,通过
--reload即可应用
实际生产环境中,我们通常需要记录所有被拒绝的访问(all),同时将日志分离到独立文件。这既便于日志分析,也能避免系统日志文件过快膨胀。
2. 配置日志记录功能
2.1 检查当前日志状态
在开始配置前,先确认系统的当前日志设置:
# 查看当前日志记录级别 firewall-cmd --get-log-denied # 检查配置文件默认值 grep LogDenied /etc/firewalld/firewalld.conf若输出为off或配置文件中显示LogDenied=off,则表示日志功能未启用。
2.2 设置日志记录级别
Firewalld 提供四种日志记录粒度:
| 参数值 | 记录内容 | 适用场景 |
|---|---|---|
| all | 所有被拒绝的连接 | 安全审计等需要完整记录的场景 |
| unicast | 仅记录单播包(常见于常规网络通信) | 默认推荐配置 |
| broadcast | 仅记录广播包 | 特殊网络环境调试 |
| multicast | 仅记录组播包 | 组播应用调试 |
设置方法(以 all 为例):
# 临时生效(重启后失效) firewall-cmd --set-log-denied=all # 永久生效 firewall-cmd --set-log-denied=all --permanent firewall-cmd --reload提示:生产环境中如果性能敏感,建议先用
unicast级别测试,再根据实际情况调整。
2.3 验证配置
执行以下命令确认配置已生效:
# 检查运行时状态 firewall-cmd --get-log-denied # 查看内核日志(新开终端) tail -f /var/log/messages | grep -i reject此时如果从外部访问被拒绝的端口,应该能在日志中看到类似记录:
IN=eth0 OUT= MAC=... SRC=192.168.1.100 DST=192.168.1.1 LEN=60 ... PROTO=TCP SPT=54321 DPT=223. 分离日志到独立文件
默认日志混杂在系统消息中,长期运行会导致文件过大。下面通过 rsyslog 实现日志分离。
3.1 创建 rsyslog 配置
新建/etc/rsyslog.d/firewalld.conf文件,内容如下:
# 捕获 DROP 和 REJECT 动作的日志 :msg, contains, "_DROP" /var/log/firewalld.log & stop :msg, contains, "_REJECT" /var/log/firewalld.log & stop关键配置说明:
contains匹配内核日志中的特定字符串& stop表示匹配后停止后续处理- 文件路径可根据需要修改,确保目录存在且有写入权限
3.2 设置日志轮转
创建/etc/logrotate.d/firewalld配置文件:
/var/log/firewalld.log { daily missingok rotate 7 compress delaycompress notifempty create 0600 root root }3.3 应用配置
# 重启 rsyslog 服务 systemctl restart rsyslog # 测试配置(在新终端执行) logger -t kernel "TEST _REJECT message" # 验证日志文件 tail -f /var/log/firewalld.log4. 高级应用与排错
4.1 日志分析技巧
获取被拒绝最多的 IP 地址:
grep 'FINAL_REJECT' /var/log/firewalld.log | awk '{print $10}' | sort | uniq -c | sort -nr | head -10实时监控关键端口访问:
tail -f /var/log/firewalld.log | grep -E 'DPT=(80|443|22)'4.2 常见问题解决
问题1:日志文件未创建
- 检查 rsyslog 服务状态:
systemctl status rsyslog - 验证配置语法:
rsyslogd -N1 - 检查目录权限:
ls -ld /var/log/
问题2:日志记录不全
- 确认 firewalld 日志级别:
firewall-cmd --get-log-denied - 检查内核日志缓冲:
dmesg | grep -i reject - 临时提高日志级别:
echo "module nf_log_ipv4 +p" > /sys/kernel/debug/dynamic_debug/control
问题3:性能影响显著
- 调整日志级别为 unicast
- 限制日志速率:
firewall-cmd --set-log-denied-rate=5/60s - 使用专门的日志服务器集中处理
5. 安全加固建议
完成基础配置后,建议进一步优化:
日志文件权限:
chmod 600 /var/log/firewalld.log chown root:root /var/log/firewalld.log日志归档策略:
- 重要环境建议日志保留至少 90 天
- 使用 ELK 或 Graylog 等工具集中管理
自动化响应:
# 示例:自动封禁频繁尝试的 IP grep 'FINAL_REJECT' /var/log/firewalld.log | awk '{print $10}' | sort | uniq -c | awk '$1 > 10 {print $2}' | xargs -I {} firewall-cmd --add-rich-rule='rule family="ipv4" source address="{}" reject'性能监控指标:
- 日志生成速率:
grep -c FINAL_REJECT /var/log/firewalld.log - 日志文件大小:
du -h /var/log/firewalld.log
- 日志生成速率:
这套配置已在 CentOS 7/8 和 RHEL 7/8 环境中验证通过,适用于物理机、虚拟机及容器环境。根据实际网络流量调整日志级别和轮转策略,可在安全审计和系统性能间取得平衡。
