Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制

临时解决方案:
1、查看Nginx日志发现被攻击的IP 和接口

[root@app_lb1 ~]# tail -f /var/log/nginx/access.log

发现攻击者一直在用POST请求 /fhtowers/user/getVerificationCode这个接口
在这里插入图片描述
2、用awk和grep脚本过滤nginx日志,提取攻击短信接口的ip(一般这个接口是用来发注册验证码的,一分钟如果大于10次请求的话就不是正常的访问请求了,大家根据自己的实际情况更改脚本)并放到一个txt文件中去,然后重启nginx

[root@app_lb1 ~]# cat denyip.sh
#!/bin/bash
nginx_home=/usr/local/openresty/nginx
log_path=/var/log/nginx/access.log
tail -n5000 $log_path | grep  getVerification | awk '{print $1}' |sort | uniq -c | sort -nr -k1 | head -n 100 |awk '{if($1>10)print ""$2""}' >$nginx_home/denyip/blocksip.txt
/usr/bin/nginx -s reload

3、设置Nginx去读取用脚本过滤出来的blocksip.txt(注意一下,我这里的Nginx是用的openresty,自带识别lua语法的,下面会有讲openresty的用法)

    location =  /fhtowers/user/getVerificationCode {  #短信接口
    access_by_lua '
       local f = io.open("/usr/local/openresty/nginx/denyip/blocksip.txt")   #黑名单列表
       for line in f:lines() do
              if ngx.var.http_x_forwarded_for == line then   #如果ip在黑名单列表里直接返回403
                     ngx.exit(ngx.HTTP_FORBIDDEN)
              end
      end
     ';
     proxy_pass http://appservers;   #不在名单里就转发给后台的tomcat服务器
   }

4、把过滤脚本放进crontab任务里,一分钟执行一次

[root@app_lb1 ~]# crontab -e
*/1 * * * * sh /root/denyip.sh

5、查看一下效果
发现攻击者的请求都被返回403并拒绝了
在这里插入图片描述
这个算是个临时方案,不过也给我预警了一下,如果以后还有这种攻击,希望能够提前做好准备
在网上找了找资料,发现用的比较多的是Nginx+Lua脚本+Redis来自动封禁访问频率过高的IP
架构图:比较随意…随便看看吧
在这里插入图片描述

实现方法
环境介绍:
Centos 7.5.1804
openresty/1.13.6.1
redis-3.2.5

一、安装使用 OpenResty,这是一个集成了各种 Lua 模块的 Nginx 服务器,是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器,使用Nginx的同时又能使用lua等模块实现复杂的控制

1、安装编译工具、依赖库

[root@test1 ~]# yum -y install readline-devel pcre-devel openssl-devel gcc

2、下载openresty-1.13.6.1.tar.gz 源码包,并解压;下载ngx_cache_purge模块,该模块用于清理nginx缓存;下载nginx_upstream_check_module模块,该模块用于ustream健康检查

[root@test1 ~]# cd /usr/local/
[root@test1 local]# wget https://openresty.org/download/openresty-1.13.6.1.tar.gz
[root@test1 local]#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值