配置Nginx服務(wù)器防止Flood攻擊的方法
測試
我會(huì)簡單的告訴你如何配置Nginx的限制請(qǐng)求模塊并且它是如何保護(hù)你的網(wǎng)站,防止你被攻擊與DDOS或是其他基于HTTP的拒絕服務(wù)攻擊。
這個(gè)測試中,我將樣本頁在保存在Blitz.io(現(xiàn)在是免費(fèi)服務(wù))命名為about.html,用于測試limit_req指令.
首先,我在Blitz上使用下面的指令,用來發(fā)起1075個(gè)并發(fā)請(qǐng)求并且持續(xù)一分鐘,響應(yīng)超時(shí)設(shè)置為2分鐘,區(qū)域?yàn)榧又?,同時(shí)設(shè)置了除掉狀態(tài)200以外的其他狀態(tài)全部為異常狀態(tài),甚至是503都被認(rèn)為是沒有成功.
-p 1-1075:60 --status 200 -T 2000 -r california http://kbeezie.com/about.html
還不算壞,對(duì)不對(duì)? 但如果這是一個(gè)php文檔. 很可能有用戶會(huì)造成PHP進(jìn)程的502/504狀態(tài),讓服務(wù)器一直崩潰或無響應(yīng). 尤其是你使用了沒有任何保護(hù)的VPS或者其他廉價(jià)服務(wù)器,故障率會(huì)更高。(原文廣告,此處屏蔽)
當(dāng)然你可以使用緩存或其他工具來提高服務(wù)器性能與響應(yīng)能力, 就比如你使用WordPress你肯定要使用wordpress caching plugin. da For those type of people we can use the limit request module.
在Nginx中我們創(chuàng)建一個(gè)區(qū)域http { },我叫他blitz設(shè)置每秒5次請(qǐng)求, 最大容納數(shù)據(jù)量為10MB.我使用$binary_remote_addr當(dāng)作session變量 讓你自己比$remote_addr的正常訪客可以訪問大于10MB的空間.
然周在服務(wù)器中定義上這些規(guī)則:
limit_req zone=blitz nodelay;
}
然后重新載入Nginx配置,看一下效果:
你會(huì)發(fā)現(xiàn)現(xiàn)在大于只有285人可以訪問到服務(wù)器,每秒請(qǐng)求數(shù)為4.75 ,沒有超過我們?cè)O(shè)置的5次每秒,檢查日志你會(huì)發(fā)現(xiàn)沒有訪問到的請(qǐng)求都是HTTP 503,訪問到的都是HTTP 200.
使用這樣的設(shè)置對(duì)于想限制地區(qū)訪問是很有幫助的,它也可以應(yīng)用在所有的php請(qǐng)求上.
PHP 應(yīng)用請(qǐng)求限制
如果你想限制所有的PHP應(yīng)用限制,你可以這樣做:
limit_req zone=flood;
include php_params.conf;
fastcgi_pass unix:/tmp/php5-fpm.sock;
}
它可以幫你玩意些設(shè)置項(xiàng)像加速或減速,以應(yīng)對(duì)突發(fā)或無延時(shí)需求. 配置項(xiàng)詳情,猛擊這里: HttpLimitReqModule.
注:
你可能注意到上面的圖表測試了1075個(gè)用戶請(qǐng)求,這里有個(gè)誤導(dǎo),因?yàn)樗械脑L問請(qǐng)求都來自與位于加州的同一個(gè)IP(50.18.0.223).
我很難實(shí)現(xiàn)一個(gè)真實(shí)的高流量網(wǎng)絡(luò)或者DDOS (分布式拒絕服務(wù)攻擊).這也就是為什么我們?cè)L問成功的用戶的數(shù)量跟IP不是很大. 服務(wù)器負(fù)載也會(huì)影響測試用戶的訪問數(shù)或者地區(qū). 使用免費(fèi)版本你可以最多并發(fā)訪問到的用戶數(shù)是50個(gè). 當(dāng)然你可以花每天$49美刀讓1000個(gè)用戶訪問你的網(wǎng)站.
如果你有足夠的內(nèi)存跟帶寬,用單一IP地址測試是很容易的. 用這個(gè)工具就可以實(shí)現(xiàn): 高并發(fā)量, ab, openload等等. 只不過是在終端界面,沒有UI而已.
當(dāng)然你要自己測試, 記住要使用status flag,因?yàn)锽litz會(huì)在5秒左右后響應(yīng)訪問請(qǐng)求.
更好的替換方案
這里不會(huì)深入講解更多細(xì)節(jié), 如果你認(rèn)真的想阻止攻擊你服務(wù)器的DDOS或multi-service attack,還有其他很棒的軟件工具像 iptables (linux), pf (packet filter for BSD) , 或者你的服務(wù)器提供硬件的話,你可以使用你的硬件防火墻 . 上述的限制模塊只會(huì)阻止通過HTTP請(qǐng)求過來的洪水攻擊,它不會(huì)阻止ping包洪水攻擊或者其他的漏洞,對(duì)于這些情況你可以關(guān)閉不需要的服務(wù)和不需要的端口,以防止別人的突破.
舉個(gè)例子,我的服務(wù)器對(duì)外網(wǎng)公開的端口只有HTTP/HTTPS和SSH. 像MySQL這些服務(wù)之綁定本地連接. 也可以將一些通用服務(wù)設(shè)置成不常用的端口上,這樣就不會(huì)被嗅探器(iptables/pf會(huì)對(duì)這種情況有幫助).
相關(guān)文章
高性能WEB開發(fā) nginx HTTP服務(wù)器篇
新產(chǎn)品為了效果,做的比較炫,用了很多的圖片和JS,所以前端的性能是很大的問題,分篇記錄前端性能優(yōu)化的一些小經(jīng)驗(yàn)。2010-05-05如何利用nginx通過正則攔截指定url請(qǐng)求詳解
這篇文章主要介紹了如何利用nginx通過正則攔截指定url請(qǐng)求的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Nginx限制搜索引擎爬蟲頻率、禁止屏蔽網(wǎng)絡(luò)爬蟲配置示例
這篇文章主要介紹了Nginx限制搜索引擎爬蟲頻率、禁止屏蔽網(wǎng)絡(luò)爬蟲配置示例,限制爬蟲頻率用于一些無良爬蟲,禁止爬蟲用于一些不需要收錄的網(wǎng)站,需要的朋友可以參考下2014-07-07Nexus使用nginx代理實(shí)現(xiàn)支持HTTPS協(xié)議
這篇文章主要介紹了Nexus使用nginx代理實(shí)現(xiàn)支持HTTPS協(xié)議,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Nginx配置Basic Auth登錄認(rèn)證的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx配置Basic Auth登錄認(rèn)證的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09詳解Nginx的超時(shí)keeplive_timeout配置步驟
Nginx 處理的每個(gè)請(qǐng)求均有相應(yīng)的超時(shí)設(shè)置,本文主要介紹了Nginx的超時(shí)keeplive_timeout配置步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Nginx服務(wù)器中強(qiáng)制使用緩存的配置及緩存優(yōu)先級(jí)的講解
這篇文章主要介紹了Nginx服務(wù)器中強(qiáng)制使用緩存的配置及緩存優(yōu)先級(jí)的講解,一定程度上可以幫助大家解決Nginx不緩存或緩存失效的問題,需要的朋友可以參考下2016-01-01