防禦DDOS是一個系統工程,攻擊花樣多,防禦的成本高瓶頸多,防禦起來即被動又無奈。 DDOS的特點是分散式,針對頻寬和服務攻擊,也就 是四層流量攻擊和七層應用攻擊,相應的防禦瓶頸四層在頻寬,七層的多在架構的吞吐量。
一. 限制每秒請求數
#ngx_http_limit_req_module模組透過漏桶原理來限制單位時間內的請求數,一旦單位時間內請求數超過限制,就會回傳503錯誤。
設定需要在兩個地方設定:
nginx.conf的http段內定義觸發條件,可以有多個條件
在location內定義達到觸發條件時nginx所要執行的動作
http { limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //触发条件,所有访问ip 限制每秒10个请求 ... server { ... location ~ \.php$ { limit_req zone=one burst=5 nodelay; //执行的动作,通过zone名字对应 } } }
#參數說明:
$binary_remote_addr 二進位遠端位址
zone=one :10m 定義zone名字叫one,並為這個zone分配10M內存,用來儲存會話(二進位遠端位址),1m內存可以保存16000會話
rate=10r/s; 限制頻率為每秒10個請求
burst=5 允許超過頻率限制的請求數不多於5個,假設1、2、3、4秒請求為每秒9個,那麼第5秒內請求15個是允許的,反之,如果第一秒內請求15個,會將5個請求放到第二秒,第二秒內超過10的請求直接503,類似多秒內平均速率限制。
nodelay 超過的請求不被延遲處理,設定後15個請求在1秒內處理。
二.限制IP連線數
ngx_http_limit_conn_module的設定方法和參數與http_limit_req模組很像,參數少,要簡單很多
http { limit_conn_zone $binary_remote_addr zone=addr:10m; //触发条件 ... server { ... location /download/ { limit_conn addr 1; // 限制同一时间内1个连接,超出的连接返回503 } } }
三.白名單設定
http_limit_conn和http_limit_req模組限制了單ip單位時間內的並發和請求數,但是如果Nginx前面有lvs或者haproxy之類的負載平衡或反向代理,nginx獲取的都是來自負載平衡的連接或請求,這時不應該限制負載平衡的連接和請求,就需要geo和map 模組設定白名單:
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;
更多Nginx相關技術文章,請造訪Nginx使用教學欄位進行學習!
以上是nginx反向代理後,如何防止ddos攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!