关于fail2ban与firewalld的依赖、规则配置及封禁机制的技术咨询
关于fail2ban与firewalld的依赖、规则配置及封禁机制的技术咨询
嘿,我来帮你拆解这些问题,一步步解决你的困扰:
一、处理firewalld与需求冲突的最优方案
首先不建议直接卸载firewalld——现在很多主流发行版(比如CentOS/RHEL系)默认用它作为防火墙管理工具,而且fail2ban本身也能和它很好协作。优先推荐修改firewalld规则开放HTTP/HTTPS,而不是卸载或禁用,这样既能满足你的需求,又能保留防火墙的防护能力,还不影响fail2ban的正常工作。
具体操作步骤很简单:
- 永久允许HTTP(80端口):
sudo firewall-cmd --add-service=http --permanent - 永久允许HTTPS(443端口):
sudo firewall-cmd --add-service=https --permanent - 重新加载规则让变更生效:
sudo firewall-cmd --reload
如果真的完全不想用firewalld,再考虑禁用或卸载:
- 停止当前运行的firewalld服务:
sudo systemctl stop firewalld - 禁止firewalld开机自启:
sudo systemctl disable firewalld - 如果你打算改用原生iptables,记得安装对应的持久化工具:
- RHEL/CentOS系:
sudo yum install iptables-services && sudo systemctl enable --now iptables - Debian/Ubuntu系:
sudo apt install iptables-persistent
- RHEL/CentOS系:
二、firewalld的规则来源解析
你看到的那些规则,都是firewalld默认public区域的配置结果:
- 那条
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited是public区域的默认兜底规则——当没有匹配到任何允许规则时,就会触发这个拒绝动作。 Chain IN_public_allow是public区域专门存放允许规则的链,默认只开放了SSH端口,这就是为什么你重启后只有SSH能正常连接。
firewalld的规则主要存在三个地方:
- 系统默认规则:
/usr/lib/firewalld/目录下,包含预定义的服务、区域模板等; - 自定义永久规则:
/etc/firewalld/目录下,你用--permanent参数添加的规则会存在这里,重启后不会丢失; - 临时运行时规则:不带
--permanent添加的规则仅存于内存,重启后会消失。
三、fail2ban的封禁IP存储与生效机制
封禁IP的存储
fail2ban的封禁记录主要存在这些地方:
- 日志文件:默认是
/var/log/fail2ban.log,里面会详细记录哪个IP被封禁、封禁时间、对应的监控规则(也就是jail,比如sshd jail); - 实时封禁列表:可以通过命令查看特定jail的封禁IP,比如查看SSH相关的封禁:
sudo fail2ban-client status sshd; - 可选数据库:如果你在配置里开启了数据库存储,封禁记录会存在SQLite或其他数据库中,但默认一般不会启用,主要靠日志和内存维护。
生效机制
fail2ban的工作逻辑很清晰:
- 它会监控你配置的日志文件(比如sshd的
/var/log/auth.log); - 当检测到某个IP触发了预设的失败次数阈值(比如5次错误登录);
- 就会调用对应的防火墙后端(默认是firewalld,也可以配置成iptables),添加规则封禁这个IP;
- 当封禁时间到期后,再自动移除对应的封禁规则,解除限制。
如果用firewalld作为后端,fail2ban会通过添加自定义富规则或修改区域规则实现封禁;如果是iptables后端,就会往iptables的专用链里添加DROP/REJECT规则。
备注:内容来源于stack exchange,提问作者Thomas Stokes
相关产品推荐
相关产品推荐

