回答:
Nginxディレクティブをlimit_rate使用すると、応答をレート制限する速度を指定できます。例:
location / {
if ($slow) {
limit_rate 4k;
}
}
Nginxのドキュメントはこちらです。(ドキュメントから、バックエンドが決定を行い、クライアントをレート制限するようにNginxに要求できることがわかります)
この$slow変数セットを取得する方法は、構成によって異なります。最も簡単なのは、geoマッピングを介して設定することです。
geo $slow {
default 0;
1.2.3.0/24 1;
}
「ジオ」マッピングは$slow、クライアントIPアドレスに基づく依存関係です。デフォルトは0で、クライアントIPアドレスが1.2.3.0/24サブネット内にある場合は1です。「geo」に関するNginxのドキュメントはこちら
「fail2ban」の使用は、このソリューション全体の合理的な進化です。「fail2ban」を使用して、異常なアクティビティを自動的に検出し、NginxのIPを収集してから、Nginxをリロードして、減速またはブロックする必要があるIPアドレスのリストを再読み取りできます。
問題のあるユーザーをだまして、まだ気付かれていないと思わせたい場合は、nginxのリクエスト制限モジュール(http://wiki.nginx.org/HttpLimitReqModule)を使用できます。
最初にリクエスト制限ゾーンを定義します。
http {
limit_req_zone $binary_remote_addr zone=spammers:1m rate=30r/m;
}
このゾーンは、リクエストを識別して1分あたり30(1/2秒)に制限するために、攻撃者のIPアドレスを使用します。ゾーンのメモリサイズは1 MiBに設定されていることに注意してください。これは、ゾーンが1 MiB /リクエストバケットあたり64バイト= 16384スパマーアドレスを処理できることを意味します(これは、私たちのケースでは多すぎるかもしれません)。必要に応じて、それぞれ調整してください。
次に、(悪、残念なことに)ifケースを使用してリミッターを介して犯罪者を実際にルーティングするディレクティブを定義します。
location / {
if ($remote_addr = 1.2.3.4) {
limit_req zone=spammer burst=5;
}
}
サーバーのアクセスログで、作業の成果を確認できます。
攻撃者がIPを変更するたびに構成ファイルを更新する必要があるため(この場合、IPを増やすだけでなく、より多くのifケースを意味します)、このハックはうまく拡張できないことに注意してください。