您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么在nginx中限制IP惡意調用短信接口,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
處理方法:
一、nginx黑名單方式:
1、過濾日志訪問API接口的IP,統計每10分鐘調用超過100次的IP,直接丟進nginx的訪問黑名單
2、具體步驟:
編寫shell腳本:
vim /shell/nginx_cutaccesslog.sh #!/bin/bash log_path=/xxx/nginx/logs date=`date -d "10 min ago" +%Y%m%d-%H:%M:%S` nginxpid=`cat ${log_path}/nginx.pid` cd ${log_path} #過濾access.log中正常訪問API接口并在10分鐘(下面是日志切割,再做個定時任務每10分鐘執行一次,就可以實現了)內訪問量最高的30個IP,取值如果此IP訪問量大于100次,則把此IP放入黑名單 cat access.log | grep sendCheckCode | grep -v 403 | awk '{print $2}'|sort|uniq -c | sort -k1 -n | tail -30 | awk '{if($1>100) print "deny "$2";"}' > ../conf/denyip.conf #日志切割,做定時任務,每10分鐘執行一次 mv ${log_path}/access.log ${log_path}/accesslog.bak/access_${date}.log ../sbin/nginx -s reload
可自己定義時間間隔和訪問量,也可取消篩選訪問量最高的30個,直接取值每10分鐘訪問接口超過100次的
其中:"grep -v 403
" 是把已經禁止訪問的IP給過濾掉,只篩選正常訪問的
3、修改nginx.conf
在http模塊加入:
include denyip.conf;
重新加載nginx生效。
4、添加計劃任務:
*/10 * * * * /bin/bash /shell/nginx_cutaccesslog.sh > /dev/null 2>&1
5、驗證:
[root@xxx logs]# ll accesslog.bak/ -rw-r--r-- 1 root root 2663901 Jun 5 15:10 access_20180605-15:00:01.log -rw-r--r-- 1 root root 13696947 Jun 5 15:20 access_20180605-15:10:01.log -rw-r--r-- 1 root root 13265509 Jun 5 15:30 access_20180605-15:20:01.log -rw-r--r-- 1 root root 13846297 Jun 5 15:40 access_20180605-15:30:01.log [root@xxx logs]# cat ../conf/denyip.conf ………… ………… deny 112.12.137.28; deny 183.167.237.229; deny 111.41.43.58; deny 115.217.117.159; deny 219.133.100.133; deny 171.221.254.115; deny 60.184.131.6; ………… …………
再查看已經禁用IP的訪問日志,則會返回403錯誤:
[root@xxx logs]# tail -f access.log | grep "60.184.131.6" 31268622 60.184.131.6 "-" [05/Jun/2018:15:47:34 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode" 31268622 60.184.131.6 "-" [05/Jun/2018:15:47:35 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode" 31268622 60.184.131.6 "-" [05/Jun/2018:15:47:35 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" https://xxxxxx/sendCheckCode
二、限制IP請求數:
處理這種情況的方法還有一種是限制單 IP 單位時間的請求數,以及單 IP 的并發連接數
此方法沒有實際運用,因為感覺這種方法會誤殺正常的訪問用戶
寫一下此方法的大概配置,http模塊加入:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s; server { location /search/ { limit_req zone=one burst=5; }
如何估算 limit_req_zone size:
一兆字節區域可以保持大約1萬6064字節的狀態。
那么 10M 就可以存儲 16 萬的 IP 統計信息, 這個對普通應用足夠了,16 萬每秒的 UV,已經超級厲害了。
如果 size 的大小如果設置小了, 例如設置成 1M,那么當一秒內的請求 IP 數超過 16000 的時候,超出的 IP 對應的用戶看到的均為 503 Service Temporarily Unavailable 頁面了。參考, 漏桶算法 Leaky Bucket。 同時,rate 的單位用 r/s 非常合適,如果換成按天,按小時計數,10M 的內存肯定不夠用。
如何估算 limit_req_zone rate:
首先需要知道的是,普通瀏覽器的同時并發數量。按照 Dropbox 技術博客里所談到的,目前主流瀏覽器限制 AJAX 對同一個子域名的并發連接數是6個。IE 6,IE 7 是兩個。
大多數瀏覽器每個主機名都有6個并發連接的限制。
關于怎么在nginx中限制IP惡意調用短信接口就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。