通過Nginx和Nginx Plus阻止DDoS攻擊

責(zé)任編輯:editor007

作者:孫鏡濤

2016-01-30 21:18:43

摘自:INFOQ

限制連接的數(shù)量 將某個(gè)客戶端IP地址所能打開的連接數(shù)限制為真實(shí)用戶的合理值。通過緩存削減流量峰值 通過啟用緩存并設(shè)置某些緩存參數(shù)讓Nginx和Nginx Plus吸收攻擊所產(chǎn)生的大部分流量峰值。

分布式拒絕服務(wù)攻擊(DDoS)指的是通過多臺機(jī)器向一個(gè)服務(wù)或者網(wǎng)站發(fā)送大量看似合法的數(shù)據(jù)包使其網(wǎng)絡(luò)阻塞、資源耗盡從而不能為正常用戶提供正常服務(wù)的攻擊手段。隨著互聯(lián)網(wǎng)帶寬的增加和相關(guān)工具的不斷發(fā)布,這種攻擊的實(shí)施難度越來越低,有大量IDC托管機(jī)房、商業(yè)站點(diǎn)、游戲服務(wù)商一直飽受DDoS攻擊的困擾,那么如何緩解甚至解決DDoS呢?最近Rick Nelson在Nginx的官方博客上發(fā)表了一篇文章,介紹了如何通過Nginx和Nginx Plus緩和DDoS攻擊。

Rick Nelson首先介紹了DDoS攻擊的一些特點(diǎn),例如攻擊的流量通常來源于一些固定的IP地址,每一個(gè)IP地址會創(chuàng)建比真實(shí)用戶多得多的連接和請求;同時(shí)由于流量全部是由機(jī)器產(chǎn)生的,其速率要比人類用戶高的多。此外,進(jìn)行攻擊的機(jī)器其User-Agent頭也不是標(biāo)準(zhǔn)的值,Referer頭有時(shí)也會被設(shè)置成能夠與攻擊關(guān)聯(lián)起來的值。針對這些特點(diǎn),Rick Nelson認(rèn)為Nginx和Nginx Plus有很多能夠通過調(diào)節(jié)或控制流量來應(yīng)對或者減輕DDoS攻擊的特性。

限制請求率 
將Nginx和Nginx Plus可接受的入站請求率限制為某個(gè)適合真實(shí)用戶的值。例如,通過下面的配置讓一個(gè)真正的用戶每兩秒鐘才能訪問一次登錄頁面:

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;server { ... location /login.html { limit_req zone=one; ... }}

在該配置中,limit_req_zone指令配置了一個(gè)名為one的共享內(nèi)存zone用來存儲$binary_remote_addr的請求狀態(tài),location塊中/login.html的limit_req指令引用了共享內(nèi)存zone。

限制連接的數(shù)量 
將某個(gè)客戶端IP地址所能打開的連接數(shù)限制為真實(shí)用戶的合理值。例如,限制每一個(gè)IP對網(wǎng)站/store部分打開的連接數(shù)不超過10個(gè):

limit_conn_zone $binary_remote_addr zone=addr:10m;server { ... location /store/ { limit_conn addr 10; ... }}

該配置中,limit_conn_zone指令配置了一個(gè)名為addr的共享內(nèi)存zone用來存儲 $binary_remote_addr的請求,location塊中/store/的limit_conn指令引用了共享內(nèi)存zone,并將最大連接數(shù)設(shè)置為10.

server { client_body_timeout 5s; client_header_timeout 5s; ...}

設(shè)置IP黑名單 
如果能識別攻擊者所使用的客戶端IP地址,那么通過deny指令將其屏蔽,讓Nginx和Nginx Plus拒絕來自這些地址的連接或請求。例如,通過下面的指令拒絕來自123.123.123.3、123.123.123.5和123.123.123.7的請求:

location / { deny 123.123.123.3; deny 123.123.123.5; deny 123.123.123.7; ...}

設(shè)置IP白名單 
如果允許訪問的IP地址比較固定,那么通過allow和deny指令讓網(wǎng)站或者應(yīng)用程序只接受來自于某個(gè)IP地址或者某個(gè)IP地址段的請求。例如,通過下面的指令將訪問限制為本地網(wǎng)絡(luò)的一個(gè)IP段:

location / { allow 192.168.1.0/24; deny all; ...}

通過緩存削減流量峰值 
通過啟用緩存并設(shè)置某些緩存參數(shù)讓Nginx和Nginx Plus吸收攻擊所產(chǎn)生的大部分流量峰值。例如,通過proxy_cache_use_stale指令的updating參數(shù)告訴Nginx何時(shí)需要更新過期的緩存對象,避免因重復(fù)發(fā)送更新請求對后端服務(wù)器產(chǎn)生壓力。另外,proxy_cache_key指令定義的鍵通常會包含嵌入的變量,例如默認(rèn)的鍵$scheme$proxy_host$request_uri包含了三個(gè)變量,如果它包含$query_string變量,那么攻擊者可以通過發(fā)送隨機(jī)的query_string值來耗盡緩存,因此,如果沒有特別原因,不要在該鍵中使用$query_string變量。

阻塞請求 
配置Nginx和Nginx Plus阻塞以下類型的請求:

以某個(gè)特定URL為目標(biāo)的請求 User-Agent頭中的值不在正??蛻舳朔秶畠?nèi)的請求 Referer頭中的值能夠與攻擊關(guān)聯(lián)起來的請求 其他頭中存在能夠與攻擊關(guān)聯(lián)在一起的值的請求

例如,通過下面的配置阻塞以/foo.php為目標(biāo)的攻擊:

location /foo.php { deny all;}

或者通過下面的配置阻塞已識別出的User-Agent頭的值是foo或者bar的DDoS攻擊:

location / { if ($http_user_agent ~* foo|bar) { return 403; } ...}

限制對后端服務(wù)器的連接數(shù) 
通常Nginx和Nginx Plus實(shí)例能夠處理比后端服務(wù)器多得多的連接數(shù),因此可以通過Nginx Plus限制到每一個(gè)后端服務(wù)器的連接數(shù)。例如,通過下面的配置限制Nginx Plus和每一臺后端服務(wù)器之間建立的連接數(shù)不多于200個(gè):

upstream website { server 192.168.100.1:80 max_conns=200; server 192.168.100.2:80 max_conns=200; queue 10 timeout=30s;}

另外,Rick Nelson還提到了如何處理基于范圍的攻擊和如何處理高負(fù)載的問題,以及如何使用Nginx Plus Status模塊發(fā)現(xiàn)異常的流量模式,定位DDoS攻擊。

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號