真实案例:

查看nginx日志,发现别有用心的人恶意调用API接口刷短信:

30966487 115.213.229.38 "-" [05/Jun/2018:14:37:29 +0800] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.003 200 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"30963985 60.181.111.140 "-" [05/Jun/2018:14:37:29 +0800] 0.004 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.004 200 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"30959954 220.190.18.25 "-" [05/Jun/2018:14:37:29 +0800] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.003 200 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" https://xxxxxx/sendCheckCode

思考了几种方案,最终考虑使用如下的ip黑名单的方式。


一、nginx黑名单方式:

1、过滤日志访问API接口的IP,统计每10分钟调用超过100次的IP,直接丢进nginx的访问黑名单

2、具体步骤:

编写shell脚本:

vim /shell/nginx_cutaccesslog.sh#!/bin/bashlog_path=/xxx/nginx/logsdate=`date -d "10 min ago" +%Y%m%d-%H:%M:%S`nginxpid=`cat ${log_path}/nginx.pid`cd ${log_path}#过滤access.log中正常访问API接口并在10分钟(下面是日志切割,再做个定时任务每10分钟执行一次,就可以实现了)内访问量最高的30个IP,取值如果此IP访问量大于100次,则把此IP放入黑名单cat access.log | grep sendCheckCode | grep -v 403 | awk '{print $2}'|sort|uniq -c | sort -k1 -n | tail -30 | awk '{if($1>100) print "deny "$2";"}' > ../conf/denyip.conf#日志切割,做定时任务,每10分钟执行一次mv ${log_path}/access.log ${log_path}/accesslog.bak/access_${date}.log../sbin/nginx -s reload

可自己定义时间间隔和访问量,也可取消筛选访问量最高的30个,直接取值每10分钟访问接口超过100次的

其中:"grep -v 403" 是把已经禁止访问的IP给过滤掉,只筛选正常访问的

3、修改nginx.conf

在http模块加入:

include denyip.conf;

重新加载nginx生效。

4、添加计划任务:

*/10 * * * * /bin/bash /shell/nginx_cutaccesslog.sh > /dev/null 2>&1

5、验证:

[root@xxx logs]# ll accesslog.bak/-rw-r--r-- 1 root root 2663901 Jun 5 15:10 access_20180605-15:00:01.log-rw-r--r-- 1 root root 13696947 Jun 5 15:20 access_20180605-15:10:01.log-rw-r--r-- 1 root root 13265509 Jun 5 15:30 access_20180605-15:20:01.log-rw-r--r-- 1 root root 13846297 Jun 5 15:40 access_20180605-15:30:01.log[root@xxx logs]# cat ../conf/denyip.conf ……………………deny 112.12.137.28;deny 183.167.237.229;deny 111.41.43.58;deny 115.217.117.159;deny 219.133.100.133;deny 171.221.254.115;deny 60.184.131.6;……………………

再查看已经禁用IP的访问日志,则会返回403错误:

[root@xxx logs]# tail -f access.log | grep "60.184.131.6"31268622 60.184.131.6 "-" [05/Jun/2018:15:47:34 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"31268622 60.184.131.6 "-" [05/Jun/2018:15:47:35 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"31268622 60.184.131.6 "-" [05/Jun/2018:15:47:35 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" https://xxxxxx/sendCheckCode

二、限制IP请求数:

处理这种情况的方法还有一种是限制单 IP 单位时间的请求数,以及单 IP 的并发连接数

此方法没有实际运用,因为感觉这种方法会误杀正常的访问用户

写一下此方法的大概配置,http模块加入:


如何估算 limit_req_zone size:

一兆字节区域可以保持大约1万6064字节的状态。

那么 10M 就可以存储 16 万的 IP 统计信息, 这个对普通应用足够了,16 万每秒的 UV,已经超级厉害了。

如果 size 的大小如果设置小了, 例如设置成 1M,那么当一秒内的请求 IP 数超过 16000 的时候,超出的 IP 对应的用户看到的均为 503 Service Temporarily Unavailable 页面了。参考, 漏桶算法 Leaky Bucket。 同时,rate 的单位用 r/s 非常合适,如果换成按天,按小时计数,10M 的内存肯定不够用。


如何估算 limit_req_zone rate:

首先需要知道的是,普通浏览器的同时并发数量。按照 Dropbox 技术博客里所谈到的,目前主流浏览器限制 AJAX 对同一个子域名的并发连接数是6个。IE 6,IE 7 是两个。

大多数浏览器每个主机名都有6个并发连接的限制。


后面小编会分享更多运维干货,感兴趣的朋友可以关注一下~

nginx 过滤post报文 防火墙_详解nginx限制IP恶意调用短信接口处理方法相关推荐

  1. nginx 过滤post报文 防火墙_十八般武艺之Nginx踩坑总结

    显示乱码问题 server { listen 80; server_name example.com; root /var/www/example; location / { charset utf- ...

  2. nginx 过滤post报文 防火墙_前端开发必备的Nginx知识(值得收藏)

    随着IT行业的发展,前端已经不仅仅只是页面层次,现在是一个大前端的时代,你不仅仅需要懂得如何部署项目,如果使用轻量型服务器,还要懂得如何使得你的页面响应更快,如何解决内外网API交互的问题,Nginx ...

  3. android 阿里大鱼短信接口,详解dedecms使用整合阿里大鱼短信接口进行短信发送的教程...

    阿里大鱼虽免费,但不足的是内容.签名什么都要进行审核,且短信内容必须以模版方式进行调用,不能根据自己的需求随意发送, 接下介绍下阿里大鱼免费短信具体实现方法,该方法php程序可通用. 首先要去阿里大鱼 ...

  4. vue 加载页面时触发时间_详解Vue.js在页面加载时执行某个方法

    详解Vue.js在页面加载时执行某个方法 jQuery中可以这样写 vue中,如果要达到相同效果,可以使用vue的生命周期函数,如create或者mounted 附上vue.js的生命周期函数执行流程 ...

  5. 用python画圆角矩形_详解微信小程序canvas圆角矩形的绘制的方法

    详解微信小程序canvas圆角矩形的绘制的方法 发布时间:2020-10-04 18:20:31 来源:脚本之家 阅读:103 作者:清夜 微信小程序允许对普通元素通过 border-radius 的 ...

  6. python三维图切片提取_详解Python二维数组与三维数组切片的方法

    如果对象是二维数组,则切片应当是x[:]的形式,里面有一个冒号,冒号之前和之后分别表示对象的第0个维度和第1个维度: 如果对象是三维数组,则切片应当是x[::],里面有两个冒号,分割出三个间隔,三个间 ...

  7. python中的iloc函数_详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也 ...

  8. nginx文件系统大小_详解Nginx系列

    1.Nginx特点 Nginx是一个事件驱动架构,而非传统过程驱动架构.具有内存占用低,当并发连接大时,能够预测内存使用率.Nginx改变了传统的web服务器体系架构,提高了响应速度,起初Nginx开 ...

  9. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

  10. 直接访问静态图片_详解nginx和tomcat访问图片和静态页面的配置方法

    概述 生产环境下,有时候需要访问图片,正常需要应用ftp.nginx等配套使用,但是有时候为了简化,可以用以下的两种简单的访问,说实话,就是为了偷懒,但是效果是能有的,这就行了,所以今天做这个简化版的 ...

最新文章

  1. Ogitor的编译配置全过程
  2. win2000server IIS和tomcat5多站点配置
  3. 干货!Java字节码增强探秘
  4. 冯诺依曼原理中计算机包括功能部件,水泥越细,强度发展越快,对混凝土性能也越好...
  5. mysql+linux+无法启动服务无法启动不了_Linux实例中MySQL服务常见的无法启动或启动异常处理...
  6. 50道 JavaScript 经典面试题汇总篇
  7. ARTetris-AR版俄罗斯方块的源码解析
  8. 中国制造业加速拥抱云计算 产业规模达1500亿
  9. 使用python实现日志功能
  10. java listener 原理_Java三大器之监听器(Listener)的工作原理和代码演示
  11. tplink怎么进去_在TP-Link工作体验如何?
  12. (一)制作U盘启动盘
  13. 上门回收废品的app
  14. python处理adb截屏_《自拍教程38》Python_adb一键截屏
  15. IPV4服务器如何支持ipv6访问
  16. Siri, Alexa, Cortana, 为什么所有的语音助手都是“她”?
  17. 防火墙开放了端口,但无法talent到端口
  18. java计算机毕业设计医疗器械销售电子商城源程序+mysql+系统+lw文档+远程调试
  19. python数据库迁移命令_创建和进行数据库迁移,同步数据库
  20. 正交基与非正交基在信号表达上的区别

热门文章

  1. Druid.jar包
  2. cad.net 在cad2008引用了错误的com接口的dll导致出现了
  3. 出现java.lang.NoSuchMethodError错误的原因
  4. 【转】基于nginx + lua实现的反向代理动态更新
  5. 【C++】指针的引用及面向对象
  6. 实习三个月的地一个完整项目总结
  7. 自适应的设置字体的方式
  8. javascript的一些各浏览器不兼容的地方
  9. javascript location.href 参数详解
  10. Proteus中8259的仿真[无dos,纯手工]