当前位置: 首页 > news >正文

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

八、常见问题排查

  1. 规则不生效,无屏蔽动作

    • 检查日志路径是否正确:logpath 需指向实际的 Nginx 访问日志
    • 验证过滤器规则:使用 fail2ban-regex 测试日志是否匹配
      sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-scan.conf
      
      确保 Failregex 计数不为 0
  2. 富规则未添加到 firewalld

    • 检查 banaction 是否设置为 firewallcmd-rich-rules
    • 查看 Fail2ban 日志错误:sudo grep "ERROR" /var/log/fail2ban.log
    • 确认 python-firewallpython3-firewall 已安装(依赖缺失会导致富规则调用失败)
  3. 屏蔽后仍能访问

    • 检查 firewalld 规则优先级:富规则需优先于允许规则
    • 重启 firewalld 刷新规则:sudo systemctl restart firewalld
http://www.dtcms.com/a/568835.html

相关文章:

  • 使用 nvm 安装 Node.js
  • Arbess零基础学习 - 使用Arbess+GitLab实现Node.js项目自动化构建/主机部署
  • Linux 虚拟化技术 KVM/ESXI/Docker
  • C006基于博途西门子1200PLC机械手分拣物料控制系统仿真
  • 网站建设ui设计dw怎么做别人可以看的网站
  • 毕业生就业网站开发项目禁用wordpress默认编辑器
  • 服务器数据恢复—raid5阵列硬盘离线搞崩溃,分区数据恢复案例来袭
  • 基于springboot的新闻资讯系统
  • H3C AC+AP本地转发二层组网
  • JavaEE 进阶第五期:Maven 之道,项目的依赖艺术与构建哲学
  • Linux:五种IO模型与非阻塞IO
  • unity hub在ubuntu 22.0.4上启动卡住
  • 自己做个网站需要什么网页设计尺寸用怎么量
  • 青建设厅官方网站申请域名后怎样建设网站
  • 安装Conda并配置PX4无人机仿真环境
  • 微信小程序全局配置分享功能
  • Spring Boot3零基础教程,StreamAPI 更多用法,笔记100
  • Unity UGC IDE实现深度解析(六):子图系统与模块化设计
  • 嵌入式Linux新手入门:北京迅为3568开发板驱动开发第二章helloworld 驱动实验
  • 动态背景网站邗江区做网站
  • Milvus:向现有Collections更改和添加字段(十一)
  • ESP32C3开发指南(基于IDF):console控制台命令行交互功能
  • harmonyos的鸿蒙的跳转页面的部署参数传递
  • Git 简介和基础使用
  • HarmonyOS Marquee组件深度解析:构建高性能滚动视觉效果
  • 网站建设绿茶科技zencart 网站建设
  • vscode arm交叉编译 中 cmakeTools 编译器设置
  • 全自动化立体仓库巷道堆垛机使用西门子1500PLC通过EtherCAT主站转Profinet实现与EtherCAT协议的伺服进行通讯方案案例
  • MAC M1系统用pyinstaller分别打包支持ARM系统的app和支持Inter系统的APP
  • MTK平台详解`adb devices`输出的序列号组成