使用Nginx、Nginx Plus抵禦DDOS攻擊

DDOS是一種經過大流量的請求對目標進行轟炸式訪問,致使提供服務的服務器資源耗盡進而沒法繼續提供服務的攻擊手段。php

 

通常狀況下,攻擊者經過大量請求與鏈接使服務器處於飽和狀態,以致於沒法接受新的請求或變得很慢。html

 

應用層DDOS攻擊的特徵nginx

 

應用層(七層/HTTP層)DDOS攻擊一般由木馬程序發起,其能夠經過設計更好的利用目標系統的脆弱點。例如,對於沒法處理大量併發請求的系統,僅僅經過創建大量的鏈接,並週期性的發出少許數據包來保持會話就能夠耗盡系統的資源,使其沒法接受新的鏈接請求達到DDOS的目的。其餘還有采用發送大量鏈接請求發送大數據包的請求進行攻擊的形式。由於攻擊是由木馬程序發起,攻擊者能夠在很短期內快速創建大量的鏈接,併發出大量的請求。web

 

如下是一些DDOS的特證,咱們能夠據此特徵來抵抗DDOS(包括但不限於):後端

  • 攻擊常常來源於一些相對固定的IP或IP段,每一個IP都有遠大於真實用戶的鏈接數和請求數。緩存

    備註:這並不代表這種請求都是表明着DDOS攻擊。在不少使用NAT的網絡架構中,不少的客戶端使用網關的IP地址訪問公網資源。可是,即使如此,這樣的請求數和鏈接數也會遠少於DDOS攻擊。服務器

  • 由於攻擊是由木馬發出且目的是使服務器超負荷,請求的頻率會遠遠超過正常人的請求。網絡

  • User-Agent一般是一個非標準的值架構

  • Referer有時是一個容易聯想到攻擊的值併發

 

使用Nginx、Nginx Plus抵抗DDOS攻擊

 

結合上面提到的DDOS攻擊的特徵,Nginx、Nginx Plus有不少的特性能夠用來有效的防護DDOS攻擊,能夠從調整入口訪問流量和控制反向代理到後端服務器的流量兩個方面來達到抵禦DDOS攻擊的目的。

 

限制請求速度

 

設置Nginx、Nginx Plus的鏈接請求在一個真實用戶請求的合理範圍內。好比,若是你以爲一個正經常使用戶每兩秒能夠請求一次登陸頁面,你就能夠設置Nginx每兩秒鐘接收一個客戶端IP的請求(大約等同於每分鐘30個請求)。

 

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {

...

location /login.html {

limit_req zone=one;

...

}

}

 

`limit_req_zone`命令設置了一個叫one的共享內存區來存儲請求狀態的特定鍵值,在上面的例子中是客戶端IP($binary_remote_addr)。location塊中的`limit_req`經過引用one共享內存區來實現限制訪問/login.html的目的。

 

限制鏈接數量

 

設置Nginx、Nginx Plus的鏈接數在一個真實用戶請求的合理範圍內。好比,你能夠設置每一個客戶端IP鏈接/store不能夠超過10個。

 

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {

...

location /store/ {

limit_conn addr 10;

...

}

}

 

`limit_conn_zone`命令設置了一個叫addr的共享內存區來存儲特定鍵值的狀態,在上面的例子中是客戶端IP( $binary_remote_addr)。location塊中`limit_conn`經過引用addr共享內存區來限制到/store/的最大鏈接數爲10。

 

關閉慢鏈接

 

有一些DDOS攻擊,好比Slowlris,是經過創建大量的鏈接並週期性的發送一些數據包保持會話來達到攻擊目的,這種週期一般會低於正常的請求。這種狀況咱們能夠經過關閉慢鏈接來抵禦攻擊。

 

`client_body_timeout`命令用來定義讀取客戶端請求的超時時間,`client_header_timeout`命令用來定於讀取客戶端請求頭的超時時間。這兩個參數的默認值都是60s,咱們能夠經過下面的命令將他們設置爲5s:

 

 

server {

client_body_timeout 5s;

client_header_timeout 5s;

...

}

 

設置IP黑名單

 

若是肯定攻擊來源於某些IP地址,咱們能夠將其加入黑名單,Nginx就不會再接受他們的請求。好比,你已經肯定攻擊來自於從123.123.123.1到123.123.123.16的一段IP地址,你能夠這樣設置:

 

location / {

deny 123.123.123.0/28;

...

}

 

或者你肯定攻擊來源於123.123.123.三、123.123.123.五、123.123.123.7幾個IP,能夠這樣設置:

 

location / {

deny 123.123.123.3;

deny 123.123.123.5;

deny 123.123.123.7;

...

}

 

設置IP白名單

 

若是你的網站僅容許特定的IP或IP段訪問,你能夠結合使用allow和deny命令來限制僅容許你指定的IP地址訪問你的網站。以下,你能夠設置僅容許192.168.1.0段的內網用戶訪問:

 

location / {

allow 192.168.1.0/24;

deny all;

...

}

 

deny命令會拒絕除了allow指定的IP段以外的全部其餘IP的訪問請求。

 

使用緩存進行流量削峯

 

經過打開Nginx的緩存功能並設置特定的緩存參數,能夠削減來自攻擊的流量,同時也能夠減輕對後端服務器的請求壓力。如下是一些有用的設置:

  • `proxy_cache_use_stale `的updating參數告訴Nginx何時該更新所緩存的對象。只須要到後端的一個更新請求,在緩存有效期間客戶端對該對象的請求都無需訪問後端服務器。當經過對一個文件的頻繁請求來實施攻擊時,緩存功能可極大的下降到後端服務器的請求。

  • `proxy_cache_key `命令定義的鍵值一般包含一些內嵌的變量(默認的鍵值$scheme$proxy_host$request_uri包含了三個變量)。若是鍵值包含`$query_string`變量,當攻擊的請求字符串是隨機的時候就會給Nginx代理太重的緩存負擔,所以咱們建議通常狀況下不要包含`$query_string`變量。

 

屏蔽特定的請求

 

能夠設置Nginx、Nginx Plus屏蔽一些類型的請求:

  • 針對特定URL的請求

  • 針對不是常見的User-Agent的請求

  • 針對Referer頭中包含能夠聯想到攻擊的值的請求

  • 針對其餘請求頭中包含能夠聯想到攻擊的值的請求

 

好比,若是你斷定攻擊是針對一個特定的URL:/foo.php,咱們就能夠屏蔽到這個頁面的請求:

 

location /foo.php {

deny all;

}

 

或者你斷定攻擊請求的User-Agent中包含foo或bar,咱們也能夠屏蔽這些請求:

 

location / {

if ($http_user_agent ~* foo|bar) {

return 403;

}

...

}

 

http_name變量引用一個請求頭,上述例子中是User-Agent頭。能夠針對其餘的http頭使用相似的方法來識別攻擊。

 

限制到後端服務器的鏈接數

 

一個Nginx、Nginx Plus實例能夠處理比後端服務器多的多的併發請求。在Nginx Plus中,你能夠限制到每個後端服務器的鏈接數,好比能夠設置Nginx Plus與website upstream中的每一個後端服務器創建的鏈接數不得超過200個:

 

upstream website {

server 192.168.100.1:80 max_conns=200;

server 192.168.100.2:80 max_conns=200;

queue 10 timeout=30s;

}

 

`max_conns`參數能夠針對每個後端服務器設置Nginx Plus能夠與之創建的最大鏈接數。`queue`命令設置了當每一個後端服務器都達到最大鏈接數後的隊列大小,`timeout`參數指定了請求在隊列中的保留時間。

 

處理特定類型的攻擊

 

有一種攻擊是發送包含特別大的值的請求頭,引發服務器端緩衝區溢出。Nginx、Nginx Plus針對這種攻擊類型的防護,能夠參考[Using NGINX and NGINX Plus to Protect Against CVE-2015-1635](http://nginx.com/blog/nginx-protect-cve-2015-1635/?_ga=1.14368116.2137319792.1439284699)

 

優化Nginx性能

 

DDOS攻擊一般會帶來高的負載壓力,能夠經過一些調優參數,提升Nginx、Nginx Plus處理性能,硬抗DDOS攻擊,詳細參考:[Tuning NGINX for Performance](http://nginx.com/blog/tuning-nginx/?_ga=1.48422373.2137319792.1439284699)

 

識別DDOS攻擊

 

到目前爲止,咱們都是集中在如何是用Nginx、Nginx Plus來減輕DDOS攻擊帶來的影響。如何才能讓Nginx、Nginx Plus幫助咱們識別DDOS攻擊呢?`Nginx Plus Status module`提供了到後端服務器流量的詳細統計,能夠用來識別異常的流量。Nginx Plus提供一個當前服務狀態的儀表盤頁面,同時也能夠在自定義系統或其餘第三方系統中經過API的方式獲取這些統計信息,並根據歷史趨勢分析識別非正常的流量進而發出告警。

 

總結

 

Nginx和Nginx Plus能夠做爲抵禦DDOS攻擊的一個有力手段,並且Nginx Plus中提供了一些附加的特性來更好的抵禦DDOS攻擊而且當攻擊發生時及時的識別到。

 

原文:https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/

譯者:陳洋 (運維幫)

相關文章
相關標籤/搜索