直接关闭防火墙日志并不是最佳选择,建议优先配置日志轮转,仅在确认特定规则产生无用噪音时再针对性关闭该规则的日志记录。
先说结论:盲目关闭日志会影响安全审计,优先通过 logrotate 控制文件大小,再考虑优化防火墙规则。
- 先定位:确认是哪个日志文件占用了 IO 和空间
- 先做:配置日志轮转策略,限制单个文件大小和保留数量
- 再验证:观察磁盘写入速率和日志文件增长情况
命令速用版
如果你使用的是基于 rsyslog 的系统(如 CentOS 6/7, Ubuntu 早期版本),可以快速检查防火墙日志文件的大小:
ls -lh /var/log/messages /var/log/syslog /var/log/kern.log如果你使用的是 systemd-journald(如 CentOS 7+, Ubuntu 16.04+),查看日志占用空间:
journalctl `--disk-usage`临时限制 journald 日志大小(重启失效,仅用于紧急止血):
journalctl `--vacuum-size`=100M为什么会这样
防火墙日志本质上是内核或用户态程序对网络包的记录动作。每一条被记录的数据包,都需要经过“匹配规则 - 生成日志信息 - 写入磁盘”这个过程。当服务器面临高频连接请求,或者防火墙规则中有一条匹配范围过宽且开启了日志记录(如 iptables 的 -j LOG 或 firewalld 的 log 选项)时,短时间内会产生大量小文件写入。
磁盘 IO 高通常不是因为日志文件太大,而是因为写入频率太高。机械硬盘对随机小写非常敏感,即使是 SSD,高频写入也会占用 IOPS 配额,影响其他业务读写。
分步处理
1. 确认日志来源
先找出是哪个进程或文件在频繁写入。可以使用 iostat 查看磁盘负载,配合 lsof 查看具体文件:
iostat -x 1
lsof +D /var/log | grep -i fire常见的防火墙日志路径包括 /var/log/messages、/var/log/syslog、/var/log/kern.log 或者 journald 的 binary 日志。
2. 配置日志轮转(Logrotate)
不要直接删除日志文件,这会导致文件句柄未释放,磁盘空间不回收。编辑 /etc/logrotate.d/rsyslog 或新建 /etc/logrotate.d/firewall:
/var/log/messages {
daily
rotate 7
compress
delaycompress
missingok
notifempty
postrotate
systemctl reload rsyslog
endscript
}如果是 journald,编辑 /etc/systemd/journald.conf,调整 SystemMaxUse 和 SystemMaxFileSize:
[Journal]
SystemMaxUse=500M
SystemMaxFileSize=50M修改后执行 systemctl restart systemd-journald 生效。
3. 优化防火墙规则(根源治理)
如果轮转后 IO 依然高,说明写入频率过高。检查防火墙规则,去掉非必要的日志记录。例如 iptables 中:
# 查看带 LOG 目标的规则及行号
iptables -L INPUT `--line-numbers` -n | grep LOG
# 删除规则(请将 <行号> 替换为实际数字)
iptables -D INPUT <行号>对于 firewalld,检查 rich rules 中是否包含 log 关键字,如有必要将其移除。
怎么验证是否生效
配置完成后,观察一段时间(如 10-30 分钟):
- 使用
iostat -x 1查看%util是否下降。 - 使用
du -sh /var/log确认日志目录大小是否受控。 - 使用
journalctl `--disk-usage`确认 journald 占用是否在设定值内。 - 检查
/var/log/messages等文件是否有新的轮转文件(如messages.1)生成。
常见坑
- 直接 rm 删除日志: 这会导致进程仍持有旧文件句柄,空间不会释放,必须重启进程或清空文件内容(
> /var/log/file)。 - 关闭所有日志: 防火墙日志是安全审计的重要依据,完全关闭会导致无法追溯攻击行为,建议仅关闭高频噪音规则。
- 轮转频率过高: 如果设置每分钟轮转,轮转本身的压缩和移动操作也会消耗 CPU 和 IO,通常按天或按大小轮转即可。
- 忽略 journald 限制: 很多新系统默认 journald 配置较宽松,不配置
SystemMaxUse可能导致日志占满整个分区。