Nginx+Fail2ban 实现同一ip在一分钟内连续三次请求同一接口并响应成功时进行封禁
1. 安装 Fail2Ban 和 Nginx
如果尚未安装 Fail2Ban 和 Nginx,可以使用以下命令进行安装:
# CentOS默认的仓库中可能不包含Nginx,所以需要添加EPEL(Extra Packages for Enterprise Linux)仓库。
sudo yum install epel-release、
# 安装 Fail2Ban 和 Nginx
sudo yum install fail2ban nginx
2. 确认 Nginx 日志文件位置
确保 Nginx 正在生成访问日志和错误日志,默认情况下,这些日志位于 /var/log/nginx/access.log 和 /var/log/nginx/error.log。
3. 配置 Fail2Ban 监控 Nginx 日志
3.1 创建 Nginx 过滤器(filter)
创建一个新的过滤器文件以检测恶意行为,例如:/etc/fail2ban/filter.d/nginx-ql-reg-sms.conf
sudo nano /etc/fail2ban/filter.d/nginx-ql-reg-sms.conf
nginx-ql-reg-sms.conf内容如下
[Definition]
failregex = ^<HOST> - - .* "GET /api/platform/staff/register/.* HTTP/.*" 200
ignoreregex =
3.2 创建触发过滤器的处理方式(action)
sudo nano /etc/fail2ban/filter.d/nginx-ql-reg-sms-block.conf
nginx-ql-reg-sms-block.conf内容如下:主要是定义了封禁和解禁的动作,封禁时往blockedips.conf中追加一个ip,解禁时移除blockedips.conf中对应的ip
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = echo "deny <ip>;" >> /etc/nginx/blockedips.conf && nginx -s reload
actionunban = sed -i "/deny <ip>;/d" /etc/nginx/blockedips.conf && nginx -s reload
Nginx中的 deny 命令
deny 命令用于拒绝特定的IP地址或IP范围访问某些资源。在Nginx中,deny 指令通常配合 allow 指令使用,以控制对特定资源的访问权限。
使用 deny 命令的场景
封禁特定IP地址:
拒绝某些恶意IP地址的访问。
控制访问权限:
限制内部资源只允许特定IP访问,其他IP一律拒绝。
基本语法
# <address> 可以是单个IP地址、CIDR格式的IP地址范围,或者all(表示拒绝所有访问)。
deny <address>;
# 拒绝单个IP地址访问
location / {
deny 192.168.1.1;
allow all;
}
# 拒绝IP地址范围访问
location / {
deny 192.168.1.0/24;
allow all;
}
# 只允许特定IP地址访问,其他全部拒绝
location /admin {
allow 192.168.1.100;
deny all;
}
3.3使用自定义的过滤器和处理方式
编辑/etc/fail2ban/jail.local,在末尾加上如下配置
#是自定义监控项的名称。
[nginx-ql-reg-sms]
#启用监控项
enabled = true
# 指定使用创建的过滤器文件
filter = nginx-ql-reg-sms
#定义了触发封禁时执行的动作
action = nginx-ql-reg-sms-block
#指定 Nginx 访问日志的位置
logpath = /var/log/nginx/access.log
#在 findtime 时间内允许的最大重试次数
maxretry = 3
#检测时间窗口为 60 秒,即一分钟内
findtime = 60
#封禁时间为 3600 秒(即 1 小时)
bantime = 60
3.4 nginx中对指定接口进行拦截配置
# 在对应的server块中配置具体的接口
location /api/platform/staff/register/ {
# 引入封禁IP列表
include /etc/nginx/blockedips.conf;
proxy_pass http://172.16.0.5:93/api/platform/staff/register/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
}
4. 常用命令
4.1 启动和重启 Fail2Ban 服务
# 配置修改后,需要启动或重启 Fail2Ban 服务:
sudo systemctl restart fail2ban
# nginx配置修改后需要重载配置
/usr/sbin/nginx -t # 检查配置是否合法
/usr/sbin/nginx -s reload 重载配置
你可以使用以下命令检查 Fail2Ban 的状态,确保其正常运行:
sudo systemctl status fail2ban
4.2 查看所有封禁的 IP
列出所有监狱:首先,列出所有启用的 Fail2Ban 监狱:
sudo fail2ban-client status
查看特定监狱的详细信息:接下来,查看特定监狱的状态和封禁的 IP 地址。例如,要查看 nginx-api-platform-staff-register 监狱的状态:
sudo fail2ban-client status nginx-ql-reg-sms
4.3 解禁IP
如果需要解封某个 IP,可以使用以下命令:
sudo fail2ban-client set nginx-ql-reg-sms unbanip <IP_ADDRESS>
4.4 查看 Fail2Ban 的状态
# 用来检测当前过滤器在nginx访问日志中是否有匹配数据
sudo fail2ban-client status nginx-ql-reg-sms
Nginx+Fail2ban 实现同一ip在一分钟内连续三次请求同一接口并响应成功时进行封禁的更多相关文章
- Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)
在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...
- 一分钟内搭建全web的API接口神器json-server详解
JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源. 安装json-server npm install -g json ...
- django 实现同一个ip十分钟内只能注册一次
很多小伙伴都会有这样的问题,说一个ip地址十分钟内之内注册一次,用来防止用户来重复注册带来不必要的麻烦 逻辑: 取ip,在数据库找ip是否存在,存在判断当前时间和ip上次访问时间之差,小于600不能注 ...
- nginx环境安装配置fail2ban屏蔽攻击ip
安装 fail2ban yum install -y epel-release yum install -y fail2ban 设置 Nginx 的访问日志格式 这个是设置 fail2ban 封禁 ...
- nginx 限制及指定IP或IP段访问
nginx 限制及指定IP或IP段访问. location / { deny 192.168.1.1; allow ; allow ; deny all; } 企业问题案例:Nginx做反向代理的时候 ...
- nginx反向代理取得IP地址
nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递 ...
- Nginx负载均衡反向代理 后端Nginx获取客户端真实IP
Nginx 反向代理后,后端Nginx服务器无法正常获取客户端的真实IP nginx通过http_realip_module模块来实现的这需要重新编译,如果提前编译好了就无需重新编译了1,重新编译ng ...
- django 实现同一个ip十分钟内只能注册一次(redis版本)
上一篇文章,django 实现同一个ip十分钟内只能注册一次 的时候,我们在注册的时候选择使用的使我们的数据库来报错我们的注册的ip信息,可是如果数据量大,用户多的时候,单单靠我们的数据库 来储存我们 ...
- nginx获取上游真实IP(ngx_http_realip_module)
realip模块的作用是:当本机的nginx处于一个反向代理的后端时获取到真实的用户IP,如果没有realip模块,nginx的access_log里记录的IP会是反向代理服务器的IP,PHP中$_S ...
- Nginx 通过 Lua + Redis 实现动态封禁 IP
一.背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 二.架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面 ...
随机推荐
- WPF 基础 2D 图形学知识 判断点是否在线段上
在知道一个使用两个点表示的线段,和另一个点,求另一个点是否在线段上 本文算法属于通用的算法,可以在 WPF 和 UWP 和 Xamarin 等上运行,基本上所有的 .NET 平台都能执行 如下图,如果 ...
- 全网最详细SpringCloud-实用篇
SpringCloud-实用篇 学习安排 技术分类 1.微服务 ①架构对比 架构 单体架构 分布式架构 描述 将业务的所有功能集中在一个项目中开发,打成一个包部署. 根据业务功能对系统做拆分,每个业务 ...
- foreach更改element内容后this到data不生效导致页面数据无变化
list.forEach(element => { element = element.split('^') console.log(element) }) 数据已经被更改,但在外部t ...
- 什么是SQL 语句中相关子查询与非相关子查询
1.什么是SQL子查询 要理解相关子查询和非相关子查询,我们得首先理解什么是子查询,子查询是指在一个查询语句中嵌套的另一个查询语句. 子查询可以嵌套在其他查询语句中,如 SELECT.INSERT.U ...
- CF1800F Dasha and Nightmares
F.Dasha and Nightmares 题意:\(n\) 个字符串 \(s_i\),问有多少对不同的 \((i, j) \ (1 \le i \le j \le n)\),使得 \(s_i\) ...
- ibus 输入法导致输入卡顿的解决方案
系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...
- three.js教程7-PBR材质与环境贴图CubeTextureLoader
1.PBR材质 PBR是基于物理的渲染(physically-based rendering).模拟物体表面的反射算法. Three.js提供了两个PBR材质相关的类MeshStandardMater ...
- 使用 Spacesniffer 找回 48G 系统存储空间的总结
前言 Spacesniffer 是一个免费的文件扫描工具,通过使用树状图可视化布局,可以立即了解大文件夹的位置,帮助用户处理找到这些文件夹 当前系统C盘空间 清理后系统C盘空间 下载 Spacesni ...
- ffmpeg之视频(avc+aac)无损转mp4(批处理,拖放)
很多能够无损转视频的工具都来自命令行的ffmpeg版本,本文将介绍如何简单的批处理方法(直接拖放到bat文件上)来实现无损转视频. 工具/原料 ffmpeg(默认的static版本) 方法/步骤 ...
- docker 监控数据整合
安装docker #开启内核转发 echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf sysctl -p wget -O /etc/yum.repo ...