使用Nginx處理DDOS進行系統優化
DDoS很常見,甚至被稱為黑客圈子的准入技能;DDoS又很兇猛,搞起事來幾乎壓垮一方網路。
什麼是分散式拒絕服務DDoS(Distributed Denial of Service)意為分散式拒絕服務攻擊,攻擊者利用大量「肉雞」對攻擊目標發動大量的正常或非正常請求,耗盡目標主機資源或網路資源,從而使被攻擊者不能為合法用戶提供服務。通常情況下,攻擊者會嘗試使擁有這麼多連接的系統飽和,並要求它不再能夠接受新的流量,或者變得非常緩慢以至於無法使用。
換句話說老張的飯店(被攻擊目標)可接待100個顧客同時就餐,隔壁老王(攻擊者)僱傭了200個人(肉雞),進飯店霸佔位置卻不吃不喝(非正常請求),飯店被擠得滿滿當當(資源耗盡),而真正要吃飯的顧客卻進不來,飯店無法正常營業(DDoS攻擊達成)。那麼問題來了,老張該怎麼辦?
當然是,轟出去!
通常情況下,攻擊者會嘗試使擁有這麼多連接的系統飽和,並要求它不再能夠接受新的流量,或者變得非常緩慢以至於無法使用。
應用層DDoS攻擊特性
應用層(第7層/ HTTP)DDoS攻擊由軟體程序(機器人)執行,該軟體程序可以定製為最佳利用特定系統的漏洞。例如,對於不能很好地處理大量並發連接的系統,僅通過周期性地發送少量流量打開大量連接並保持活動狀態,可能會耗盡系統的新連接容量。其他攻擊可以採取發送大量請求或非常大的請求的形式。由於這些攻擊是由殭屍程序而不是實際用戶執行的,因此攻擊者可以輕鬆地打開大量連接並非常快速地發送大量請求。
DDoS攻擊的特徵可以用來幫助減輕這些攻擊,包括以下內容(這並不意味著是一個詳盡的列表):
-流量通常來自一組固定的IP地址,屬於用於執行攻擊的機器。因此,每個IP地址負責的連接和請求數量遠遠超出您對真實用戶的期望。
注意:不要認為此流量模式總是代表DDoS攻擊。轉發代理的使用也可以創建這種模式,因為轉發代理伺服器的IP地址被用作來自它所服務的所有真實客戶端的請求的客戶端地址。但是,來自轉發代理的連接數和請求數通常遠低於DDoS攻擊。
-由於流量是由機器人生成的,並且意味著壓倒伺服器,因此流量速率遠高於人類用戶可以生成的流量。
- User-Agent報頭被設置有時到非標準值。
-該 Referer頭有時設為您可以與攻擊相關聯的值。
使用NGINX和NGINX Plus來抵禦DDoS攻擊
NGINX和NGINX Plus具有許多功能,與上述的DDoS攻擊特性相結合,可以使它們成為DDoS攻擊緩解解決方案的重要組成部分。這些功能通過調節傳入流量並通過控制流量代理後端伺服器來解決DDoS攻擊。
NGINX事件驅動架構的內在保護
NGINX旨在成為您的網站或應用程序的「減震器」。它具有非阻塞的事件驅動架構,可以應對大量請求,而不會明顯增加資源利用率。
來自網路的新請求不會中斷NGINX處理正在進行的請求,這意味著NGINX可以利用下面描述的技術來保護您的站點或應用免受攻擊。
有關底層架構的更多信息,請參閱Inside NGINX:我們如何為性能和規模設計。
限制請求率
您可以將NGINX和NGINX Plus接收傳入請求的速率限制為實際用戶的典型值。例如,您可能會決定訪問登錄頁面的真實用戶每2秒只能發出一個請求。您可以配置NGINX和NGINX Plus,以允許單個客戶端IP地址每2秒嘗試登錄(相當於每分鐘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)。/login.html塊中的 limit_req 指令引用共享內存區域。 location
有關速率限制的詳細討論,請參閱博客上的NGINX和NGINX Plus的速率限制。
限制連接數量
您可以限制單個客戶端IP地址可以打開的連接數,也可以限制為適合真實用戶的值。例如,您可以允許每個客戶端IP地址打開不超過10個到您網站的/ store區域的連接:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
# ...
location /store/ {
limit_conn addr10;
# ...
}
}
該 limit_conn_zone 指令配置了一個名為addr的共享內存區域,用於存儲指定密鑰的請求,在這種情況下(如前例所示)客戶端IP地址 $binary_remote_addr。在 limit_conn該指令 location為塊/存儲引用共享存儲器區,並設置一個最大從每個客戶端IP地址10個連接。
關閉慢速連接
您可以關閉正在寫入數據的連接,這可能意味著嘗試儘可能保持連接打開(從而降低伺服器接受新連接的能力)。Slowloris就是這種攻擊的一個例子。該 client_body_timeout指令控制NGINX在客戶機體寫入之間等待的時間,該 client_header_timeout 指令控制NGINX在寫入客戶機標題之間等待的時間。這兩個指令的默認值是60秒。本示例將NGINX配置為在來自客戶端的寫入或頭文件之間等待不超過5秒鐘:
server {
client_body_timeout 5s;
client_header_timeout 5s;
# ...
}
列入黑名單IP地址
如果您可以識別用於攻擊的客戶端IP地址,則可以使用該 deny指令將其列入黑名單,以便NGINX和NGINX Plus不接受其連接或請求。例如,如果您確定攻擊來自地址範圍123.123.123.1到123.123.123.16:
location / {
deny123.123.123.0/28;
# ...
}
或者,如果您確定攻擊來自客戶端IP地址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;
# ...
}
將白名單IP地址
如果僅允許從一個或多個特定組或範圍的客戶端IP地址訪問您的網站或應用程序,則可以一起使用 allow和 deny指令以僅允許這些地址訪問該站點或應用程序。例如,您可以限制只訪問特定本地網路中的地址:
location / {
allow 192.168.1.0/24;
denyall;
# ...
}
在這裡, deny all指令阻止所有不在 allow指令指定的範圍內的客戶端IP地址。
使用緩存來平滑流量尖峰
您可以配置NGINX和NGINX Plus來吸收攻擊導致的大量流量峰值,方法是啟用緩存並設置某些緩存參數以卸載後端的請求。一些有用的設置是:
該指令的 updating參數 proxy_cache_use_stale告訴NGINX,當它需要獲取一個陳舊的緩存對象的更新時,它應該只發送一個更新請求,並且繼續將陳舊對象提供給在接收時間期間請求它的客戶端來自後端伺服器的更新。當對某個文件的重複請求是攻擊的一部分時,這會顯著減少對後端伺服器的請求數量。
該 proxy_cache_key指令定義的鍵通常由嵌入式變數組成(預設鍵 $scheme$proxy_host$request_uri,有三個變數)。如果該值包含 $query_string 變數,則發送隨機查詢字元串的攻擊可能導致過度緩存。 $query_string除非您有特殊原因,否則我們建議您不要在變數中包含變數。
阻止請求
您可以配置NGINX或NGINX Plus來阻止幾種請求:
請求一個似乎有針對性的特定網址
User-Agent報頭設置為與正常客戶端流量不對應的值的請求
將 Referer標頭設置為可與攻擊關聯的值的請求
其他頭文件具有可與攻擊關聯的值的請求
例如,如果您確定DDoS攻擊的目標是URL /foo.php,則可以阻止該頁面的所有請求:
location /foo.php {
denyall;
}
或者,如果您發現DDoS攻擊請求的 User-Agent頭部值為 foo或 bar,則可以阻止這些請求。
location / {
if ($http_user_agent ~* foo|bar) {
return403;
}
# ...
}
該變數引用一個請求頭,在上面的例子中是頭。類似的方法可以用於具有可用於識別攻擊的值的其他報頭。 http_*name*``User-Agent
限制到後端伺服器的連接
NGINX或NGINX Plus實例通常可以處理比負載平衡的後端伺服器更多的並發連接。使用NGINX Plus,您可以限制連接到每個後端伺服器的數量。例如,如果要限制NGINX Plus與網站 上游組中的兩個後端伺服器建立的連接數不超過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參數指定在隊列中保留請求的時間。
處理基於範圍的攻擊
一種攻擊方法是發送一個 Range具有非常大值的標頭,這可能導致緩衝區溢出。有關如何使用NGINX和NGINX Plus來緩解此類攻擊的討論,請參閱使用NGINX和NGINX Plus來保護CVE-2015-1635。
處理高負荷
DDoS攻擊通常會導致高流量負載。有關調整NGINX或NGINX Plus以及允許系統處理更高負載的操作系統的提示,請參閱調整NGINX的性能。
識別DDoS攻擊


※linux下apache虛擬主機搭建以及優化
※不管是否上雲,這些安全防護措施學起來,有備無患!
TAG:小鳥雲 |