前言
Nginx是一款輕量級的Web服務(wù)器,由俄羅斯的程序設(shè)計師Igor Sysoev所開發(fā),最初供俄國大型的入口網(wǎng)站及搜尋引Rambler使用。 其特點是占有內(nèi)存少,并發(fā)能力強(qiáng),事實上Nginx的并發(fā)能力確實在同類型的網(wǎng)站服務(wù)器中表現(xiàn)較好。
防御DDOS是一個系統(tǒng)工程,攻擊花樣多,防御的成本高瓶頸多,防御起來即被動又無奈。DDOS的 特點是分布式,針對帶寬和服務(wù)攻擊,也就是四層流量攻擊和七層應(yīng)用攻擊,相應(yīng)的防御瓶頸四層在帶寬,七層的多在架構(gòu)的吞吐量。對于七層的應(yīng)用攻擊,我們還 是可以做一些配置來防御的,例如前端是Nginx,主要使用nginx的http_limit_conn和http_limit_req模塊來防御。 ngx_http_limit_conn_module 可以限制單個IP的連接數(shù),ngx_http_limit_req_module 可以限制單個IP每秒請求數(shù),通過限制連接數(shù)和請求數(shù)能相對有效的防御CC攻擊。
下面這篇文章主要給大家介紹了關(guān)于Nginx防御DDOS攻擊的配置方法,分享出來供打擊參考學(xué)習(xí),下面來一起看看詳細(xì)的介紹:
下面是配置方法:
一. 限制每秒請求數(shù)
ngx_http_limit_req_module模塊通過漏桶原理來限制單位時間內(nèi)的請求數(shù),一旦單位時間內(nèi)請求數(shù)超過限制,就會返回503錯誤。配置需要在兩個地方設(shè)置:
nginx.conf的http段內(nèi)定義觸發(fā)條件,可以有多個條件
在location內(nèi)定義達(dá)到觸發(fā)條件時nginx所要執(zhí)行的動作
例如:
1
2
3
4
5
6
7
8
9
10
|
http { limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //觸發(fā)條件,所有訪問ip 限制每秒10個請求 ... server { ... location ~ \.php$ { limit_req zone=one burst=5 nodelay; //執(zhí)行的動作,通過zone名字對應(yīng) } } } |
參數(shù)說明:
-
$binary_remote_addr
二進(jìn)制遠(yuǎn)程地址 -
zone=one:10m
定義zone名字叫one,并為這個zone分配10M內(nèi)存,用來存儲會話(二進(jìn)制遠(yuǎn)程地址),1m內(nèi)存可以保存16000會話 -
rate=10r/s;
限制頻率為每秒10個請求 -
burst=5
允許超過頻率限制的請求數(shù)不多于5個,假設(shè)1、2、3、4秒請求為每秒9個,那么第5秒內(nèi)請求15個是允許的,反之,如果第一秒內(nèi)請求15個,會將5個請求放到第二秒,第二秒內(nèi)超過10的請求直接503,類似多秒內(nèi)平均速率限制。 -
nodelay
超過的請求不被延遲處理,設(shè)置后15個請求在1秒內(nèi)處理。
二.限制IP連接數(shù)
ngx_http_limit_conn_module的配置方法和參數(shù)與http_limit_req模塊很像,參數(shù)少,要簡單很多
1
2
3
4
5
6
7
8
9
|
http { limit_conn_zone $binary_remote_addr zone=addr:10m; //觸發(fā)條件 ... server { ... location /download/ { limit_conn addr 1; // 限制同一時間內(nèi)1個連接,超出的連接返回503 } } } |
三.白名單設(shè)置
http_limit_conn 和http_limit_req模塊限制了單ip單位時間內(nèi)的并發(fā)和請求數(shù),但是如果Nginx前面有l(wèi)vs或者h(yuǎn)aproxy之類的負(fù)載均衡或者反向代 理,nginx獲取的都是來自負(fù)載均衡的連接或請求,這時不應(yīng)該限制負(fù)載均衡的連接和請求,就需要geo和map模塊設(shè)置白名單:
1
2
3
4
5
6
7
8
9
10
11
12
|
geo $whiteiplist { default 1; 10.11.15.161 0; } map $whiteiplist $limit { 1 $binary_remote_addr; 0 ""; } limit_req_zone $limit zone=one:10m rate=10r/s; limit_conn_zone $limit zone=addr:10m; |
geo模塊定義了一個默認(rèn)值是1的變量whiteiplist,當(dāng)在ip在白名單中,變量whiteiplist的值為0,反之為1
如果在白名單中--> whiteiplist=0 --> $limit="" --> 不會存儲到10m的會話狀態(tài)(one或者addr)中 --> 不受限制
反之,不在白名單中 --> whiteiplist=1 --> $limit=二進(jìn)制遠(yuǎn)程地址 -->存儲進(jìn)10m的會話狀態(tài)中 --> 受到限制
四.測試
使用ab命令來模擬CC攻擊,http_limit_conn 和http_limit_req模塊要分開測試,同時注意http_limit_conn模塊只統(tǒng)計正在被處理的請求(這些請求的頭信息已被完全讀入)所 在的連接。如果請求已經(jīng)處理完,連接沒有被關(guān)閉時,是不會被統(tǒng)計的。這時用netstat看到連接數(shù)可以超過限定的數(shù)量,不會被阻止。
ab -n
請求數(shù) -c 并發(fā) http://10.11.15.174/i.php
如果被阻止前臺會返回503,同時在nginx的error_log中會看到如下錯誤日志:
被限制連接數(shù):
2015/01/28 14:20:26 [error] 4107#0: *65525 limiting connections by zone "addr", client: 10.11.15.161, server: , request: "GET /i.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1", host: "10.11.15.174", referrer: "http://10.11.15.174/i.php"
被限制請求數(shù):
2015/01/28 14:18:59 [error] 4095#0: *65240 limiting requests, excess: 5.772 by zone "one", client: 10.11.15.161, server: , request: "GET /i.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1", host: "10.11.15.174", referrer: "http://10.11.15.174/i.php"
五.其它一些防CC的方法
1.Nginx模塊 ModSecurity、http_guard、ngx_lua_waf
- ModSecurity 應(yīng)用層WAF,功能強(qiáng)大,能防御的攻擊多,配置復(fù)雜
- ngx_lua_waf 基于ngx_lua的web應(yīng)用防火墻,使用簡單,高性能和輕量級
- http_guard 基于openresty
2.軟件+Iptables
- fail2ban 通過分析日志來判斷是否使用iptables攔截
- DDoS Deflate 通過netstat判斷ip連接數(shù),并使用iptables屏蔽
開頭說過抗DDOS是一個系統(tǒng)工程,通過優(yōu)化系統(tǒng)和軟件配置,只能防御小規(guī)模的CC攻擊,對于大規(guī)模攻擊、四層流量攻擊、混合攻擊來說,基本上系統(tǒng)和應(yīng)用軟件沒掛,帶寬就打滿了。下面是我在工作中使用過的防御DDOS的方式:
1、高防服務(wù)器和帶流量清洗的ISP
通常是美韓的服務(wù)器,部分ISP骨干供應(yīng)商有流量清洗服務(wù),例如香港的PCCW。通常可以防御10G左右的小型攻擊
2、流量清洗服務(wù) 例如:akamai(prolexic),nexusguard 我們最大受到過80G流量的攻擊,成功被清洗,但是費用非常貴
3、CDN 例如:藍(lán)訊 網(wǎng)宿 cloudflare
等,CDN針對DDOS的分布式特點,將流量引流分散,同時對網(wǎng)站又有加速作用,效果好,成本相對低。
總結(jié)一下:發(fā)動攻擊易,防御難。七層好防,四層難防;小型能防,大型燒錢
好了,以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
參考文章:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http://www.nginx.cn/446.html
http://www.ttlsa.com/nginx/nginx-limited-connection-number-ngx_http_limit_conn_module-module/
原文鏈接:https://lnmp.ymanz.com/lnmp/22.html