全网IP同步封禁需构建共享黑名单决策中心,通过MySQL统一存储、Git/Ansible集中管理规则、Redis/RabbitMQ或Webhook实现跨节点事件通知,并适配云平台安全组与firewalld-ipset防火墙。

要实现全网 IP 同步封禁,关键不是让每台服务器各自封 IP,而是让所有节点共享同一个“黑名单决策中心”,并实时执行一致的封禁动作。Fail2Ban 本身不原生支持分布式协同,必须通过外部机制补足数据同步、策略统管和事件联动三块能力。
用 MySQL 实现全局黑名单统一存储
单机 Fail2Ban 默认使用本地 SQLite,无法跨节点读写。换成 MySQL 是最直接可靠的方案:
- 部署一台专用数据库服务器(建议独立于业务,可用云 RDS),创建 fail2ban 数据库及专用账号
- 在所有节点的 /etc/fail2ban/jail.local 中启用数据库后端:
dbbackend = mysql
dbhost = 192.168.1.100
dbname = fail2ban
dbuser = fail2ban_rw
dbpass = your_strong_password - 确保各节点 Fail2Ban 版本 ≥ 1.0(旧版不支持 MySQL 后端),且已安装对应 Python DB 驱动(如 python3-mysqldb 或 PyMySQL)
配置统一规则 + 集中下发机制
避免各节点 jail 配置不一致导致漏防或误封:
- 所有节点禁用本地 jail.conf,只保留 jail.local,其中仅定义基础路径和数据库参数,不写具体 jail 规则
- 将实际防护规则(如 [sshd]、[nginx-http-auth])抽离为独立配置文件,存放在 Git 仓库或配置中心(如 Consul、etcd)
- 用 Ansible 或 rsync 定期同步规则到所有节点的 /etc/fail2ban/filter.d/ 和 /etc/fail2ban/action.d/,再自动执行 fail2ban-client reload
打通跨节点事件通知链路
仅靠数据库共享 bans 表还不够——新封禁需立即触发其他节点更新防火墙规则:
- 在数据库侧增加触发器或监听 binlog,当 bans 表插入新记录时,向消息队列(如 Redis Pub/Sub、RabbitMQ)推送事件
- 每个节点运行轻量监听服务(Python 脚本即可),收到事件后调用 fail2ban-client set <jail> banip <IP>,强制本机立即生效
- 若不用中间件,可改用 HTTP webhook:主控节点封禁后,用 curl 向其他节点的自建 API 接口发送封禁指令(需加签名鉴权)
适配云环境与防火墙差异
公有云实例通常无法直接操作 iptables/nftables,需定制 action:
- AWS EC2:编写 action.d/aws-security-group.conf,调用 AWS CLI 修改安全组入站规则
- 阿里云 ECS:对应 action 调用 aliyun-cli 添加安全组规则,注意 RAM 权限最小化
- 所有节点统一启用 firewalld 作为标准后端,并在 action 中指定 firewallcmd-ipset 模式,利用 ipset 实现高性能批量封禁

















