Fail2Ban是一款基于日志分析的入侵防御工具,通过监控Nginx访问日志实时检测HTTP暴力破解行为,并自动封禁恶意IP。该方案可有效防御WordPress登录爆破、API密钥穷举等常见攻击,显著降低服务器安全风险。
核心配置流程****
1. 安装与基础配置****
bash
| # Debian/Ubuntu系统 | |
|---|---|
| sudo apt install fail2ban -y | |
| # CentOS/RHEL系统 | |
| sudo yum install epel-release -y | |
| sudo yum install fail2ban -y |
配置文件结构:
· /etc/fail2ban/jail.local(自定义规则)
· /etc/fail2ban/filter.d/(自定义过滤器)
2. 创建Nginx专用过滤器****
在/etc/fail2ban/filter.d/nginx-http-auth.conf中定义匹配规则:
ini
| [Definition] | ||||||
|---|---|---|---|---|---|---|
| failregex = ^ -.*"(GET | POST | PUT | DELETE).HTTP/1." 401 \d+ "-" .$ | |||
| ^ -.*"(GET | POST | PUT | DELETE).HTTP/1." 403 \d+ ".?(wp-login | admin | login).".$ | |
| ignoreregex = |
规则说明:
· 匹配401/403状态码的HTTP请求
· 针对WordPress登录页(wp-login)、通用管理路径(admin/login)等敏感URI
3. 配置封禁策略****
在/etc/fail2ban/jail.local中添加自定义jail:
ini
| [nginx-http-auth] | |
|---|---|
| enabled = true | |
| filter = nginx-http-auth | |
| logpath = /var/log/nginx/access.log | |
| maxretry = 5 # 5次失败后触发封禁 | |
| findtime = 600 # 10分钟内计数 | |
| bantime = 86400 # 封禁24小时 | |
| action = iptables[name=HTTP, port=http, protocol=tcp] |
4. 高级防护策略****
用户代理过滤****
扩展过滤器以检测异常User-Agent:
ini
| | failregex += ^ -."(GET|POST).HTTP/1." 403 \d+ ".?."."(Mozilla/0|curl|python-requests).".*$ | | - | -------------------------------------------------------------------------------------------------------------------- |
自定义响应码检测****
针对特定业务场景添加规则:
ini
| failregex += ^ -."(POST).HTTP/1." 200 \d+ ".?api_key=.".*$ # 检测API密钥穷举 |
|---|
多日志源监控****
同时监控错误日志和访问日志:
ini
| logpath = /var/log/nginx/access.log | |
|---|---|
| /var/log/nginx/error.log |
验证与维护****
1.
测试规则:
2.
3.
bash
4.
5.
| fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-http-auth.conf |
|---|
6.
7.
查看封禁状态:
8.
9.
bash
10.
11.
| fail2ban-client status nginx-http-auth | ||
|---|---|---|
| iptables -L -n | grep HTTP # 检查防火墙规则 |
12.
13.
白名单管理:
在/etc/fail2ban/jail.local中添加:
14.
15.
ini
16.
17.
| [DEFAULT] | |
|---|---|
| ignoreip = 127.0.0.1/8 192.168.1.0/24 # 信任IP段 |
18.
通过该方案,Fail2Ban可自动将日均暴力破解尝试次数从数千次降至个位数,结合Nginx的limit_req模块使用效果更佳。建议每周审查封禁日志,避免误封合法爬虫或动态IP用户。