防御ddos是一個系統(tǒng)工程,攻擊花樣多,防御的成本高瓶頸多,防御起來即被動又無奈。ddos的特點是分布式,針對帶寬和服務(wù)攻擊,也就 是四層流量攻擊和七層應(yīng)用攻擊,相應(yīng)的防御瓶頸四層在帶寬,七層的多在架構(gòu)的吞吐量。對于七層的應(yīng)用攻擊,我們還是可以做一些配置來防御的。
例如前端是nginx,主要使用nginx的http_limit_conn和http_limit_req模塊來防御。 ngx_http_limit_conn_module 可以限制單個IP的連接數(shù),ngx_http_limit_req_module可以限制單個IP每秒請求數(shù),通過限制連接數(shù)和請求數(shù)能相對有效的防御CC攻擊。
下面是配置方法:
限制每秒請求數(shù)?
ngx_http_limit_req_module模塊通過漏桶原理來限制單位時間內(nèi)的請求數(shù),一旦單位時間內(nèi)請求數(shù)超過限制,就會返回503錯誤。配置需要在兩個地方設(shè)置:
nginx.conf的http段內(nèi)定義觸發(fā)條件,可以有多個條件?
在location內(nèi)定義達(dá)到觸發(fā)條件時nginx所要執(zhí)行的動作?
例如:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //觸發(fā)條件,所有訪問ip 限制每秒10個請求 ... server { ... location ~ .php$ { limit_req zone=one burst=5 nodelay; //執(zhí)行的動作,通過zone名字對應(yīng) } } }
參數(shù)說明:
$binary_remote_addr 二進(jìn)制遠(yuǎn)程地址 zone=one:10m 定義zone名字叫one,并為這個zone分配10M內(nèi)存,用來存儲會話(二進(jìn)制遠(yuǎn)程地址),1m內(nèi)存可以保存16000會話 rate=10r/s; 限制頻率為每秒10個請求 burst=5 允許超過頻率限制的請求數(shù)不多于5個,假設(shè)1、2、3、4秒請求為每秒9個,那么第5秒內(nèi)請求15個是允許的,反之,如果第一秒內(nèi)請求15個,會將5個請求放到第二秒,第二秒內(nèi)超過10的請求直接503,類似多秒內(nèi)平均速率限制。 nodelay 超過的請求不被延遲處理,設(shè)置后15個請求在1秒內(nèi)處理。
限制IP連接數(shù)?
ngx_http_limit_conn_module的配置方法和參數(shù)與http_limit_req模塊很像,參數(shù)少,要簡單很多
http { limit_conn_zone $binary_remote_addr zone=addr:10m; //觸發(fā)條件 ... server { ... location /download/ { limit_conn addr 1; // 限制同一時間內(nèi)1個連接,超出的連接返回503 } } }
更多Nginx相關(guān)技術(shù)文章,請訪問Nginx使用教程欄目進(jìn)行學(xué)習(xí)!