使用Nginx防御CC攻擊
本文主要介紹了有關使用Nginx防御CC攻擊的一些配置。CC攻擊針對的是服務器上面的內存和CPU資源,因此通常會找到一些比較高消耗的接口,例如search.php之類的需要大量sql查詢的接口。因此,明白了這一點,我們就很好防御了,主要是針對單個ip地址的連接數和請求php文件的密度來控制的。
我們主要用到的是Nginx中提供的兩個limit模塊:
- ngx_http_limit_conn_module
- ngx_http_limit_req_module
一、白名單
首先這兩個模塊是支持白名單的,就是可能有某些IP地址,我們是不需要進行限制的,比如可能會是搜索引擎啦什么的或者自己的IP,因此需要設置一個白名單,不需要的可跳過本步。具體方法:
在HTTP段中插入如下格式內容,聲明白名單IP
- http{
- .......
- geo $limited{
- default 1;
- #公司
- 119.123.5.0/24 0;
- }
- .........
- }
geo指令定義了一個白名單$limited變量,默認值為1,如果客戶端IP在上面的范圍內,$limited的值為0。
然后緊跟在上面內容后使用map指令映射搜索引擎客戶端的ip為空串,如果不是白名單IP就顯示本身真實的IP,這樣搜索引擎iIP就不能存到limit模塊的內存session中,所以不會限制白名單的IP訪問。
- map $limited $limit {
- 1 $binary_remote_addr;
- 0 "";
- }
二、訪問頻率限制
訪問頻率限制使用到的是ngx_http_limit_req_module,需要在兩個地方配置,首先在HTTP段中,聲明好這個模塊一些參數,如果有設置白名單,設置如下
- http{
- ...
- limit_req_zone $limit zone=one:10m rate=20r/m; ##平均20r/m 每分鐘20個請求
- ...
- }
如果沒有配置白名單,所有來訪IP都會限制,配置如下
- http{
- ...
- limit_req_zone $binary_remote_addr zone=one:10m rate=20r/m; ##平均20r/m 每分鐘20個請求
- ...
- }
解釋一下上面的參數,第一個代表的是需要限制的ip群,這個很好理解,第二個zone=one表示這個limit_zone的名字叫做one,后面的使用中可以用這個one來進行指代,后面的15m,代表為這個zone分配10m的內存,1m可以保存16000的$binary_remote_addr。最后一個是頻率,如果要按秒來算可以設置20r/s這樣。
最后是配置到Nginx的php的解析段
- location ~ \.php$ {
- ...
- limit_req zone=one burst=5 nodelay;
- ...
- }
指定了使用名字為one的zone,然后緩沖隊列為5,無延遲,如果不設置無延遲,訪問會卡住。
三、訪問連接限制
訪問連接限制使用到的是ngx_http_limit_conn_module,也是需要在兩個地方配置,首先在HTTP段中,聲明好這個模塊一些參數,如果有設置白名單,設置如下
- http{
- ...
- limit_conn_zone $limit zone=addr:10m;
- ...
- }
如果沒有配置白名單,所有來訪IP都會限制,配置如下
- view sourceprint?http{
- ...
- limit_conn_zone $binary_remote_addr zone=addr:10m;
- ...
- }
參數的意思跟上面的差不多也就不多解釋了。
后面的就是在server段中進行設置了,可以具體到某個目錄什么的了
- server {
- location /download/ {
- limit_conn addr 5;
- }
大功告成,打完收工,記得要nginx -s reload一下哦~