firewalld默认不记录被拒绝连接,必须执行firewall-cmd --set-log-denied=all并--reload生效;日志由内核输出至journald或rsyslog,默认在/var/log/messages或journalctl中查看,需配置rsyslog才能写入独立文件。

firewalld 默认不记录被拒绝的连接,想看到谁被拦了,必须显式开启 log-denied,且仅靠改配置文件不够,得用 firewall-cmd 命令生效。
firewalld 的 log-denied 必须用 firewall-cmd 设置
很多人编辑 /etc/firewalld/firewalld.conf 改 log-deny = all 或 LogDenied=all,但重启 firewalld 后仍无日志——因为该配置项已被弃用,实际生效的是运行时参数。正确做法是:
-
firewall-cmd --set-log-denied=all(记录所有被拒绝的包) -
firewall-cmd --set-log-denied=unicast(只记录单播拒绝,较常用) -
firewall-cmd --set-log-denied=off(关闭,生产环境建议临时开启后及时关) - 执行后无需重启 firewalld,立即生效
日志不会自动写入 /var/log/firewalld.log
firewalld 本身不直接写文件,它把日志交给内核 netfilter,再由 kernel 通过 printk 发到 kmsg,最终由 rsyslog 或 journald 捕获。所以:
- 默认情况下,日志出现在
journalctl -u firewalld或dmesg中,不是独立文件 - 若想存为文件,需配置 rsyslog:在
/etc/rsyslog.conf加一行kern.warning /var/log/firewalld.log(因 firewalld 日志走kernfacility,级别通常是 warning) - 加完后执行
systemctl restart rsyslog,再确认/var/log/firewalld.log权限为root:adm且可写
如何快速定位被拦截的源 IP 和端口
日志内容格式固定,关键字段是 IN=、OUT=、PROTO=、DPT=、SRC=。常用排查命令:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
- 实时看新拦截:
journalctl -u firewalld -f | grep -i 'reject\|drop' - 查特定端口(如 9200)被拒记录:
dmesg | grep -i 'DPT=9200' | grep -o 'SRC=[^ ]*' - 提取全部被拒源 IP 并去重:
journalctl -u firewalld | awk '/REJECT/ {for(i=1;i
注意:journalctl 默认只保留最近 1–2 周日志,长期审计需配合 rsyslog 落盘或启用 Storage=persistent。
log-prefix 和 log-level 是辅助项,非必需
它们不影响是否记录,只影响日志可读性:
-
log-prefix:在firewalld.conf里设(如log-prefix="[FW]"),能让grep更准,但不设也不影响抓 IP -
log-level:设成info或warning即可,debug会产生大量无关日志,增加排查干扰 - 修改
firewalld.conf后必须systemctl restart firewalld才生效,但仅用于 prefix/level,不影响log-denied开关
真正容易被忽略的是:log-denied 是运行时开关,不能只靠配置文件;日志源头在 kernel,不在 firewalld 进程自身;查不到日志时,先 dmesg | tail -20 看有没有 REJECT 行,再决定查 journal 还是 rsyslog。










