リクエスト制限設定の前に、いくつかの「拒否」ルールがあります。拒否ルールによってブロックされたユーザーがサイトに DDos 攻撃を仕掛けると、リクエスト制限がトリガーされ、何千ものログ エントリが作成されます。なぜでしょうか。拒否ルールを超えないだろうと予想していました。
include /etc/nginx/blacklist.conf;
limit_req zone=limit burst=3 nodelay;
ログには禁止エラーが表示され、その直後に何百ものリクエスト制限エラーが表示されます。これが何度も繰り返されます。
答え1
nginxがリクエストを処理する際は、いくつかの段階。 その中で :事前アクセスそしてアクセスフェーズ。
事前アクセスは、通常、/ディレクティブlimit_req
が機能する場所です。一方、accessは、 /ディレクティブが機能する場所です。つまり、レート制限が行われますallow
deny
前に両方のディレクティブが同じコンテキストで宣言されている場合の IP フィルタリング。
したがって、ネイティブ ディレクティブを使用して nginx で直接動作するように fail2ban に似たプロセス (他の質問の戻りコード 444 を考慮) を取得しようとする場合、それは本質的に不可能です。
答え2
この問題はちょっと古いですが、この問題を抱えている人にとって、私が見つけた最善の解決策は、ルールの代わりにmap
を と一緒に使うことです(ただし、nginxでは を使うのは避けています)。if
deny
ifs
ザビエル・ルーカス言った:
レート制限は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;