搜索

首页  >  问答  >  正文

如何在nginx上防止恶意的ddos抓取

首先我对别人抓取我网站的内容完全没有意见,我也不是一定要严格限制别人抓取,但是某些人的抓取完全没有底线,用一个脚本甚至多个脚本并发的去抓取某个服务器的内容,跟ddos没有区别。

我的服务器目前就遇到了这样的情况,恶意的毫无停顿的抓取,严重影响了我们的日志分析,而且也额外增加了服务器的负载。

请问如何对这种行为做出防范?我用的是nginx服务器,据我所知它只能deny某个ip,但是deny以后还是会出现在日志中,只不过是403了。而且手动的deny太被动了,能否智能判断某个ip访问量猛增,然后把它ban掉?

黄舟黄舟2752 天前1046

全部回复(4)我来回复

  • 某草草

    某草草2017-05-16 17:32:17

    1. ngx_http_limit_conn_module 可以用来限制单个IP的连接数
    http://nginx.org/en/docs/http/ngx_htt...

    2. ngx_http_limit_req_module 可以用来限制单个IP每秒请求数
    http://nginx.org/en/docs/http/ngx_htt...

    3. nginx_limit_speed_module 可以用来对IP限速
    https://github.com/yaoweibin/nginx_li...

    回复
    0
  • 世界只因有你

    世界只因有你2017-05-16 17:32:17

    我也来提供一种解决思路,主要是利用fail2ban(http://www.fail2ban.org/)来解决。fail2ban是通过扫描log来异步判断是否用iptable封禁的,所以对原系统影响比较小,而且不需要重新配置nginx。不过不知道访问量太大是否撑得住。

    首先在/etc/fail2ban/jail.conf里加入

    [http-get-dos]
    enabled = true
    port = http,https
    filter = nginx-bansniffer
    logpath = /usr/local/nginx/logs/segmentfault.log
    maxretry = 120
    findtime = 120
    bantime = 3600
    action = iptables[name=HTTP, port=http, protocol=tcp]

    然后找到/etc/fail2ban/filter.d/nginx-bansniffer.conf,把里面针对404的判断改成

    [Definition]
    
    failregex = <HOST> -.*- .*HTTP/1.* .* .*$
    ignoreregex =

    最后重启fail2ban服务即可,在上面的配置中,我们对每120秒有超过120次访问的ip,封禁1小时。

    回复
    0
  • 高洛峰

    高洛峰2017-05-16 17:32:17

    1. 根据User-Agent阻止spider抓取

    ## Block download agents ##
         if ($http_user_agent ~* WebZIP|wget) {
                return 403;
         }
    ##

    2. 在操作系统Firewall建立规则,限制同一个IP的同时连接数
    以Linux下的iptables为例,如下配置将限制同一个IP一分钟内最多建立15个连接,超出的连接会被iptables丢弃,不会到达nginx

    /sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
    /sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60  --hitcount 15 -j DROP
    service iptables save

    3. 自己写个bash脚本统计各IP访问频率,自动将频率超过你设定的上限的IP扔到黑名单里
    黑名单里的IP,用脚本自动写入iptables或者nginx.conf,封禁它几分钟,或者降低他的许可访问频率

    我以前在yahoo的时候用一个叫YDoD(Yahoo! Department of Defense)的apache模块,可以自定义规则防止外部滥用我们的WEB服务,到了淘宝后改了个名字叫tdod,找了一圈,没找到开源的。不过原理跟我上面说得也差不多。

    回复
    0
  • PHPz

    PHPz2017-05-16 17:32:17

    试试ngx_lua_waf
    https://github.com/loveshell/ngx_lua_waf
    功能:

    防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
    防止svn/备份之类文件泄漏
    防止ApacheBench之类压力测试工具的攻击
    屏蔽常见的扫描黑客工具,扫描器
    屏蔽异常的网络请求
    屏蔽图片附件类目录php执行权限
    防止webshell上传
    

    回复
    0
  • 取消回复