概述
慢速攻擊,是一種ddos攻擊的變體版本。一般來講,它經過向服務器發送正常的請求,只不過請求的頭或者請求體的內容特別長,發送速度有特別慢,這樣每個鏈接佔用的時間就會變得特別長,攻擊者會在短期內持續不斷的對服務器進行請求,很快便會耗盡服務端的資源,從而令服務端拒絕服務。瀏覽器
對HTTP服務而言,會有幾種基本攻擊方式:服務器
Slow headers:Web應用在處理HTTP請求以前都要先接收完全部的HTTP頭部,Web服務器再沒接收到2個連續的\r\n時,會認爲客戶端沒有發送完頭部,而持續的等等客戶端發送數據,消耗服務器的鏈接和內存資源。併發
Slow body:攻擊者發送一個HTTP POST請求,該請求的Content-Length頭部值很大,使得Web服務器或代理認爲客戶端要發送很大的數據。服務器會保持鏈接準備接收數據,但攻擊客戶端每次只發送不多量的數據,使該鏈接一直保持存活,消耗服務器的鏈接和內存資源。優化
Slow read:客戶端與服務器創建鏈接併發送了一個HTTP請求,客戶端發送完整的請求給服務器端,而後一直保持這個鏈接,以很低的速度讀取Response,好比很長一段時間客戶端不讀取任何數據,經過發送Zero Window到服務器,讓服務器誤覺得客戶端很忙,直到鏈接快超時前纔讀取一個字節,以消耗服務器的鏈接和內存資源。spa
Nginx的優化配置
-
keepalive_timeout代理
Nginx 使用 keepalive_timeout 來指定 KeepAlive 的超時時間(timeout)。指定每一個 TCP 鏈接最多能夠保持多長時間。Nginx 的默認值是 75 秒,有些瀏覽器最多隻保持 60 秒,因此能夠設定爲 60 秒。若將它設置爲 0,就禁止了 keepalive 鏈接。code
-
client_body_timeoutserver
指定客戶端與服務端創建鏈接後發送 request body 的超時時間。若是客戶端在指定時間內沒有發送任何內容,Nginx 返回 HTTP 408(Request Timed Out)。內存
# 配置段: http, server, location
client_body_timeout 20s;
-
client_header_timeout資源
客戶端向服務端發送一個完整的 request header 的超時時間。若是客戶端在指定時間內沒有發送一個完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
# 配置段: http, server, location
client_header_timeout 10s;
-
send_timeout
服務端向客戶端傳輸數據的超時時間。
# 配置段: http, server, location
send_timeout 30s;
-
client_body_buffer_size
此指令設置用於請求主體的緩衝區大小。 若是主體超過緩衝區大小,則完整主體或其一部分將寫入臨時文件。 若是NGINX配置爲使用文件而不是內存緩衝區,則該指令會被忽略。 默認狀況下,該指令爲32位系統設置一個8k緩衝區,爲64位系統設置一個16k緩衝區。 該指令在NGINX配置的http,server和location區塊使用。
-
client_max_body_size
此指令設置NGINX能處理的最大請求主體大小。 若是請求大於指定的大小,則NGINX發回HTTP 413(Request Entity too large)錯誤。 若是服務器處理大文件上傳,則該指令很是重要。
默認狀況下,該指令值爲1m。 以下:
server{
client_max_body_size 2m;
}
其餘的配置選項:
-
client_body_in_file_only
此指令禁用NGINX緩衝區並將請求體存儲在臨時文件中。 文件包含純文本數據。 該指令在NGINX配置的http,server和location區塊使用。 可選值有:
off:該值將禁用文件寫入
clean:請求body將被寫入文件。 該文件將在處理請求後刪除。
on: 請求正文將被寫入文件。 處理請求後,將不會刪除該文件。
默認狀況下,指令值爲關閉。 以下:
http{
client_body_in_file_only clean;
}
-
client_body_in_single_buffer
該指令設置NGINX將完整的請求主體存儲在單個緩衝區中。 默認狀況下,指令值爲off。 若是啓用,它將優化讀取$request_body變量時涉及的I/O操做。以下例子:
server{
client_body_in_single_buffer on;
}
-
client_body_temp_path
此指令指定存儲請求正文的臨時文件的位置。 除了位置以外,指令還能夠指定文件是否須要最多三個級別的文件夾層次結構。 級別指定爲用於生成文件夾的位數。
默認狀況下,NGINX在NGINX安裝路徑下的client_body_temp文件夾建立臨時文件。 以下例子:
server{
client_body_temp_pathtemp_files 1 2;
}
-
client_header_buffer_size
此指令與client_body_buffer_size相似。 它爲請求頭分配一個緩衝區。 若是請求頭大小大於指定的緩衝區,則使用large_client_header_buffers指令分配更大的緩衝區。以下例子:
http{
client_header_buffer_size 1m;
}
-
large_client_header_buffers
此指令規定了用於讀取大型客戶端請求頭的緩衝區的最大數量和大小。 這些緩衝區僅在缺省緩衝區不足時按需分配。 當處理請求或鏈接轉換到保持活動狀態時,釋放緩衝區。以下例子:
http{
large_client_header_buffers 4 8k;
}