私はnginxのHttpLimitReqModuleを使用してレート制限を検討しています。ただし、リクエストはすべて同じIP(ロードバランサー)から送信され、ヘッダーに実際のIPアドレスが含まれます。
X-Forwarded-ForソースのIPではなくヘッダーのIPに基づいてnginxレート制限を設定する方法はありますか?
私はnginxのHttpLimitReqModuleを使用してレート制限を検討しています。ただし、リクエストはすべて同じIP(ロードバランサー)から送信され、ヘッダーに実際のIPアドレスが含まれます。
X-Forwarded-ForソースのIPではなくヘッダーのIPに基づいてnginxレート制限を設定する方法はありますか?
回答:
はい、典型的なレート制限構成定義文字列は次のようになります。
limit_req_zone $binary_remote_addr zone=zone:16m rate=1r/s;
どこ$binary_remote_addrリミッタの一意のキーです。ヘッダー$http_x_forwarded_forの値を取得する変数に変更してみてくださいX-Forwarded-For。ただし、$binary_remote_addrIPアドレスの保存に圧縮バイナリ形式を使用しているため、メモリ消費量が増加しますが、そうで$http_x_forwarded_forはありません。
limit_req_zone $http_x_forwarded_for zone=zone:16m rate=1r/s;
$binary_remote_addr変数が正しく設定されます。
このlimit_req_zoneディレクティブは、リクエストのグループ化のキーとして使用される変数を定義します。
通常は、サイズが小さくスペースを節約するためと$binary_remote_addrいうよりは、が使用され$remote_addrます。
代わりにRealipModuleを使用することもできます。
これにより、リモートアドレス変数がカスタムヘッダーで指定されたアドレスに書き換えられ、ロギングやその他の変数の使用が簡単になります。
$binary_remote_addrと$remote_addr一般的に、あなたの構成されたヘッダの値に設定されているX-Forwarded-For-あなたの標準変数は今、「本当のクライアントのIPアドレス」ですので。実行nginx -Vして、NGINXがでビルドされて--with-http_realipいるかどうかを確認します。configは次のように簡単です set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; 。CIDRの範囲は、X-Forwarder-Forヘッダーを設定しているアップストリームロードバランサーの範囲です。