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

处理方法:

一、nginx黑名单方式:

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

2、具体步骤:

编写shell脚本:

vim /shell/nginx_cutaccesslog.sh
#!/bin/bash
log_path=/xxx/nginx/logs
date=`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模块加入:

http {limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s;server {location /search/ {limit_req zone=one burst=5;}

如何估算 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个并发连接的限制。

PS:以上就是感觉比较良好的防御恶意IP刷网站的两种方法,如果你有更好的方法,不妨留言讨论一下!

转载于:https://www.cnblogs.com/uvwill/p/10795821.html

nginx限制恶意IP处理方法相关推荐

  1. nginx防恶意ip访问控制

    业务分析:考虑到存在恶意用户频繁访问系统,采用nginx限制ip的访问! 描述:用户请求浏览器,经过后台的nginx层,路由到gateway网关层,由网关对应到后端的微服务.其中nginx层可以统计用 ...

  2. 首层nginx 传递 二级代理,三级代理......多级代理nginx 客户端真实IP的方法

    首层nginx(172.25.10.1):先获取真实IP($remote_addr),再将真实IP传递给X-Forwarded-For     proxy_set_header X-Real-IP $ ...

  3. nginx 防止恶意域名解析_配置nginx只允许域名访问,禁止ip访问【图文教程】

    平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我.跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心 ...

  4. Nginx封禁恶意IP

    网络攻击时有发生, TCP洪水攻击.注入攻击.DOS等 比较难防的有DDOS等 数据安全,防止对手爬虫恶意爬取,封禁IP 一般就是封禁ip linux server的层面封IP:iptables ng ...

  5. Nginx防止恶意解析-禁止通过IP访问网站

    https://www.jianshu.com/p/0921e033e355 参考链接 : Nginx防止恶意解析-禁止通过IP访问网站https://www.jianshu.com/p/0921e0 ...

  6. 常见几个方式禁止IP访问网站(PHP、Nginx、Apache不同设置方法)

    1.PHP禁止IP和IP段访问 <? //禁止某个IP $banned_ip = array ( "127.0.0.1", //"119.6.20.66" ...

  7. 使用Nginx做前端服务器时让Apache得到真实IP的方法

    一:nginx.conf proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header ...

  8. 封禁恶意IP访问在我司实践总结

    1.需求分析 随着公司业务量的增长,有些人可能就会动些小心思搞你一下,爬虫或者恶意访问你,如何限制这些用户访问呢,今天做下总结,大体有三种方案:代码层面:http服务器(以nginx为例):服务器网络 ...

  9. nginx 防止恶意域名解析_Nginx 防止被域名恶意解析的办法

    这篇文章主要介绍了Nginx 防止被域名恶意解析的方法的相关资料,希望通过本文能帮助到大家,让大家掌握理解这部分内容,需要的朋友可以参考下 Nginx 防止被域名恶意解析的办法 前言: 今天太倒霉了, ...

最新文章

  1. 科学家利用脑机接口让患者正常发声
  2. python提取图像的每一帧
  3. 如何新增或修改ns2的核心模組--queue management
  4. 【BZOJ3669】【codevs3314】魔法森林,写作LCT,读作SPFA
  5. java循环1000000000_Java11比Java8快多少,不是测试人员一眼也能看懂
  6. HDU1881 毕业bg【0-1背包】
  7. vue各种组件(不断增加中...)
  8. Hibernate学习笔记:数据库连接的配置
  9. 【教程】Edraw Max(亿图图示):使用免费模板和示例快速制作发票
  10. Python enumerate,iter的用法
  11. 关于麒麟座开发板串口打印乱码与其它工程用官方源码出问题的解决方案
  12. 巨高兴,自己的“万能数据库查询分析器”中英文 3.01版本 已经在国内6大软件下载网站发布
  13. powerquery分组_Power Query中的Table.Group函数详细分析
  14. 浅谈对transforms.ToTensor()和transforms.Normalize()函数的理解
  15. FontAwesome-基本样式-1.1
  16. 2020年阴历二月十六 读书笔记之漫步华尔街行为金融学
  17. 服务器和微内核系统哪个好,分析微内核架构操作系统优缺点
  18. 超模脸、网红脸、萌娃脸...换头像不重样?我开源了5款人脸生成器
  19. TFS二次开发系列:八、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(二)
  20. Python 实现学生管理系统(面向对象版)

热门文章

  1. 不能忍!世界首富贝索斯发博文称遭”不雅照”威胁
  2. 请查收~微信春节聊天彩蛋 微信群的卖萌小神器
  3. 模块目录下site.php,使用apache配置为每个站点指定PHP包含目录
  4. java 接口 设计模式吗_JAVA接口设计模式-工厂模式
  5. python自动化测试框架有哪几种_Python自动化测试-Unittest单元测试框架详解
  6. FTP主动模式和被动模式学习笔记
  7. 内连接和等值连接的区别
  8. php 目录文件大小,利用php怎么对目录文件的大小进行统计
  9. 【Spark】Spark Class is not registered joins UnsafeHashedRelation kryo
  10. 【Elasticsearch】Curator 从入门到实战