Fail2ban + Nginx/Apache 防 Web 暴力破解配置清单

它是一款 Linux 系统下的入侵防御工具,核心作用是监控系统日志、识别恶意访问行为,并自动封禁对应的 IP 地址,常用于保护 SSH、FTP、Web 服务等。

一、核心工作原理

  1. 监控日志 :Fail2ban 会实时读取指定服务的日志文件(比如 SSH 的 /var/log/auth.log)。
  2. 匹配规则:通过预设的正则表达式,识别失败的登录尝试(如 SSH 密码错误、Web 暴力破解)。
  3. 触发封禁 :当某个 IP 的失败次数在设定时间内达到阈值,就会调用系统防火墙(如 iptables/ufw)封禁该 IP,封禁时长可自定义。
  4. 自动解封:封禁时间到期后,会自动从防火墙规则中移除该 IP,恢复访问。

二、安装与基础配置(以 Debian/Ubuntu 为例)

1. 安装 Fail2ban

bash

运行

复制代码
sudo apt update
sudo apt install fail2ban -y
2. 启动并设置开机自启

bash

运行

复制代码
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
3. 核心配置文件说明
配置文件路径 作用
/etc/fail2ban/fail2ban.conf 全局配置(日志级别、默认封禁时长等,一般无需修改)
/etc/fail2ban/jail.conf 预设规则模板(包含 SSH、Apache 等服务的默认配置)
/etc/fail2ban/jail.d/ 自定义规则目录(推荐 在此新建 .conf 文件覆盖默认配置,避免修改 jail.conf

三、快速配置 SSH 防护(最常用场景)

  1. 新建自定义配置文件,避免修改默认配置: bash

    运行

    复制代码
    sudo nano /etc/fail2ban/jail.d/ssh.conf
  2. 写入以下内容并保存: ini

    复制代码
    [sshd]
    enabled = true           # 开启防护
    port = ssh               # 防护的端口(默认22)
    filter = sshd            # 使用的规则过滤器(预设)
    logpath = /var/log/auth.log  # 监控的日志文件
    maxretry = 3             # 最大失败次数
    findtime = 600           # 统计时间窗口(10分钟)
    bantime = 3600           # 封禁时长(1小时,0为永久封禁)
    ignoreip = 127.0.0.1/8  # 忽略的IP(可添加自己的办公IP)
  3. 重启 Fail2ban 生效: bash

    运行

    复制代码
    sudo systemctl restart fail2ban

四、常用命令

  1. 查看当前封禁的 IP 列表: bash

    运行

    复制代码
    sudo fail2ban-client status sshd
  2. 手动解封某个 IP: bash

    运行

    复制代码
    sudo fail2ban-client set sshd unbanip 192.168.1.100
  3. 手动封禁某个 IP: bash

    运行

    复制代码
    sudo fail2ban-client set sshd banip 192.168.1.100

五、常见问题与解决

  • 封禁后无法访问自己的 IP :在 ignoreip 中添加自己的 IP,或者手动执行解封命令。
  • 服务不生效 :检查日志路径是否正确、防火墙是否正常运行(如 iptables -L 查看规则)。
  • 适配不同防火墙 :默认用 iptables,如需用 ufw,需在 jail.conf 中设置 banaction = ufw

这份配置针对 Web 登录页面暴力破解 (如 WordPress 后台、自定义登录页)和 404 洪水攻击,分别适配 Nginx 和 Apache 服务。

前置条件

  1. 已安装 Fail2ban(参考之前的安装步骤)
  2. Web 服务日志路径正确且可被 Fail2ban 读取
  3. 防火墙(iptables/ufw)正常运行

一、 Nginx 防护配置

场景 1:防护 WordPress 登录页(wp-login.php

  1. 新建自定义规则文件

    bash

    运行

    复制代码
    sudo nano /etc/fail2ban/jail.d/nginx-wordpress.conf
  2. 写入配置内容

    ini

    复制代码
    [nginx-wp-login]
    enabled = true
    port = http,https  # 同时防护80和443端口
    filter = nginx-wp-login  # 对应filter目录下的规则文件
    logpath = /var/log/nginx/access.log  # Nginx访问日志路径,根据实际情况修改
    maxretry = 5  # 5次失败尝试
    findtime = 900  # 15分钟内
    bantime = 3600  # 封禁1小时
    ignoreip = 127.0.0.1/8  # 忽略本地IP,可添加自己的办公IP
  3. 创建过滤规则文件 Fail2ban 需要正则规则来匹配失败登录日志,新建 filter 文件:

    bash

    运行

    复制代码
    sudo nano /etc/fail2ban/filter.d/nginx-wp-login.conf

    写入以下内容(匹配 wp-login.php 的 403/401 错误):

    ini

    复制代码
    [Definition]
    failregex = ^<HOST> -.*GET /wp-login.php.* (403|401)
    ignoreregex =

场景 2:防护通用 Web 登录页(自定义 401 错误)

如果是自研登录页,以返回 401 Unauthorized 为例:

  1. 新建 jail 配置文件 /etc/fail2ban/jail.d/nginx-login.conf

    ini

    复制代码
    [nginx-login]
    enabled = true
    port = http,https
    filter = nginx-login
    logpath = /var/log/nginx/access.log
    maxretry = 3
    findtime = 600
    bantime = 7200
    ignoreip = 127.0.0.1/8
  2. 新建过滤规则 /etc/fail2ban/filter.d/nginx-login.conf

    ini

    复制代码
    [Definition]
    failregex = ^<HOST> -.*POST /login.* 401
    ignoreregex =

二、 Apache 防护配置

场景 1:防护 WordPress 登录页

  1. 新建 jail 配置文件

    bash

    运行

    复制代码
    sudo nano /etc/fail2ban/jail.d/apache-wordpress.conf

    写入内容:

    ini

    复制代码
    [apache-wp-login]
    enabled = true
    port = http,https
    filter = apache-wp-login
    logpath = /var/log/apache2/access.log  # Apache默认日志路径,根据实际修改
    maxretry = 5
    findtime = 900
    bantime = 3600
    ignoreip = 127.0.0.1/8
  2. 新建过滤规则文件

    bash

    运行

    复制代码
    sudo nano /etc/fail2ban/filter.d/apache-wp-login.conf

    写入正则匹配规则:

    ini

    复制代码
    [Definition]
    failregex = ^<HOST> -.*GET /wp-login.php.* (403|401)
    ignoreregex =

场景 2:防护 404 洪水攻击

针对大量请求不存在页面的攻击行为:

  1. 新建 jail 配置 /etc/fail2ban/jail.d/apache-404.conf

    ini

    复制代码
    [apache-404]
    enabled = true
    port = http,https
    filter = apache-404
    logpath = /var/log/apache2/access.log
    maxretry = 20  # 短时间内20次404触发封禁
    findtime = 300  # 5分钟窗口
    bantime = 3600
    ignoreip = 127.0.0.1/8
  2. 新建过滤规则 /etc/fail2ban/filter.d/apache-404.conf

    ini

    复制代码
    [Definition]
    failregex = ^<HOST> -.* 404
    ignoreregex =

三、 生效与验证步骤

  1. 重启 Fail2ban 服务

    bash

    运行

    复制代码
    sudo systemctl restart fail2ban
  2. 查看防护规则状态

    bash

    运行

    复制代码
    # 查看所有启用的jail
    sudo fail2ban-client status
    # 查看某个具体规则的封禁IP(以nginx-wp-login为例)
    sudo fail2ban-client status nginx-wp-login
  3. **手动测试封禁(可选)**多次访问受防护的登录页并输入错误密码,然后执行上述状态命令,查看自己的 IP 是否被封禁。

四、 常见问题解决

  1. 规则不生效
    • 检查日志路径是否正确:cat /var/log/nginx/access.log 确认日志正常生成
    • 验证正则规则:fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-wp-login.conf
  2. 误封正常 IP
    • ignoreip 中添加该 IP
    • 手动解封:sudo fail2ban-client set nginx-wp-login unbanip 你的IP
相关推荐
夏幻灵12 小时前
HTML5里最常用的十大标签
前端·html·html5
Mr Xu_12 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝12 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions12 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发12 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_13 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞0513 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、13 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao13 小时前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly13 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强