這篇文章主要介紹利用nginx處理DDOS進行系統(tǒng)優(yōu)化的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、安鄉(xiāng)網(wǎng)絡(luò)推廣、微信小程序開發(fā)、安鄉(xiāng)網(wǎng)絡(luò)營銷、安鄉(xiāng)企業(yè)策劃、安鄉(xiāng)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供安鄉(xiāng)建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com前言
眾所周知DDoS很常見,甚至被稱為黑客圈子的準入技能;DDoS又很兇猛,搞起事來幾乎壓垮一方網(wǎng)絡(luò)。
DDOS的特點是分布式,針對帶寬和服務(wù)攻擊,也就 是四層流量攻擊和七層應(yīng)用攻擊,相應(yīng)的防御瓶頸四層在帶寬,七層的多在架構(gòu)的吞吐量。對于七層的應(yīng)用攻擊,我們還是可以做一些配置來防御的,例如前端是 Nginx,主要使用nginx的http_limit_conn和http_limit_req模塊來防御。
什么是分布式拒絕服務(wù)DDoS(Distributed Denial of Service)意為分布式拒絕服務(wù)攻擊,攻擊者利用大量“肉雞”對攻擊目標發(fā)動大量的正?;蚍钦U埱?,耗盡目標主機資源或網(wǎng)絡(luò)資源,從而使被攻擊者不能為合法用戶提供服務(wù)。通常情況下,攻擊者會嘗試使擁有這么多連接的系統(tǒng)飽和,并要求它不再能夠接受新的流量,或者變得非常緩慢以至于無法使用。
換句話說老張的飯店(被攻擊目標)可接待100個顧客同時就餐,隔壁老王(攻擊者)雇傭了200個人(肉雞),進飯店霸占位置卻不吃不喝(非正常請求),飯店被擠得滿滿當當(資源耗盡),而真正要吃飯的顧客卻進不來,飯店無法正常營業(yè)(DDoS攻擊達成)。那么問題來了,老張該怎么辦?
當然是,轟出去!
通常情況下,攻擊者會嘗試使擁有這么多連接的系統(tǒng)飽和,并要求它不再能夠接受新的流量,或者變得非常緩慢以至于無法使用。
應(yīng)用層DDoS攻擊特性
應(yīng)用層(第7層/ HTTP)DDoS攻擊由軟件程序(機器人)執(zhí)行,該軟件程序可以定制為最佳利用特定系統(tǒng)的漏洞。例如,對于不能很好地處理大量并發(fā)連接的系統(tǒng),僅通過周期性地發(fā)送少量流量打開大量連接并保持活動狀態(tài),可能會耗盡系統(tǒng)的新連接容量。其他攻擊可以采取發(fā)送大量請求或非常大的請求的形式。由于這些攻擊是由僵尸程序而不是實際用戶執(zhí)行的,因此攻擊者可以輕松地打開大量連接并非??焖俚匕l(fā)送大量請求。
DDoS攻擊的特征可以用來幫助減輕這些攻擊,包括以下內(nèi)容(這并不意味著是一個詳盡的列表):
-流量通常來自一組固定的IP地址,屬于用于執(zhí)行攻擊的機器。因此,每個IP地址負責的連接和請求數(shù)量遠遠超出您對真實用戶的期望。
注意:不要認為此流量模式總是代表DDoS攻擊。轉(zhuǎn)發(fā)代理的使用也可以創(chuàng)建這種模式,因為轉(zhuǎn)發(fā)代理服務(wù)器的IP地址被用作來自它所服務(wù)的所有真實客戶端的請求的客戶端地址。但是,來自轉(zhuǎn)發(fā)代理的連接數(shù)和請求數(shù)通常遠低于DDoS攻擊。
-由于流量是由機器人生成的,并且意味著壓倒服務(wù)器,因此流量速率遠高于人類用戶可以生成的流量。
- User-Agent報頭被設(shè)置有時到非標準值。
-該 Referer頭有時設(shè)為您可以與攻擊相關(guān)聯(lián)的值。
使用NGINX和NGINX Plus來抵御DDoS攻擊
NGINX和NGINX Plus具有許多功能,與上述的DDoS攻擊特性相結(jié)合,可以使它們成為DDoS攻擊緩解解決方案的重要組成部分。這些功能通過調(diào)節(jié)傳入流量并通過控制流量代理后端服務(wù)器來解決DDoS攻擊。
NGINX事件驅(qū)動架構(gòu)的內(nèi)在保護
NGINX旨在成為您的網(wǎng)站或應(yīng)用程序的“減震器”。它具有非阻塞的事件驅(qū)動架構(gòu),可以應(yīng)對大量請求,而不會明顯增加資源利用率。
來自網(wǎng)絡(luò)的新請求不會中斷NGINX處理正在進行的請求,這意味著NGINX可以利用下面描述的技術(shù)來保護您的站點或應(yīng)用免受攻擊。
有關(guān)底層架構(gòu)的更多信息,請參閱Inside NGINX:我們?nèi)绾螢樾阅芎鸵?guī)模設(shè)計。
限制請求率
您可以將NGINX和NGINX Plus接收傳入請求的速率限制為實際用戶的典型值。例如,您可能會決定訪問登錄頁面的真實用戶每2秒只能發(fā)出一個請求。您可以配置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”的共享內(nèi)存區(qū)域,用于存儲指定密鑰的請求狀態(tài),在本例中為客戶機IP地址( $binary_remote_addr)。/login.html塊中的 limit_req 指令引用共享內(nèi)存區(qū)域。 location
有關(guān)速率限制的詳細討論,請參閱博客上的NGINX和NGINX Plus的速率限制。
限制連接數(shù)量
您可以限制單個客戶端IP地址可以打開的連接數(shù),也可以限制為適合真實用戶的值。例如,您可以允許每個客戶端IP地址打開不超過10個到您網(wǎng)站的/ store區(qū)域的連接:
limit_conn_zone $binary_remote_addr zone=addr: 10m ; server { # ... location /store/ { limit_conn addr 10 ; # ... } }
該 limit_conn_zone 指令配置了一個名為addr的共享內(nèi)存區(qū)域,用于存儲指定密鑰的請求,在這種情況下(如前例所示)客戶端IP地址 $binary_remote_addr。在 limit_conn該指令 location為塊/存儲引用共享存儲器區(qū),并設(shè)置一個大從每個客戶端IP地址10個連接。
關(guān)閉慢速連接
您可以關(guān)閉正在寫入數(shù)據(jù)的連接,這可能意味著嘗試盡可能保持連接打開(從而降低服務(wù)器接受新連接的能力)。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 / { deny 123.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地址訪問您的網(wǎng)站或應(yīng)用程序,則可以一起使用 allow和 deny指令以僅允許這些地址訪問該站點或應(yīng)用程序。例如,您可以限制只訪問特定本地網(wǎng)絡(luò)中的地址:
location / { allow 192.168.1.0/24; deny all; # ... }
在這里, deny all指令阻止所有不在 allow指令指定的范圍內(nèi)的客戶端IP地址。
使用緩存來平滑流量尖峰
您可以配置NGINX和NGINX Plus來吸收攻擊導致的大量流量峰值,方法是啟用緩存并設(shè)置某些緩存參數(shù)以卸載后端的請求。一些有用的設(shè)置是:
該指令的 updating參數(shù) proxy_cache_use_stale告訴NGINX,當它需要獲取一個陳舊的緩存對象的更新時,它應(yīng)該只發(fā)送一個更新請求,并且繼續(xù)將陳舊對象提供給在接收時間期間請求它的客戶端來自后端服務(wù)器的更新。當對某個文件的重復請求是攻擊的一部分時,這會顯著減少對后端服務(wù)器的請求數(shù)量。
該 proxy_cache_key指令定義的鍵通常由嵌入式變量組成(缺省鍵 $scheme$proxy_host$request_uri,有三個變量)。如果該值包含 $query_string 變量,則發(fā)送隨機查詢字符串的攻擊可能導致過度緩存。 $query_string除非您有特殊原因,否則我們建議您不要在變量中包含變量。
阻止請求
您可以配置NGINX或NGINX Plus來阻止幾種請求:
請求一個似乎有針對性的特定網(wǎng)址
User-Agent報頭設(shè)置為與正常客戶端流量不對應(yīng)的值的請求
將 Referer標頭設(shè)置為可與攻擊關(guān)聯(lián)的值的請求
其他頭文件具有可與攻擊關(guān)聯(lián)的值的請求
例如,如果您確定DDoS攻擊的目標是URL /foo.php,則可以阻止該頁面的所有請求:
location /foo.php { deny all; }
或者,如果您發(fā)現(xiàn)DDoS攻擊請求的 User-Agent頭部值為 foo或 bar,則可以阻止這些請求。
location / { if ($http_user_agent ~* foo|bar) { return 403; } # ... }
該變量引用一個請求頭,在上面的例子中是頭。類似的方法可以用于具有可用于識別攻擊的值的其他報頭。 http_*name*``User-Agent
限制到后端服務(wù)器的連接
NGINX或NGINX Plus實例通??梢蕴幚肀蓉撦d平衡的后端服務(wù)器更多的并發(fā)連接。使用NGINX Plus,您可以限制連接到每個后端服務(wù)器的數(shù)量。例如,如果要限制NGINX Plus與網(wǎng)站 上游組中的兩個后端服務(wù)器建立的連接數(shù)不超過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 應(yīng)用于每個服務(wù)器的參數(shù)指定NGINX Plus打開的大連接數(shù)。該 queue 指令限制上游組中所有服務(wù)器達到其連接限制時排隊的請求數(shù),并且該 timeout參數(shù)指定在隊列中保留請求的時間。
處理基于范圍的攻擊
一種攻擊方法是發(fā)送一個 Range具有非常大值的標頭,這可能導致緩沖區(qū)溢出。有關(guān)如何使用NGINX和NGINX Plus來緩解此類攻擊的討論,請參閱使用NGINX和NGINX Plus來保護CVE-2015-1635。
處理高負荷
DDoS攻擊通常會導致高流量負載。有關(guān)調(diào)整NGINX或NGINX Plus以及允許系統(tǒng)處理更高負載的操作系統(tǒng)的提示,請參閱調(diào)整NGINX的性能。
識別DDoS攻擊
到目前為止,我們專注于您可以使用NGINX和NGINX Plus來幫助減輕DDoS攻擊的影響。但NGINX或NGINX Plus如何幫助您發(fā)現(xiàn)DDoS攻擊呢?該NGINX加狀態(tài)模塊 提供了有關(guān)被負載后端服務(wù)器,你可以用它來發(fā)現(xiàn)異常流量模式平衡交通的詳細指標。NGINX Plus附帶了一個狀態(tài)儀表板網(wǎng)頁,以圖形方式描述了NGINX Plus系統(tǒng)的當前狀態(tài)(請參閱demo.nginx.com上的示例)。通過API也可以使用相同的指標,您可以使用它將指標提供給自定義或第三方監(jiān)控系統(tǒng),您可以在其中進行歷史趨勢分析以發(fā)現(xiàn)異常模式并啟用警報。
以上是“利用nginx處理DDOS進行系統(tǒng)優(yōu)化的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!