Nginx で DoS 対策を行う方法
Web サイトを公開するにあたり、Nginx で簡単な DoS 攻撃対策を行う方法を紹介します。特別な方法ではなく最初から Nginx にある機能の紹介です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
http { ~省略~ limit_req_zone $binary_remote_addr zone=lrz:5m rate=5r/s; ~省略~ } server { ~省略~ location ~ .php$ { limit_req zone=lrz burst=10 nodelay; fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
- limit_req_zone
$binary_remote_addr は接続元の IP アドレスを示しており、上記の例では、1秒間に 5 リクエスト程度同一のクライアント(IP)からアクセスが来ることを想定しています。
また、zone の設定で 5MB 分の IP アドレスを保持するという設定になっています。このあたりはサイトのアクセス数に応じて引き上げてください。
ただし、この設定だけではアクセスをブロックすることはありません。 - limit_req
この設定を入れたコンテキストで、limit_req_zone で設定した制限が適用されることになります。
burst を設定することで、制限を超えたリクエストも指定した数だけ待たせておくことができます。併せて nodelay を設定することで、制限を超えたリクエストを遅延させることなく直ちに 503 レスポンスを返します。逆に delay で指定した秒数遅延させることもできますが、攻撃のような予期せぬスパイクには nodelay で問題ないかと思います。
以上が、Nginx で簡単な DoS 対策になります。
注意点としては、上記は .php (ページ)に対して制限を有効にしていますが、これを全体に対して制限をかけてしまうと、画像やCSSファイルなどあらゆる静的ファイルに対してアクセスが来るのが普通なのですぐに制限にかかってしまいます。limit_req の設定を入れる際はステージング環境などで負荷試験等を行いつつ慎重に設定してください。