Firewalld 本身不支持自动识别扫描行为,但可与 Fail2ban 联动实现 IP 自动封禁:Fail2ban 监控日志识别异常请求,调用 firewalld 通过 rich-rule 或 ipset 快速拦截。

Firewalld 本身不带自动识别扫描行为的功能,但可以和 Fail2ban 配合,实现对频繁端口扫描、HTTP 接口探测等异常行为的 IP 自动封禁。核心思路是:Fail2ban 监控日志(如 sshd、nginx、系统日志),发现高频失败请求或扫描特征后,调用 firewalld 将该 IP 加入黑名单;firewalld 则通过 rich-rule 或 ipset 实现快速拦截。
配置 Fail2ban 联动 firewalld
确保已安装 Fail2ban 和 firewalld,并启用 firewalld:
- 安装并启动:
yum install -y fail2ban firewalld(CentOS/RHEL)或apt install -y fail2ban firewalld(Debian/Ubuntu) - 启用服务:
systemctl enable --now firewalld fail2ban - 确认 firewalld 使用的是
iptables后端(默认),而非 nftables(Fail2ban 当前对 nftables 支持有限)
启用 SSH 扫描防护(最常见场景)
编辑 Fail2ban 主配置,统一基础策略:
- 修改
/etc/fail2ban/jail.local(若不存在则新建) - 在
[DEFAULT]区块中设置:bantime = 72hfindtime = 1hmaxretry = 5 - 启用 SSH 规则:
[sshd]enabled = trueport = 22(若改过端口,如 54321,需明确写入)logpath = /var/log/secure(CentOS/RHEL)或/var/log/auth.log(Debian/Ubuntu)
添加 Web 层扫描防护(如 Nginx/Apache)
针对 HTTP 层的目录爆破、后台路径探测、大量 404 请求等扫描行为:
- 启用内置 filter:
[nginx-http-auth]enabled = trueport = http,httpslogpath = /var/log/nginx/error.logfilter = nginx-http-auth - 或自定义更敏感规则(例如匹配连续 10 次 404):创建
/etc/fail2ban/filter.d/nginx-scan.conf,定义正则匹配扫描特征 - Fail2ban 默认使用
firewallcmd-ipset动作,会自动将封禁 IP 写入 firewalld 的 ipset,并通过 rich-rule 应用到 INPUT 链
验证与日常维护
封禁生效后,可通过以下方式确认:
- 查看被封 IP:
fail2ban-client status sshd或fail2ban-client status nginx-http-auth - 检查 firewalld 是否已加载黑名单:
firewall-cmd --direct --get-all-rules(查看 ipset 规则) - 手动测试封禁效果:用被封 IP 访问 SSH 或网站,应立即拒绝(无响应或 connection refused)
- 临时解封某 IP:
fail2ban-client set sshd unbanip 192.168.1.100
不需要手动写每条 drop 规则,Fail2ban + firewalld 的组合已能稳定应对真实环境中的扫描压力。关键在于日志源准确、filter 匹配合理、bantime 设置得当——太短起不到震慑作用,太长可能误伤临时出差用户。


















