firewall-cmd --list-all 显示的是当前生效规则快照,非日志;真正连接记录需手动添加带 log 动作的富规则,并配合 rsyslog/journald,且须加 limit 限速以防日志爆炸。

firewall-cmd --list-all 显示的“记录”不是日志,而是当前生效规则
很多人执行 firewall-cmd --list-all 后看到一堆服务、端口、富规则,误以为这是“防火墙日志记录”。其实它只展示当前配置的规则快照,不包含任何连接或丢包事件。真正的访问记录(如谁连了22端口、哪个IP被拒绝)默认**不保存**,firewalld 本身不内置日志功能。
开启连接日志需手动添加 rich rule + 配合系统日志
要让 firewalld 记录匹配的连接行为,必须用 firewall-cmd 添加带 log 动作的富规则(rich rule),并确保 rsyslog 或 journald 正常工作:
-
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" log prefix="ssh-access" level="info" accept'—— 允许并记录指定网段 SSH 访问 -
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination address="10.0.0.5" reject type="icmp-host-prohibited" log prefix="blocked-" level="warning"'—— 拒绝并记录发往某 IP 的所有流量 - 执行
firewall-cmd --reload生效后,日志会写入/var/log/messages(rsyslog)或通过journalctl -u firewalld查看(journald) -
level只支持emerg、alert、crit、err、warning、notice、info、debug;prefix是日志前缀,便于 grep 过滤
iptables 日志规则不能直接混用,firewalld 会覆盖它们
如果你之前用 iptables -A INPUT -j LOG 手动加过日志链,firewalld 启动或重载时大概率会清空或覆盖这些规则——因为 firewalld 管理的是同一套 netfilter 后端,但抽象层级更高。强行共存会导致:
-
iptables -L看不到 firewalld 添加的规则(除非用iptables -t filter -L查具体表) - firewalld 的
--permanent规则重载后,自定义 iptables 日志规则丢失 - 日志重复或漏记:两个工具可能对同一流量分别打日志,也可能因链顺序冲突而跳过
- 真正想持久化记录,只用 firewalld 的 rich rule +
--permanent,别碰底层 iptables
日志量大时必须限速,否则打爆磁盘或拖慢网络
富规则里的 log 默认不限频,高频请求(如扫描、健康检查)会瞬间产生海量日志。必须加 limit 控制频率:
- 正确写法:
firewall-cmd --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" log prefix="http-req" level="notice" limit value="10/s" accept' -
limit value支持/second、/minute、/hour、/day,超出部分不再记录(但规则仍生效) - 注意:
limit必须紧跟在log后面,顺序错(比如写在accept后)会报错Invalid argument - 生产环境建议从
5/minute起步,观察日志量再调;调试阶段可临时用100/second,但切勿长期启用
log 动作放进具体规则里,而不是靠“开启防火墙”自动产生。没加 log 的规则,无论放行还是拒绝,都不会留下痕迹。


















