技术日志

记录分享邓杰律师从事网络技术工作点点滴滴。

位置:首页>资讯动态>技术日志

linux nginx环境中利用 Fail2Ban屏蔽访问网站恶意ip

点击复制标题网址

——温馨提示——

已复制到剪贴板,可粘贴到下一处。


时间:2025-12-18   访问量:1038

编者按:在 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

本文标签:

发表评论:

评论记录:

未查询到任何数据!
关于律师
————受人之托,忠人之事————
深圳数据合规律师
邓杰律师

专业

专注执业领域事务

尽责

全力办理委托事项

务实

扎实维护合法权益

邓杰系深耕于数据合规领域复合型资深专业律师,其律师执业证号为14403201810022100。邓杰律师现(曾)任WEB前端开发工程师、WEB服务器维护工程师、计算机信息网络安全员、深圳市人民政府听证员、深圳市政府采购评审专家(法律类)、深圳市某区政府系统公职律师,在网络领域和政府系统从业多年,深刻理解网络前沿技术和行政程序运行规则,十分擅长互联网+平台领域数据合规法律实务,可为政府、企业和个人在数据合规领域提供富有针对性的非诉、诉讼、仲裁、执行等法律风险防控解决方案,能有效维护当事人的各类合法权益。

扫一扫,存名片

深圳数据合规律师名片

律师名片

QQ扫一扫

深圳数据合规律师qq

QQ咨询

电话咨询

邓杰律师电话:13715198118

请输入您的联系电话,座机请加区号

电话咨询

微信扫一扫

深圳数据合规律师微信

微信联系