Fail2Ban + Nginx 防护教程

发布于 2025-12-07 500 字 最后更新于 22 天前 Web 开发与部署


AI 摘要

本文聚焦于利用 Fail2Ban 为 Nginx 实现精准的扫描防护。虽然 Fail2Ban 常被视作 SSH 暴力破解的守门员,但通过自定义 filter 抓取访问敏感路径并返回 404 的请求,可在短时间窗口内自动封禁恶意 IP,却不误伤常见搜索机器人。这一做法揭示了日志正则与阈值设置的微妙平衡,是多数运维忽视的关键防线。

一、Fail2Ban 是做什么的

防 Nginx【1】 扫描、防 SSH 暴力破解

同一 IP 在一定时间内触发相应规则超过一定次数,就会自动封禁

二、Fail2Ban 的安装

以 Debian/Ubuntu【2】 为例:

sudo apt update
sudo apt install fail2ban -y

# 启动并开机自启
sudo systemctl enable --now fail2ban

# 确认服务启动成功
sudo systemctl status fail2ban

安装后的主配置文件在:/etc/Fail2Ban【3】/

三、主要文件/目录说明

  • jail.conf【4】:官方默认配置模板
  • jail.local【6】:全局自定义配置
  • jail.d【7】/*.conf:存放一些规则
  • filter.d【8】/*conf:存放一些策略

四、Nginx 配置示例

1. Filter:nginx-scan

文件:/etc/fail2ban/filter.d/nginx-scan.conf

# 作用:从 Nginx 访问日志中抓“扫敏感路径”的请求

[Definition]
# <HOST> 是 Fail2Ban 的特殊占位符,代表客户端 IP
# 访问敏感路径并返回 404 时,算一次失败
failregex = ^<HOST> - .* "(GET|POST|HEAD) /(wp-admin|wp-login\.php|phpinfo\.php|\.git(?:/|$)|\.env).*" 404

ignoreregex = (Googlebot|bingbot|ByteDanceSpider|AhrefsBot)

匹配依赖 access.log【9】 默认日志格式,如使用自定义格式需同步调整正则。

2. Jail:nginx-scan

文件:/etc/fail2ban/jail【5】.d/nginx-scan.conf


# 负责处理“扫敏感 URL”的行为 

[nginx-scan]
# 启用这个 jail
enabled  = true
# 一般 Web 流量用 80/443,这里用别名即可
port     = http,https
# 对应 /etc/fail2ban/filter.d/nginx-scan.conf(去掉 .conf)
filter   = nginx-scan
# 如果有多个站点,可以:
#   - 统一放在 /www/wwwlogs/ 下,使用通配符 *.log
#   - 或者多行写多个具体 log 文件
logpath  = /www/wwwlogs/*.log

backend  = auto           

# “阈值逻辑”
# 在 600 秒(10 分钟)时间窗口内
findtime = 600
# 同一 IP 匹配到 5 次,就触发封禁
maxretry = 5
# 封禁时长:86400 秒 = 1 天
bantime  = 86400

五、常用命令

1. 服务控制

  • 启动:sudo systemctl【10】 start fail2ban
  • 停止:sudo systemctl stop fail2ban
  • 重启:sudo systemctl restart fail2ban
  • 查看状态:sudo systemctl status fail2ban

2. 查看单个 jail 列表

  • sudo fail2ban-client【11】 status

3. 查看单个 jail 状态

  • sudo fail2ban-client status nginx-scan

4. 手动解封 IP

  • sudo fail2ban-client set nginx-scan unbanip 1.2.3.4