防火墙日志写入频繁导致磁盘 IO 高怎么关闭或轮转

文章导读
直接关闭防火墙日志并不是最佳选择,建议优先配置日志轮转,仅在确认特定规则产生无用噪音时再针对性关闭该规则的日志记录。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

直接关闭防火墙日志并不是最佳选择,建议优先配置日志轮转,仅在确认特定规则产生无用噪音时再针对性关闭该规则的日志记录。

先说结论:盲目关闭日志会影响安全审计,优先通过 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 日志。

防火墙日志写入频繁导致磁盘 IO 高怎么关闭或轮转

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,调整 SystemMaxUseSystemMaxFileSize

[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 可能导致日志占满整个分区。