配置Nginx服務(wù)器防止Flood攻擊的方法
測(cè)試
我會(huì)簡(jiǎn)單的告訴你如何配置Nginx的限制請(qǐng)求模塊并且它是如何保護(hù)你的網(wǎng)站,防止你被攻擊與DDOS或是其他基于HTTP的拒絕服務(wù)攻擊。
這個(gè)測(cè)試中,我將樣本頁(yè)在保存在Blitz.io(現(xiàn)在是免費(fèi)服務(wù))命名為about.html,用于測(cè)試limit_req指令.
首先,我在Blitz上使用下面的指令,用來(lái)發(fā)起1075個(gè)并發(fā)請(qǐng)求并且持續(xù)一分鐘,響應(yīng)超時(shí)設(shè)置為2分鐘,區(qū)域?yàn)榧又荩瑫r(shí)設(shè)置了除掉狀態(tài)200以外的其他狀態(tài)全部為異常狀態(tài),甚至是503都被認(rèn)為是沒(méi)有成功.
-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ù)器一直崩潰或無(wú)響應(yīng). 尤其是你使用了沒(méi)有任何保護(hù)的VPS或者其他廉價(jià)服務(wù)器,故障率會(huì)更高。(原文廣告,此處屏蔽)
當(dāng)然你可以使用緩存或其他工具來(lái)提高服務(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的正常訪客可以訪問(wèn)大于10MB的空間.
然周在服務(wù)器中定義上這些規(guī)則:
limit_req zone=blitz nodelay;
}
然后重新載入Nginx配置,看一下效果:

你會(huì)發(fā)現(xiàn)現(xiàn)在大于只有285人可以訪問(wèn)到服務(wù)器,每秒請(qǐng)求數(shù)為4.75 ,沒(méi)有超過(guò)我們?cè)O(shè)置的5次每秒,檢查日志你會(huì)發(fā)現(xiàn)沒(méi)有訪問(wèn)到的請(qǐng)求都是HTTP 503,訪問(wèn)到的都是HTTP 200.
使用這樣的設(shè)置對(duì)于想限制地區(qū)訪問(wèn)是很有幫助的,它也可以應(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ā)或無(wú)延時(shí)需求. 配置項(xiàng)詳情,猛擊這里: HttpLimitReqModule.
注:
你可能注意到上面的圖表測(cè)試了1075個(gè)用戶請(qǐng)求,這里有個(gè)誤導(dǎo),因?yàn)樗械脑L問(wèn)請(qǐng)求都來(lái)自與位于加州的同一個(gè)IP(50.18.0.223).
我很難實(shí)現(xiàn)一個(gè)真實(shí)的高流量網(wǎng)絡(luò)或者DDOS (分布式拒絕服務(wù)攻擊).這也就是為什么我們?cè)L問(wèn)成功的用戶的數(shù)量跟IP不是很大. 服務(wù)器負(fù)載也會(huì)影響測(cè)試用戶的訪問(wèn)數(shù)或者地區(qū). 使用免費(fèi)版本你可以最多并發(fā)訪問(wèn)到的用戶數(shù)是50個(gè). 當(dāng)然你可以花每天$49美刀讓1000個(gè)用戶訪問(wèn)你的網(wǎng)站.
如果你有足夠的內(nèi)存跟帶寬,用單一IP地址測(cè)試是很容易的. 用這個(gè)工具就可以實(shí)現(xiàn): 高并發(fā)量, ab, openload等等. 只不過(guò)是在終端界面,沒(méi)有UI而已.
當(dāng)然你要自己測(cè)試, 記住要使用status flag,因?yàn)锽litz會(huì)在5秒左右后響應(yīng)訪問(wèn)請(qǐng)求.
更好的替換方案
這里不會(huì)深入講解更多細(xì)節(jié), 如果你認(rèn)真的想阻止攻擊你服務(wù)器的DDOS或multi-service attack,還有其他很棒的軟件工具像 iptables (linux), pf (packet filter for BSD) , 或者你的服務(wù)器提供硬件的話,你可以使用你的硬件防火墻 . 上述的限制模塊只會(huì)阻止通過(guò)HTTP請(qǐng)求過(guò)來(lái)的洪水攻擊,它不會(huì)阻止ping包洪水攻擊或者其他的漏洞,對(duì)于這些情況你可以關(guān)閉不需要的服務(wù)和不需要的端口,以防止別人的突破.
舉個(gè)例子,我的服務(wù)器對(duì)外網(wǎng)公開(kāi)的端口只有HTTP/HTTPS和SSH. 像MySQL這些服務(wù)之綁定本地連接. 也可以將一些通用服務(wù)設(shè)置成不常用的端口上,這樣就不會(huì)被嗅探器(iptables/pf會(huì)對(duì)這種情況有幫助).
相關(guān)文章
記錄Nginx服務(wù)器的Split Clients模塊配置過(guò)程
這篇文章主要介紹了Nginx服務(wù)器的Split Clients模塊的配置過(guò)程記錄,ngx-http-split-clients模塊用于切分客戶端連接,需要的朋友可以參考下2016-01-01
nginx添加nginx-sticky-module模塊步驟的實(shí)現(xiàn)
nginx-sticky-module模塊是nginx實(shí)現(xiàn)負(fù)載均衡的一種方案,和ip_hash負(fù)載均衡算法會(huì)有區(qū)別的,本文主要介紹了nginx添加nginx-sticky-module模塊步驟的實(shí)現(xiàn),感興趣的可以了解一下2023-08-08
Nginx安裝后/etc/nginx/conf.d下沒(méi)有default.conf的解決
nginx.conf是nginx默認(rèn)加載的配置文件 通過(guò)nginx -V可以看nginx默認(rèn)配置文件路徑,本文主要介紹了Nginx安裝后/etc/nginx/conf.d下沒(méi)有default.conf的解決,感興趣的可以了解一下2023-11-11
詳解nginx 代理多個(gè)服務(wù)器(多個(gè)server方式)
本篇文章主要介紹了詳解nginx 代理多個(gè)服務(wù)器(多個(gè)server方式),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Nginx 日志輪轉(zhuǎn)的實(shí)現(xiàn)示例
Nginx日志輪轉(zhuǎn)是監(jiān)控和調(diào)試Web服務(wù)器的重要工具,通過(guò)定期歸檔、壓縮和清理日志文件,可以節(jié)省磁盤空間、提高性能并方便故障排查,下面就來(lái)介紹一下2024-12-12

