zoukankan      html  css  js  c++  java
  • nginx限制恶意IP处理方法

    思考了几种方案,最终考虑使用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刷网站的两种方法,如果你有更好的方法,不妨留言讨论一下!

  • 相关阅读:
    [转]nmake命令(windows下的makefile)
    [转]Visual Studio 2010 C++ 工程文件解读
    [转]开源库的编译
    强软弱虚引用试验
    ArtHas JVM在线排查工具
    JVM常用参数
    CMS两个常见问题
    jvisual vm连接
    jconsole连接
    JVM调优
  • 原文地址:https://www.cnblogs.com/uvwill/p/10795821.html
Copyright © 2011-2022 走看看