firewalld 拒绝特定 IP 需结合 rich rule 精准封禁、direct rules 高优先级拦截及 fail2ban 自动化防护,并验证规则生效、同步云安全组策略。

直接用 firewalld 拒绝特定 IP 的恶意攻击,关键不是“加一条拒绝规则”就完事,而是要结合实时拦截、持久化保存和策略协同——尤其要避免规则被绕过或失效。
用 rich rule 精准拒绝单个 IP 访问关键端口
这是最常用也最稳妥的方式。比如发现 IP 192.0.2.100 频繁暴力扫描 SSH 或尝试连接数据库端口,可立即封禁:
- 拒绝该 IP 所有入站连接(全局封禁):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.100" reject' - 更精细地只封它连 22 或 3306 端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.100" port port="22" protocol="tcp" reject' - 执行 firewall-cmd --reload 生效
用 direct rules 实现高优先级拦截
rich rule 在底层仍走 filter 表的 INPUT 链,但有时需要更高优先级(比如确保在其他放行规则之前匹配),可用 direct 模式:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 添加一条优先级为 0 的拒绝规则(数字越小越先执行):
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 192.0.2.100 -j REJECT - 若只想封某端口,加上协议和端口参数:
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 192.0.2.100 -p tcp --dport 3306 -j REJECT - 务必运行 firewall-cmd --reload,否则不生效
搭配 fail2ban 自动识别并封禁恶意 IP
手动封 IP 只能应对已知威胁,真正的防护靠自动化。fail2ban 能实时分析日志(如 /var/log/secure),触发后调用 firewalld 封禁:
- 安装后,在 /etc/fail2ban/jail.local 中设置:
banaction = firewallcmd-ipset
这是关键——它会让 fail2ban 使用 ipset + firewalld 组合,效率远高于逐条 rich rule - 启用 sshd 监控:
[sshd] enabled = true - 重启服务:systemctl restart fail2ban
- 验证是否生效:fail2ban-client status sshd,能看到被封 IP 列表
验证与持续防护要点
封了不等于真拦住了,得确认规则落地且没被覆盖:
- 查当前生效的所有 rich rule:
firewall-cmd --list-rich-rules - 查 direct 规则:
firewall-cmd --direct --get-all-rules - 检查云服务器时,务必同步核对安全组(Security Group)——firewalld 再严,安全组若放行了 0.0.0.0/0,攻击流量照样进来
- 封禁后建议观察 /var/log/firewalld 或用 journalctl -u firewalld | grep reject 确认拦截日志是否产生

















