在CentOS系统中使用firewalld防火墙时,如果你想让被拒绝的流量连接被详细记录到日志中,最直接有效的方法就是使用富规则(Rich Rule)配合日志记录功能。具体操作是:通过firewall-cmd命令添加一条带有log参数的富规则,指定记录级别为info或者emerg,这样所有匹配该规则被拒绝的数据包都会写入系统日志。核心命令类似于:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject log level="info" prefix="DROPPED_ATTACK"'。下面我会从原理到实操,一步步把这件事讲透。
为什么要用富规则而不是普通规则来记录日志
firewalld的普通规则(比如直接用--add-port或--add-service)只能做简单的端口开放或服务放行,它不支持附加日志记录参数。而富规则是firewalld提供的一种高级规则语法,允许你在一条规则中同时指定源地址、目标地址、端口、协议、动作(accept/reject/drop)以及日志记录级别和前缀。这意味着你可以非常精细地控制:哪些IP的哪些连接被拒绝了,并且每一条都有日志可查。对于安全审计和入侵排查来说,这是必不可少的能力。
firewalld日志记录的底层原理
firewalld本身并不直接写日志文件,它是通过调用Linux内核的nf_log_ipv4或nf_log_ipv6模块来实现日志记录的。当你在富规则中加上log level参数后,firewalld会在对应的iptables或nftables规则链中插入一条LOG目标规则。被拒绝的数据包在被DROP或REJECT之前,会先触发这条LOG规则,将信息发送到内核日志子系统(kmsg),最终被rsyslog或journald捕获并写入日志文件。理解这个原理很重要,因为它决定了你去哪里找日志、日志格式是什么样的。
CentOS 7和CentOS 8/Stream中firewalld的差异
CentOS 7默认使用firewalld 0.6.x版本,底层是iptables;CentOS 8和Stream默认使用firewalld 0.8.x以上版本,底层是nftables。但富规则的语法在两者之间基本兼容,添加log参数的方式完全一致。唯一需要注意的是,CentOS 8/Stream中如果你同时启用了nftables后端,日志输出的链名称可能略有不同,但不影响功能使用。建议在操作前确认你的firewalld版本:
firewall-cmd --version
添加富规则记录被拒绝日志的完整步骤
第一步,确认firewalld正在运行:
systemctl status firewalld
如果没有运行,先启动并设置开机自启:
systemctl start firewalld systemctl enable firewalld
第二步,添加一条带日志记录的富规则。以下是几个典型场景:
场景一:拒绝某个特定IP的所有连接并记录日志:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.55" reject log level="info" prefix="BLOCKED_IP"'
场景二:拒绝某个IP访问特定端口(比如SSH的22端口)并记录:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.55" port protocol="tcp" port="22" reject log level="warning" prefix="SSH_BRUTEFORCE"'
场景三:拒绝某个网段的所有入站连接并记录:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.100.0/24" reject log level="emerg" prefix="SUSPICIOUS_SUBNET"'
注意:--permanent参数表示永久生效,但需要重新加载才能生效:
firewall-cmd --reload
如果你只是想临时测试,去掉--permanent即可,重启firewalld后规则会消失。
日志级别(log level)的选择和含义
firewalld富规则支持的日志级别有:emerg、alert、crit、err、warning、notice、info、debug。在安全场景下,建议使用info或warning级别。原因是:emerg和alert级别太高,会产生大量系统告警干扰正常运维;debug级别太细,会产生海量日志影响性能。info级别是一个平衡点,既能记录足够的信息,又不会造成日志泛滥。如果你面对的是明确的攻击行为(比如暴力破解),可以用warning或err来提高优先级,方便后续用grep快速过滤。
日志前缀(prefix)的重要性
prefix参数是你自定义的日志标识字符串,它会出现在每条日志记录的开头。这一点非常关键,因为系统日志里每天有成千上万条信息,没有前缀你根本找不到firewalld的拒绝记录。建议prefix取一个有意义且唯一的名字,比如"SSH_ATTACK"、"PORT_SCAN"、"BLOCKED_BOT"等。这样你在排查时直接grep这个前缀就能快速定位。
去哪里查看这些被拒绝的日志
CentOS 7使用rsyslog,日志默认写入/var/log/messages;CentOS 8/Stream使用journald,日志在journal中。具体查看方法:
CentOS 7:
grep "BLOCKED_IP" /var/log/messages
或者更精确地过滤firewalld相关日志:
grep "DROPPED_ATTACK" /var/log/messages | tail -50
CentOS 8/Stream:
journalctl -k --grep="SSH_BRUTEFORCE" --since "1 hour ago"
或者直接查看内核日志中的firewalld标记:
journalctl -k --grep="BLOCKED_IP" -n 100
你会看到类似这样的日志条目:
kernel: [ 1234.567890] FINAL_REJECT: IN=eth0 OUT= MAC=... SRC=10.0.0.55 DST=192.168.1.100 PROTO=TCP SPT=45678 DPT=22 BLOCKED_IP
如何管理和清理已有的富规则
添加规则后,你可能需要查看、修改或删除。查看所有富规则:
firewall-cmd --list-rich-rules
删除某条特定规则(必须完全匹配原始规则内容):
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.55" reject log level="info" prefix="BLOCKED_IP"'
然后重新加载:
firewall-cmd --reload
如果规则太多记不清,可以先list出来,复制粘贴再删除。
富规则中action的选择:reject还是drop
在富规则中,动作可以是accept、reject或drop。记录日志时,reject和drop都可以配合log使用,但行为有区别:reject会给源端返回一个ICMP不可达或TCP RST包,源端知道连接被拒绝了;drop则直接丢弃数据包,源端会超时等待。从安全角度看,drop更隐蔽,但reject更友好(对合法用户来说能快速知道连接不通)。在日志记录场景下,两者都能触发LOG规则,效果一样。建议对外暴露的服务用reject,对内网敏感服务用drop。
结合fail2ban实现自动化封禁
单纯记录日志只是第一步,更高级的做法是配合fail2ban实现自动化响应。fail2ban可以监控你设置的日志前缀,当某个IP在短时间内触发多次拒绝日志时,自动添加firewalld富规则将其封禁。配置方法是在/etc/fail2ban/filter.d/中创建自定义filter,匹配你的prefix,然后在jail.local中关联firewalld-rich-rules action。这样就形成了"检测-记录-封禁"的完整闭环。
性能和安全的平衡建议
大量使用带日志的富规则会增加内核处理开销,尤其是在高流量服务器上。建议只对关键端口(如22、3389、443)和已知恶意IP段启用日志记录,不要对所有拒绝都开log。另外,日志文件要定期轮转(logrotate),避免/var/log/messages被撑满导致系统问题。可以创建/etc/logrotate.d/firewalld配置:
/var/log/messages {
daily
rotate 30
compress
delaycompress
missingok
notifempty
}
常见问题排查
问题一:添加了规则但没有日志输出。检查方法:先确认规则是否真的生效(firewall-cmd --list-rich-rules),再确认内核模块是否加载(lsmod | grep nf_log),最后检查rsyslog或journald是否正常运行。问题二:日志中看不到prefix。可能是prefix中包含了特殊字符导致解析异常,建议只用大写字母、下划线和数字。问题三:规则添加后reload报错。通常是语法错误,仔细检查引号、等号、空格是否正确,富规则对格式要求很严格。
总结和最佳实践
在CentOS安全加固中,利用firewalld富规则记录被拒绝日志是一项基础但极其重要的能力。核心要点归纳:使用--add-rich-rule配合log level和prefix参数;选择info或warning级别避免日志风暴;通过grep或journalctl快速检索;配合fail2ban实现自动化响应;定期清理和轮转日志。把这些做到位,你的服务器安全审计能力就上了一个台阶,任何异常连接尝试都逃不过你的眼睛。
