记录分享邓杰律师从事网络技术工作点点滴滴。
编者按:在 Linux + Nginx 环境中使用 Fail2Ban 屏蔽访问网站的恶意 IP,具有重要的安全防护作用和运维意义。Fail2Ban 是基于日志的事后响应机制,无法像 Web 应用防火墙(WAF)那样实时拦截 SQL 注入、XSS 等应用层攻击。应作为纵深防御的一环,而非唯一手段。
在 Linux + Nginx 环境中使用 Fail2Ban 屏蔽访问网站的恶意 IP,具有重要的安全防护作用和运维意义。以下是详细说明:
一、核心作用
1. 自动识别并封禁恶意行为。Fail2Ban 通过实时监控 Nginx 的访问日志(access.log)或错误日志(error.log),自动识别以下典型恶意行为:
频繁返回 403/404/500 等异常状态码(如暴力扫描目录、探测后台)大量请求 不存在的页面(爬虫、漏洞扫描器)尝试访问 敏感路径(如 /wp-admin, /phpmyadmin, .env, /backup.zip)触发 速率限制(可配合自定义规则)
一旦某 IP 在设定时间窗口内触发阈值(如 5 分钟内出现 10 次 404),Fail2Ban 会自动调用防火墙(如 iptables、nftables)将其封禁。
2. 减轻服务器负载
恶意扫描或攻击通常伴随高频请求,会:消耗 CPU 和内存资源占用带宽导致正常用户访问变慢甚至服务不可用。Fail2Ban 能快速切断源头,显著降低无效流量,提升服务稳定性。
3. 防止信息泄露与入侵尝试
许多攻击者通过以下方式试探系统弱点:扫描备份文件(.sql, .bak),探测配置文件(config.php, .git),尝试常见弱口令登录(如 WordPress 后台)。
Fail2Ban 可在首次异常行为后就封禁 IP,阻断后续更危险的攻击链。
二、实际意义(运维 & 安全角度)
自动化防御 无需人工干预,7×24 小时自动响应,适合无人值守服务器;
低成本高效益 开源免费,资源占用极低,却能防御大量自动化攻击;
日志驱动精准防护 基于真实日志行为判断,误封率低(合理配置前提下);
合规与审计支持 提供封禁记录(/var/log/fail2ban.log),便于安全审计;
延缓高级攻击 虽不能防御 APT 或 0day,但能有效阻挡脚本小子和自动化工具。
三、典型应用场景(Nginx 环境)
防止目录爆破 监控 404 错误,封禁高频请求不存在路径的 IP;
阻止 WordPress 暴力登录 监控 /wp-login.php 返回 200 但含“错误密码”关键词;
封禁爬取敏感文件的 IP 匹配请求路径含 .env、/backup/、/.git/;
防御 CC 攻击(轻量级) 结合 nginx-limit-req 日志,封禁超频 IP;
阻止伪造 User-Agent 的机器人 自定义正则匹配恶意 UA 并封禁;
💡 示例:你之前配置的 nginx-403 jail,正是用于封禁因权限问题被拒绝(403)但仍持续访问的 IP——这类行为极可能是自动化扫描器。
四、注意事项
1. 避免误封正常用户
合理设置 maxretry 和 findtime(如 5 次/10 分钟)
对 CDN 用户需解析真实 IP(通过 $http_x_forwarded_for)
2. 日志格式需匹配
Fail2Ban 依赖正则表达式解析日志,若 Nginx 使用了非标准日志格式,需同步调整 failregex。
3. 封禁时效性
默认封禁时间较短(如 10 分钟),对持续攻击者建议延长 bantime 或使用 recidive jail 实现长期封禁。
4. 不能替代 WAF
Fail2Ban 是基于日志的事后响应机制,无法像 Web 应用防火墙(WAF)那样实时拦截 SQL 注入、XSS 等应用层攻击。应作为纵深防御的一环,而非唯一手段。
五、总结
✅ Fail2Ban 在 Nginx 环境中的核心价值是:将“被动记录日志”转化为“主动防御行动”。
它用极低的系统开销,实现了对自动化攻击、恶意扫描、暴力破解等常见威胁的有效遏制,是中小型网站和独立服务器性价比极高的安全加固手段。
配合良好的 Nginx 配置(如限速、隐藏版本号)、定期更新软件、最小权限原则,可构建起基础但有效的安全防线。
具体做法:
在目录下新建/etc/fail2ban/filter.d/nginx-403.conf
并在文件中输入:
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 403
ignoreregex =
打开/etc/fail2ban/jail.local,输入
[nginx-403]
enabled = true
filter = nginx-403
logpath = /www/wwwlogs/*.log
maxretry = 5
findtime = 30
bantime = 3600
保存重启Fail2Ban
执行fail2ban命令行
1.查看结果:
fail2ban-client status nginx-403
示例如下:
[root@VM-12-5-centos ~]# fail2ban-client status nginx-403
Status for the jail: nginx-403
|- Filter
| |- Currently failed: 1
| |- Total failed: 58
| `- File list: /www/wwwlogs/web/xxx.cn.log /www/wwwlogs/web/xxx.cn.error.log
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:
[root@VM-12-5-centos ~]#
2.解除误封ip
fail2ban-client set nginx-403 unbanip 1.2.3.4
3.查看日志路径:/var/log/fail2ban.log
对于长期攻击的恶意ip,可筛选后长时间封禁。
示例如下:
2025-12-19 09:14:26,873 fail2ban.jail [9573]: INFO Jail 'nginx-403' started
2025-12-19 09:14:26,902 fail2ban.filter [9573]: INFO [nginx-403] Found 113.222.194.56 - 2025-12-19 09:13:48
2025-12-19 09:20:02,312 fail2ban.filter [9573]: INFO [nginx-403] Found 216.244.66.201 - 2025-12-19 09:20:02
2025-12-19 09:21:48,413 fail2ban.filter [9573]: INFO [nginx-403] Found 198.235.24.111 - 2025-12-19 09:21:48
2025-12-19 09:38:14,938 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:14
2025-12-19 09:38:16,656 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:16
2025-12-19 09:38:23,821 fail2ban.filter [9573]: INFO [nginx-403] Found 113.44.109.84 - 2025-12-19 09:38:23
2025-12-19 09:38:24,324 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:24
2025-12-19 09:38:24,459 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:24
2025-12-19 09:38:29,362 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:29
2025-12-19 09:38:29,497 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:29
2025-12-19 09:38:29,632 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:29
2025-12-19 09:38:29,644 fail2ban.actions [9573]: NOTICE [nginx-403] Ban 13.71.30.28
2025-12-19 09:38:29,768 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:29
2025-12-19 09:38:29,903 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:29
2025-12-19 09:38:32,211 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:32
2025-12-19 09:38:32,346 fail2ban.filter [9573]: INFO [nginx-403] Found 13.71.30.28 - 2025-12-19 09:38:32
2025-12-19 09:48:29,247 fail2ban.actions [9573]: NOTICE [nginx-403] Unban 13.71.30.28
2025-12-19 09:55:06,480 fail2ban.filter [9573]: INFO [nginx-403] Found 183.131.196.54 - 2025-12-19 09:55:06
2025-12-19 09:55:06,510 fail2ban.filter [9573]: INFO [nginx-403] Found 183.131.196.54 - 2025-12-19 09:55:06
2025-12-19 09:55:44,773 fail2ban.filter [9573]: INFO [nginx-403] Found 1.92.201.13 - 2025-12-19 09:55:44
2025-12-19 10:00:12,641 fail2ban.filter [9573]: INFO [nginx-403] Found 180.101.244.14 - 2025-12-19 10:00:12
对于屡教不改频繁攻击行为,进行加重处罚,打开/etc/fail2ban/jail.local,输入示范代码如下:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime = 604800
findtime = 86400
maxretry = 3
输入命令行fail2ban-client status recidive查看示范结果如下:
Status for the jail: recidive
|- Filter
| |- Currently failed: 18
| |- Total failed: 38
| `- File list: /var/log/fail2ban.log
`- Actions
|- Currently banned: 4
|- Total banned: 4
`- Banned IP list: 134.122.133.121 183.131.196.213 183.131.196.160 20.196.91.230
查看24小时内哪些IP被封禁过,输入示范命令行:
grep -E 'Ban [0-9]{1,3}(.[0-9]{1,3}){3}' /var/log/fail2ban.log
| sed -E 's/.*Ban ([0-9]{1,3}(.[0-9]{1,3}){3}).*//'
| sort | uniq -c | sort -nr
补充,增加对网站CC攻击的防护,方法同上。
[Definition] failregex = ^<HOST> .* "(GET|POST|HEAD).* HTTP.*$ ignoreregex =
[nginx-cc] enabled = true filter = nginx-cc action = iptables-multiport[name=nginx-cc, port="http,https"] logpath = /www/wwwlogs/*.access.log maxretry = 100 findtime = 10 bantime = 3600
本文标签:

专注执业领域事务
全力办理委托事项
扎实维护合法权益

邓杰律师电话:13715198118
请输入您的联系电话,座机请加区号
