Nginx配置防護DDos,cc等流量攻擊(1.限制ip訪問次數,2.添加ip黑名單)

1、限制同一時間段ip訪問次數

nginx能夠經過ngx_http_limit_conn_modulengx_http_limit_req_module配置來限制ip在同一時間段的訪問次數.html

ngx_http_limit_conn_module:該模塊用於限制每一個定義的密鑰的鏈接數,特別是單個IP​​地址的鏈接數.使用limit_conn_zone和limit_conn指令.node

ngx_http_limit_req_module:用於限制每個定義的密鑰的請求的處理速率,特別是從一個單一的IP地址的請求的處理速率。使用「泄漏桶」方法進行限制.指令:limit_req_zone和limit_req.nginx

ngx_http_limit_conn_module:限制單個IP的鏈接數示例:服務器

http { 
  limit_conn_zone $binary_remote_addr zone=addr:10m; 
   #定義一個名爲addr的limit_req_zone用來存儲session,大小是10M內存,
  #以$binary_remote_addr 爲key,
  #nginx 1.18之後用limit_conn_zone替換了limit_conn,
  #且只能放在http{}代碼段.
  ... 
  server { 
    ... 
    location /download/ { 
      limit_conn addr 1;   #鏈接數限制
      #設置給定鍵值的共享內存區域和容許的最大鏈接數。超出此限制時,服務器將返回503(服務臨時不可用)錯誤.
       #若是區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤
    }

可能有幾個limit_conn指令,如下配置將限制每一個客戶端IP與服務器的鏈接數,同時限制與虛擬服務器的總鏈接數:session

http { 
  limit_conn_zone $binary_remote_addr zone=perip:10m; 
  limit_conn_zone $server_name zone=perserver:10m 
  ... 
  server { 
    ... 
    limit_conn perip 10;      #單個客戶端ip與服務器的鏈接數.
    limit_conn perserver 100;  #限制與服務器的總鏈接數
    }

參考文檔:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html測試

 ngx_http_limit_req_module:限制某一時間內,單一IP的請求數網站

示例:spa

http {
  limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  ...
  #定義一個名爲one的limit_req_zone用來存儲session,大小是10M內存,  
  #以$binary_remote_addr 爲key,限制平均每秒的請求爲1個,
  #1M能存儲16000個狀態,rete的值必須爲整數,
  
  server {
    ...
    location /search/ {
      limit_req zone=one burst=5;
        
        #限制每ip每秒不超過1個請求,漏桶數burst爲5,也就是隊列.
        #nodelay,若是不設置該選項,嚴格使用平均速率限制請求數,超過的請求被延時處理.
        #舉個栗子:
        #設置rate=20r/s每秒請求數爲20個,漏桶數burst爲5個,
        #brust的意思就是,若是第1秒、2,3,4秒請求爲19個,第5秒的請求爲25個是被容許的,能夠理解爲20+5
        #可是若是你第1秒就25個請求,第2秒超過20的請求返回503錯誤.
        #若是區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤 
        #速率在每秒請求中指定(r/s)。若是須要每秒少於一個請求的速率,則以每分鐘的請求(r/m)指定。 
        
    }

還能夠限制來自單個IP地址的請求的處理速率,同時限制虛擬服務器的請求處理速率:日誌

http {
  limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
  limit_req_zone $server_name zone=perserver:10m rate=10r/s;
  ...
  server {
    ...
      limit_req zone=perip burst=5 nodelay;  #漏桶數爲5個.也就是隊列數.nodelay:不啓用延遲.
      limit_req zone=perserver burst=10;    #限制nginx的處理速率爲每秒10個
    }

 

二,禁止ip或ip網段

一、查找服務器全部訪問者ip方法:

awk '{print $1}' nginx_access.log |sort |uniq -c|sort -n

nginx.access.log 爲nginx訪問日誌文件所在路徑code

會到以下結果,前面是ip的訪問次數,後面是ip,很明顯咱們須要把訪問次數多的ip而且不是蜘蛛的ip屏蔽掉,以下面結果, 
若 66.249.79.84 不爲蜘蛛則須要屏蔽:

89 106.75.133.167
     90 118.123.114.57
     91 101.78.0.210
     92 116.113.124.59
     92 119.90.24.73
     92 124.119.87.204
    119 173.242.117.145
   4320 66.249.79.84

 

二、屏蔽IP的方法


在nginx的安裝目錄下面,新建屏蔽ip文件,命名爲guolv_ip.conf,之後新增長屏蔽ip只需編輯這個文件便可。 加入以下內容並保存:

deny 66.249.79.84 ;

在nginx的配置文件nginx.conf中加入以下配置,能夠放到http, server, location, limit_except語句塊,須要注意相對路徑,本例當中nginx.conf,guolv_ip.conf在同一個目錄中。

include guolv_ip.conf;

保存nginx.conf文件,而後測試如今的nginx配置文件是不是合法的:

nginx -t

若是配置沒有問題,就會輸出:

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

若是配置有問題就須要檢查下哪兒有語法問題,若是沒有問題,須要執行下面命令,重載 nginx 配置文件:

service nginx  reload

三、注意:

屏蔽ip的配置文件既能夠屏蔽單個ip,也能夠屏蔽ip段,或者只容許某個ip或者某個ip段訪問。

//屏蔽單個ip訪問

deny IP; 

//容許單個ip訪問

allow IP; 

//屏蔽全部ip訪問

deny all; 

//容許全部ip訪問

allow all; 

//屏蔽整個段即從123.0.0.1到123.255.255.254訪問的命令

deny 123.0.0.0/8

//屏蔽IP段即從123.45.0.1到123.45.255.254訪問的命令

deny 124.45.0.0/16

//屏蔽IP段即從123.45.6.1到123.45.6.254訪問的命令

deny 123.45.6.0/24

//若是你想實現這樣的應用,除了幾個IP外,其餘所有拒絕,
//那須要你在guolv_ip.conf中這樣寫

allow 1.1.1.1; 
allow 1.1.1.2;
deny all;
單獨網站屏蔽IP的方法,把include guolv_ip.conf; 放到網址對應的在server{}語句塊,
全部網站屏蔽IP的方法,把include guolv_ip.conf; 放到http {}語句塊。

參考:http://www.nginx.cn/2487.html

相關文章
相關標籤/搜索