IPでリクエストを制限する前に、信頼するプロキシからクライアントアドレスを復元します。そうしないと、多数の訪問者が1台のCDNサーバーとして数えられます。
間違った人がブロックされる理由
AliceとBobは同じCDNアドレスを通過します。real-IP処理がなければ、Nginxには両方ともそのCDNアドレスに見えます。Aliceの通信が、Bobも共有しているように見える割り当てを使い切る可能性があります。
任意の受信ヘッダーではなくプロキシを信頼する
この説明用設定はhttp内に置きます。文書用アドレスを実際の信頼するプロキシ範囲に置き換える必要があります。プロキシがX-Forwarded-Forを正しく維持することを前提としています。
nginx
set_real_ip_from 192.0.2.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
limit_req_zone $binary_remote_addr zone=per_client:10m rate=5r/s;
server {
listen 80;
location /api/ {
limit_req zone=per_client burst=10;
limit_req_status 429;
proxy_pass http://127.0.0.1:3000;
}
}
