Linux - Fail2ban搭配 firewallcmd-rich-rules 完整部署教程
文章目录
- 一、环境说明
- 二、安装必要组件(含依赖库)
- 1. 安装 firewalld 及依赖
- 2. 安装 Fail2ban 及依赖
- 三、配置 Fail2ban(核心步骤)
- 1. 创建自定义配置文件(避免直接修改默认配置)
- 2. 全局配置(统一设置默认参数)
- 3. 配置具体屏蔽规则(以 Nginx 敏感文件扫描为例)
- (1)创建过滤器规则(定义恶意行为特征)
- (2)在 jail.local 中启用规则
- 四、重启服务使配置生效
- 五、验证配置正确性
- 1. 查看规则详情
- 2. 检查 firewalld 富规则动作是否正常
- 六、测试屏蔽功能
- 1. 模拟恶意请求(触发屏蔽条件)
- 2. 监控 Fail2ban 日志(观察屏蔽过程)
- 3. 验证 IP 已被 firewalld 屏蔽
- 七、管理操作
- 1. 手动屏蔽 IP
- 2. 手动解除屏蔽
- 3. 查看当前屏蔽列表
- 4. 永久白名单 IP(避免被屏蔽)
- 八、常见问题排查
一、环境说明
- 系统:CentOS 7/8、RHEL 7/8 或 Ubuntu 20.04+/Debian 11+(使用 firewalld 防火墙)
- 目标:通过 Fail2ban 监控日志,利用 firewalld 富规则(rich rules)自动屏蔽恶意 IP
- 核心优势:无需依赖
ipset,直接使用 firewalld 原生功能,兼容性更强
二、安装必要组件(含依赖库)
1. 安装 firewalld 及依赖
# CentOS/RHEL 系统
sudo yum install -y firewalld python-firewall # python-firewall 是 firewalld 依赖的核心库# Ubuntu/Debian 系统
sudo apt update
sudo apt install -y firewalld python3-firewall # Ubuntu/Debian 依赖 python3 版本# 启动并设置开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld# 验证 firewalld 状态(确保 active (running))
sudo systemctl status firewalld
2. 安装 Fail2ban 及依赖
# CentOS/RHEL 系统
# 若默认源无 fail2ban,需先安装 EPEL 源
sudo yum install -y epel-release
sudo yum install -y fail2ban fail2ban-systemd # fail2ban-systemd 用于系统服务集成# Ubuntu/Debian 系统
sudo apt install -y fail2ban python3-pyinotify # pyinotify 用于日志实时监控# 启动并设置开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban# 验证 Fail2ban 状态
sudo systemctl status fail2ban
三、配置 Fail2ban(核心步骤)
1. 创建自定义配置文件(避免直接修改默认配置)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 基于默认配置创建本地配置
sudo vim /etc/fail2ban/jail.local
2. 全局配置(统一设置默认参数)
在文件顶部 [DEFAULT] 区块修改或添加:
[DEFAULT]
# 白名单 IP/网段(不被屏蔽,可添加服务器内网 IP 或信任 IP)
ignoreip = 127.0.0.1/8 192.168.0.0/16# 屏蔽时长(秒),7 天=604800 秒,永久屏蔽可设为 -1
bantime = 604800# 统计时间窗口(秒),1 分钟内的多次失败会被累计
findtime = 60# 触发屏蔽的失败次数(1 分钟内超过该次数则屏蔽)
maxretry = 2# 核心:指定使用 firewalld 富规则作为屏蔽动作
banaction = firewallcmd-rich-rules# 日志级别(调试时可设为 DEBUG,正常使用设为 INFO)
loglevel = INFO
3. 配置具体屏蔽规则(以 Nginx 敏感文件扫描为例)
(1)创建过滤器规则(定义恶意行为特征)
sudo vim /etc/fail2ban/filter.d/nginx-scan.conf
添加以下内容(拦截访问 .env、/admin 等敏感路径的请求):
[Definition]
# 正则匹配规则:拦截访问敏感路径的 GET/POST 请求
failregex = ^<HOST> -.*"(GET|POST|HEAD) /(\.env|admin|phpmyadmin|wp-admin|sqlmanager|.git).*"# 忽略规则(可选,排除正常请求)
ignoreregex =
(2)在 jail.local 中启用规则
在文件末尾添加规则配置(关联过滤器与日志路径):
[nginx-scan]
enabled = true # 启用该规则
filter = nginx-scan # 关联上述过滤器
logpath = /var/log/nginx/access.log # Nginx 访问日志路径(根据实际路径修改)
# 可覆盖全局配置(按需调整)
# bantime = 86400 # 单独设置屏蔽时长(1 天)
# findtime = 300 # 单独设置统计窗口(5 分钟)
# maxretry = 3 # 单独设置触发次数
四、重启服务使配置生效
sudo systemctl restart fail2ban# 验证规则是否已加载
sudo fail2ban-client status
输出中 Jail list 应包含 nginx-scan,表示规则已启用。
五、验证配置正确性
1. 查看规则详情
sudo fail2ban-client status nginx-scan
正常输出示例:
Status for the jail: nginx-scan
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/nginx/access.log
`- Actions|- Currently banned: 0|- Total banned: 0`- Banned IP list:
2. 检查 firewalld 富规则动作是否正常
# 查看 Fail2ban 动作配置(确认使用富规则)
grep "banaction" /etc/fail2ban/jail.local
输出应包含 banaction = firewallcmd-rich-rules。
六、测试屏蔽功能
1. 模拟恶意请求(触发屏蔽条件)
# 向 Nginx 日志写入 2 条恶意请求(IP 为 1.2.3.4,1 分钟内超过 maxretry=2 次)
echo '1.2.3.4 - - [05/Nov/2025:10:00:00 +0800] "GET /.env HTTP/1.1" 404 123 "-" "Mozilla/5.0"' >> /var/log/nginx/access.log
echo '1.2.3.4 - - [05/Nov/2025:10:00:10 +0800] "GET /admin HTTP/1.1" 404 123 "-" "Mozilla/5.0"' >> /var/log/nginx/access.log
2. 监控 Fail2ban 日志(观察屏蔽过程)
sudo tail -f /var/log/fail2ban.log | grep "nginx-scan"
正常情况下,10 秒内会出现以下日志(表示识别并屏蔽成功):
2025-11-05 10:00:10,123 fail2ban.filter [1234]: INFO [nginx-scan] Found 1.2.3.4 - 2025-11-05 10:00:10
2025-11-05 10:00:10,456 fail2ban.actions [1234]: NOTICE [nginx-scan] Ban 1.2.3.4
3. 验证 IP 已被 firewalld 屏蔽
# 查看 firewalld 富规则列表
sudo firewall-cmd --list-rich-rules | grep "1.2.3.4"
输出应显示:
rule family="ipv4" source address="1.2.3.4" reject
表示该 IP 已被 firewalld 拒绝访问。
七、管理操作
1. 手动屏蔽 IP
sudo fail2ban-client set nginx-scan banip 5.6.7.8
2. 手动解除屏蔽
sudo fail2ban-client set nginx-scan unbanip 1.2.3.4
3. 查看当前屏蔽列表
# 方法 1:通过 Fail2ban
sudo fail2ban-client status nginx-scan | grep "Banned IP list"# 方法 2:通过 firewalld
sudo firewall-cmd --list-rich-rules | grep "reject"
4. 永久白名单 IP(避免被屏蔽)
编辑 jail.local,在 [DEFAULT] 区块添加白名单:
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/16 5.6.7.8 # 新增需白名单的 IP
重启生效:
sudo systemctl restart fail2ban
八、常见问题排查
-
规则不生效,无屏蔽动作
- 检查日志路径是否正确:
logpath需指向实际的 Nginx 访问日志 - 验证过滤器规则:使用
fail2ban-regex测试日志是否匹配
确保sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-scan.confFailregex计数不为 0
- 检查日志路径是否正确:
-
富规则未添加到 firewalld
- 检查
banaction是否设置为firewallcmd-rich-rules - 查看 Fail2ban 日志错误:
sudo grep "ERROR" /var/log/fail2ban.log - 确认
python-firewall或python3-firewall已安装(依赖缺失会导致富规则调用失败)
- 检查
-
屏蔽后仍能访问
- 检查 firewalld 规则优先级:富规则需优先于允许规则
- 重启 firewalld 刷新规则:
sudo systemctl restart firewalld
