怎么配置Nginx服務器防止Flood攻擊

測試

我會簡單的告訴你如何配置nginx的限制請求模塊并且它是如何保護你的網站,防止你被攻擊與ddos或是其他基于http的拒絕服務攻擊。

這個測試中,我將樣本頁在保存在blitz.io(現在是免費服務)命名為about.html,用于測試limit_req指令.

首先,我在blitz上使用下面的指令,用來發起1075個并發請求并且持續一分鐘,響應超時設置為2分鐘,區域為加州,同時設置了除掉狀態200以外的其他狀態全部為異常狀態,甚至是503都被認為是沒有成功.

-p 1-1075:60 –status 200 -t 2000 -r california http://kbeezie.com/about.html

怎么配置Nginx服務器防止Flood攻擊

?還不算壞,對不對? 但如果這是一個php文檔. 很可能有用戶會造成php進程的502/504狀態,讓服務器一直崩潰或無響應. 尤其是你使用了沒有任何保護的vps或者其他廉價服務器,故障率會更高。(原文廣告,此處屏蔽)

當然你可以使用緩存或其他工具來提高服務器性能與響應能力, 就比如你使用WordPress你肯定要使用wordpress caching plugin. da for those type of people we can use the limit request module.

nginx中我們創建一個區域http { },我叫他blitz設置每秒5次請求, 最大容納數據量為10mb.我使用$binary_remote_addr當作Session變量 讓你自己比$remote_addr的正常訪客可以訪問大于10mb的空間.

復制代碼?代碼如下:

limit_req_zone $binary_remote_addr zone=blitz:10m rate=5r/s;

然周在服務器中定義上這些規則:

復制代碼?代碼如下:

location = /about.html {
?limit_req zone=blitz nodelay;
}

然后重新載入nginx配置,看一下效果:

怎么配置Nginx服務器防止Flood攻擊

?你會發現現在大于只有285人可以訪問到服務器,每秒請求數為4.75 ,沒有超過我們設置的5次每秒,檢查日志你會發現沒有訪問到的請求都是http 503,訪問到的都是http 200.

使用這樣的設置對于想限制地區訪問是很有幫助的,它也可以應用在所有的php請求上.

php 應用請求限制

如果你想限制所有的php應用限制,你可以這樣做:

復制代碼?代碼如下:

location ~ .php {
?limit_req?? zone=flood;
?include php_params.conf;
?fastcgi_pass unix:/tmp/php5-fpm.sock;
}

它可以幫你玩意些設置項像加速或減速,以應對突發或無延時需求. 配置項詳情,猛擊這里: httplimitreqmodule.
注:

你可能注意到上面的圖表測試了1075個用戶請求,這里有個誤導,因為所有的訪問請求都來自與位于加州的同一個ip(50.18.0.223).

我很難實現一個真實的高流量網絡或者ddos (分布式拒絕服務攻擊).這也就是為什么我們訪問成功的用戶的數量跟ip不是很大. 服務器負載也會影響測試用戶的訪問數或者地區. 使用免費版本你可以最多并發訪問到的用戶數是50個. 當然你可以花每天$49美刀讓1000個用戶訪問你的網站.

如果你有足夠的內存跟帶寬,用單一ip地址測試是很容易的. 用這個工具就可以實現: 高并發量, ab, openload等等. 只不過是在終端界面,沒有ui而已.

當然你要自己測試, 記住要使用status flag,因為blitz會在5秒左右后響應訪問請求.

更好的替換方案

這里不會深入講解更多細節, 如果你認真的想阻止攻擊你服務器的ddos或multi-service attack,還有其他很棒的軟件工具像 iptables (linux), pf (packet Filter for bsd) , 或者你的服務器提供硬件的話,你可以使用你的硬件防火墻 . 上述的限制模塊只會阻止通過http請求過來的洪水攻擊,它不會阻止ping包洪水攻擊或者其他的漏洞,對于這些情況你可以關閉不需要的服務和不需要的端口,以防止別人的突破.

舉個例子,我的服務器對外網公開的端口只有http/httpsssh. 像mysql這些服務之綁定本地連接. 也可以將一些通用服務設置成不常用的端口上,這樣就不會被嗅探器(iptables/pf會對這種情況有幫助).

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享