firewalld 本身不支持自动识别恶意 IP,需配合 fail2ban 实现动态黑名单,或通过直接规则、富规则手动封禁;推荐使用 fail2ban + firewallcmd-ipset 方式,依赖 firewalld ≥0.6.0 且避免与 iptables 混用。

firewalld 本身不提供自动识别恶意 IP 的能力,但可以配合手动规则或 fail2ban 实现动态黑名单保护。核心思路是:用 firewalld 承载拒绝规则,靠外部工具(如 fail2ban)检测异常行为并触发规则增删。
firewalld 黑名单基础规则(静态方式)
适用于已知恶意 IP 的快速封禁:
- 添加单条拒绝规则(临时生效):
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 203.0.113.45 -p tcp --dport 22 -j REJECT - 让规则永久保存:
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 203.0.113.45 -p tcp --dport 22 -j REJECT
然后执行 sudo firewall-cmd --reload - 查看已添加的直接规则:
sudo firewall-cmd --direct --get-all-rules - 删除某条规则(需指定完整参数):
sudo firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT 0 -s 203.0.113.45 -p tcp --dport 22 -j REJECT
fail2ban + firewalld 实现动态黑名单
这是生产环境推荐方式,fail2ban 自动扫描日志、识别暴力登录等行为,并调用 firewalld 添加/移除黑名单规则:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 安装 fail2ban(以 CentOS/RHEL 为例):
sudo dnf install epel-release fail2ban - 配置 jail.local(避免覆盖升级文件):
创建 /etc/fail2ban/jail.local,写入:[DEFAULT] bantime = 1d findtime = 1h maxretry = 3 backend = systemd [sshd] enabled = true banaction = firewallcmd-ipset action = %(action_mwl)s
- 启用并启动服务:
sudo systemctl enable --now fail2ban - 验证是否生效:
查看被封 IP:sudo fail2ban-client status sshd
检查 firewalld 是否已加载 ipset 规则:sudo firewall-cmd --direct --get-all-rules | grep "ipset"
使用富规则(rich rule)管理黑名单更直观
相比直接规则,富规则语法更易读,也支持按区域管理:
- 拒绝某个 IP 访问所有服务:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.45" reject' - 仅拒绝访问 SSH:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.45" service name="ssh" reject' - 永久保存富规则:
加上 --permanent 参数,再执行 sudo firewall-cmd --reload - 删除富规则需用完全相同的字符串:
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="203.0.113.45" service name="ssh" reject'
注意事项与排错要点
实际部署中容易忽略的关键点:
- firewalld 和 iptables 不要混用——二者底层都操作 netfilter,同时启用会导致规则冲突;确认只启用其中一个:
sudo systemctl stop iptables && sudo systemctl disable iptables - 直接规则优先级由数字决定(越小越早匹配),确保黑名单规则在白名单之前插入;默认 INPUT 链末尾是 ACCEPT,所以黑名单必须插在前面
- fail2ban 默认使用
firewallcmd-ipset动作,它依赖 firewalld 的 ipset 支持,无需额外安装 ipset 工具,但要求 firewalld 版本 ≥ 0.6.0 - 测试封禁效果时,建议从另一台机器尝试连接,避免本地回环(lo)接口绕过规则

















