在請求限製配置之前我有一些“拒絕”規則。如果被封鎖的使用者(透過拒絕規則)正在對網站進行 ddossing,他仍然會觸發請求限制,因此會建立數千個日誌條目。為什麼?我預計它不會超出拒絕規則。
include /etc/nginx/blacklist.conf;
limit_req zone=limit burst=3 nodelay;
日誌顯示一個禁止錯誤,緊接著是數百個請求限制錯誤。這一遍又一遍地重複。
答案1
當nginx處理一個請求時,會經過幾個階段。他們之中 :預訪問和使用權階段。
預訪問是通常limit_req
起作用的地方,而訪問是allow
/deny
指令起作用的地方。這意味著速率限制已完成前如果兩個指令在同一上下文中聲明,則進行 IP 過濾。
因此,如果您的意願是嘗試使用本機指令在 nginx 中直接工作一些類似於fail2ban的進程(考慮到您的其他問題返回代碼 444),這本質上是不可能的。
答案2
這個問題有點老了,但是對於任何遇到這個問題的人來說,我找到的針對這種情況的最佳解決方案是使用 amap
和 anif
而不是deny
規則(儘管我盡量避免ifs
在nginx 中使用),因為像澤維爾·盧卡斯說:
速率限制在IP過濾之前完成
您可以blacklist.conf
從以下位置變更文件:
deny 1.2.3.4;
到:
1.2.3.4 0;
建立一個文件whitelist.conf
:
if ( $whitelist = 0 ) {
return 403;
}
然後,在 中nginx.conf
,包含一個將每個 ip 列入白名單的映射,除了 中的 IP blacklist.conf
:
http {
geo $whitelist {
/etc/nginx/blacklist.conf;
default 1;
}
...
}
最後,也在nginx.conf
每個伺服器指令之前加入該whitelist.conf
檔案:
server {
server_name ...;
listen 443 ssl;
include /etc/nginx/whitelist.conf;
ssl_certificate /etc/ssl/bundle.crt;
ssl_certificate_key /etc/ssl/server.key;
...
}
...
黑名單ip的請求會立即返回並且不會記錄在錯誤日誌檔案中。
您也可以使用以下命令停止將這些 ip 的請求記錄在存取記錄檔中:
access_log /path/to/file if=$whitelist;