NGINX限制連線的實踐 (Defense DDOS)

安全劍客發表於2020-11-25
分散式拒絕服務攻擊(英文意思是Distributed Denial of Service,簡稱DDoS)是指處於不同位置的多個攻擊者同時向一個或數個目標發動攻擊,或者一個攻擊者控制了位於不同位置的多臺機器並利用這些機器對受害者同時實施攻擊。由於攻擊的發出點是分佈在不同地方的,這類攻擊稱為分散式拒絕服務攻擊,其中的攻擊者可以有多個。NGINX: 限制連線的實踐 (Defense DDOS)

關於限制使用者連線,Nginx 提供的模組:     , 還有 stream 模組也包含類似的功能, 本文只說明 ngx_http_limit_req_module 的使用.

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

 

引數說明

$binary_remote_addr : 二進位制遠端地址

zone=one:10m : 定義zone名字叫one,併為這個zone分配10M記憶體,用來儲存會話(二進位制遠端地址),1m記憶體可以儲存16000會話

rate=10r/s : 限制頻率為每秒10個請求

burst=5 : 允許超過頻率限制的請求數不多於5個,假設1、2、3、4秒請求為每秒9個,那麼第5秒內請求15個是允許的,反之,如果第一秒內請求15個,會將5個請求放到第二秒,第二秒內超過10的請求直接503,類似多秒內平均速率限制。

遇到的問題

擬定這樣一個場景:

一次正常請求返回 50 個 HTML 頁面,總共用時10s。 如果在一個500人的場所中,單個客戶端 IP 發出的最大請求數會是: 500/10 * 500 = 2500.

所以,為了不影響正常使用者的訪問,我似乎只能做如下設定: rate=2500r/s. 顯然,這樣的設定是不合理的。

如何解決這個問題 ?

如果不是以 IP 作為記錄的標準,而是請求的 URI, 那麼問題就可以解決!

在  limite_req_zone key zone=name:size rate=rate 中的 key 設定為:  $remote_addr$uri , 如下:

limit_req_zone "$remote_addr$uri" zone=one:10m rate=1r/s;

 

ab測試

ab -n 1000 -c 100 

 

ps: 這個解決方式是一個萌萌噠的同事想出來的.

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2736708/,如需轉載,請註明出處,否則將追究法律責任。

相關文章