firewalld 和 iptables 均可实现异常连接的实时标记与日志留存,但机制不同:firewalld 通过 LogDenied + rsyslog 分流至独立日志文件,轻量可控;iptables 则借助 LOG 链规则灵活定义异常行为并限频记录,适合精细化检测。

firewalld:用 LogDenied + rsyslog 实现轻量可控的拒绝日志
firewalld 默认完全不记录 DROP/REJECT 流量,必须显式开启且注意生效逻辑:
- 运行 sudo firewall-cmd --permanent --set-log-denied=unicast —— 推荐生产环境使用 unicast(只记单播包),比 all 更轻量;all 会记录广播/组播,日志量陡增
- 立即执行 sudo firewall-cmd --reload —— 缺少这步,配置不会生效,日志始终为空
- 验证是否启用:sudo firewall-cmd --get-log-denied 应返回 unicast 或 all
此时被拒绝的连接会在内核日志中打上 _DROP 或 FINAL_REJECT 标签,但默认混在系统主日志里,需分流处理。
rsyslog 分流:把防火墙拒绝日志单独切到 /var/log/firewalld.log
直接 tail /var/log/messages 太嘈杂,用 rsyslog 按内容精准提取才是审计友好型做法:
- 新建配置文件:sudo tee /etc/rsyslog.d/firewalld.conf,写入两行:
:msg, contains, "_DROP" /var/log/firewalld.log :msg, contains, "_REJECT" /var/log/firewalld.log & stop
- 创建日志文件并设权限:sudo touch /var/log/firewalld.log && sudo chown root:root /var/log/firewalld.log
- 重启服务:sudo systemctl restart rsyslog firewalld
之后所有拒绝事件只进 /var/log/firewalld.log,干净、可轮转、便于后续分析。
iptables:用 LOG 链规则标记特定异常行为
iptables 更灵活,适合定义“什么是异常”——比如高频 SYN 连接、非标准端口访问、已知恶意 IP 段等:
- 在 DROP 规则前插入 LOG 规则(顺序很重要!LOG 必须在 DROP 之前):
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "SSH-SCAN: " --log-level 6
- 这条规则表示:每分钟最多记录 3 条新 SSH 连接尝试,超出即限频,且只记前 3 条——防日志刷屏
- 保存规则(Debian/Ubuntu):sudo iptables-save > /etc/iptables/rules.v4;(RHEL/CentOS):sudo service iptables save
- 日志前缀
SSH-SCAN:便于 grep 筛选,级别 6(info)平衡可读性与体积
实时监控与快速响应:用 journalctl + grep 快速定位攻击线索
不用等日志落盘,直接看正在发生的异常:
- 盯住 firewalld 拒绝事件:sudo journalctl -u firewalld -f | grep -E "(DROP|REJECT)"
- 抓取最近 10 分钟的暴力破解痕迹:sudo journalctl --since "10 minutes ago" | grep "SSH-SCAN"
- 统计高频攻击源 IP:sudo awk '/_DROP/ {print $11}' /var/log/firewalld.log | cut -d"=" -f2 | sort | uniq -c | sort -nr | head -10
发现异常 IP 后,可立即封禁:sudo firewall-cmd --permanent --add-rich-rule='rule source ip=192.168.1.100 reject',再 reload 生效。

















