首頁  >  問答  >  主體

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

首先我對別人抓取我網站的內容完全沒有意見,我也不是一定要嚴格限制別人抓取,但是某些人的抓取完全沒有底線,用一個腳本甚至多個腳本並發的去抓取某個伺服器的內容,跟ddos沒有差別。

我的伺服器目前就遇到了這樣的情況,惡意的毫無停頓的抓取,嚴重影響了我們的日誌分析,而且也額外增加了伺服器的負載。

請問如何對這種行為做出防範?我用的是nginx伺服器,據我所知它只能deny某個ip,但是deny以後還是會出現在日誌中,只不過是403了。而且手動的deny太被動了,能否智能判斷某個ip訪問量猛增,然後把它ban掉?

黄舟黄舟2712 天前1007

全部回覆(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
  • 取消回覆