NginxでDoS攻撃を融和させる方法

俺的メモシリーズ

Posted by めろん on 2024/10/09 16:08

【PR】本記事はアフィリエイト広告を利用しています。

nginx.confに設定を入れる

に記述されていたのでそれを参考にしました。

nginx.conf
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

一寸私には聞きなれない制限は、「リーキー バケット(leaky bucket)」方式を使用というものを使用してるそうで、一般には分かりにくいかなと思います。

ようするに「バケツから漏れてる方式」で、バケツの底にN個の穴が空いててそこに水をいれると一定の速度で水が漏れる様を指しているということです。
アルゴリズム的な言い回しだと「平準化」といいます。

私もソケットを使用したネットワークプログラミングには参加していたのですが、このアルゴリズムについては知りませんでした。

An anime girl wearing a shirt with
AIが生成した絵だとなんか変ですが(笑)イメージ的にはこんな感じです。
水が「パケット」で、そこにある一定量しか溜めることができずそれ以上注ぐと溢れて処理しない。
処理するデータは設定した秒速で処理する。

ということになります。

上の設定例だと、「/serach」に対して同一のIPアドレスからのリクエストに制限をかけ、
一秒間に最大5バースト分処理をする、ということになります。
リクエストは定義された速度で処理されるようにわざと遅延処理を入れます。

過剰なリクエストがくると、最大バーストサイズ分を超えるとリクエストはエラーとして強制的に終了
させる、というものです。

過剰なリクエストを遅延処理をいれたくない場合は「nodelay」をいれろと書いてます。
詳しい説明は、

本家のページ

をみてください。

難しいのはホームページなどにイメージが沢山貼り付けてありそれを取り込もうとするとエラーになる可能性があるので、環境に合わせて適切にいれる必要があります。

余談ですが、対策コードをいれている関係上このサイトのイメージなどのレスポンスが悪いと思います。

すみませんがご理解ください。