web-dev-qa-db-ja.com

nginxによるDDoSの緩和/防止

(「重複している」問題を回避するには:多くのリクエストが表示されません。数はかなり少ないです。代わりに、各リクエストが大量のデータをダウンロードします。)

私が話しているサーバーは、40 GBit /秒のバックエンドで、2x10 GBit /秒のインターネット接続を備えています。 DebianStableシステムでnginx/vsftpd/rsyncdを使用して、約20テラバイトのデータを公開します。さらに、Apache2は一部の非静的コンテンツを提供するために使用されますが、これは無視できます。

ハードウェアは、最大18 GBit /秒(1回の観測で)まで十分に機能し、トラフィックは無料です。サーバーはオープンソースソフトウェアや他の公開ソフトウェアのミラーであるため、ダウンタイムが重大な問題になるという問題もありません。

ただし、サーバーへの影響を停止したいDDoS攻撃の特定のパターンを観察しました。攻撃が進行中の場合は常に、DebianのDVD ISOのほとんど(約300ギガバイト、RAMに収まるものよりはるかに多い)が複数のホストによってダウンロードされ、ファイルごとのダウンロードが繰り返されます。攻撃がどの程度組織化されているかに応じて、これにより帯域幅が大幅に増加し、もちろんハードウェアにいくらかのストレスがかかり、同時にサーバーの正当なユーザーのエクスペリエンスが制限されます。

これらの攻撃では、通常2〜3のネットワークが攻撃で調整され、それぞれが説明されているようにファイルをダウンロードします。ほとんどの場合、ワンクリックホスティング業者または何らかのファイルキャッシュが悪用され、だまされて同じファイルを繰り返しダウンロードします。これは、攻撃の一部として複数の異なるファイルをダウンロードするように自動化されています。

特定のIP範囲を自動禁止するようにnginxを構成する方法はありますか?または、これらのネットワークのトラフィックレートを、たとえば1 GBit /秒に制限しますか(しばらくの間)?

高速転送(ミラーからミラーへの可能性が高い)の場合でもサーバーを実際に使用する必要があるため、一般的な制限を課したくありません。

発言として、巧妙な攻撃者は、動機が何であれ、HTTPの代わりにFTP/RSYNCを悪用し始め、この質問が生み出す可能性のある解決策を回避する可能性があります。

現在、DDoS攻撃が行われていることに気付いたときは、ログファイルをスキャンし、悪用しているネットワークを特定して、手動で禁止します。

2
C-Otto

実際には、 Nginx limit_req モジュールと Nginx limit_conn を使用できます。

どちらのモジュールも、特定のソースからの接続を制限したり、IPからの要求を制限したりすることができます。これは、あなたの場合に非常に役立つ可能性があります。

Reuqestによると、nginxを使用して帯域幅を制限することもできます。

location ^~ /videos/ {
...
limit_rate_after 100m;
limit_rate 150k;
...
}

この例では、limit_rate_after 100m; nginxは(各ユーザー接続ごとに、このに注意してください)接続を最大150kに調整します。したがって、たとえば、最大100mの全帯域幅を許可してから速度を制限する必要がある場合は、これが役立ちます。

このソリューションは接続ごとのnginxダウンロード速度を制限するため、1人のユーザーが複数のビデオファイルを開いた場合、150k xビデオファイルに接続した回数をダウンロードできることに注意してください。接続に制限を設定する必要がある場合は、limit_zoneおよびlimit_connディレクティブを使用してそれを行うことができるはずです。例:

サーバーブロック構成の内部:

limit_rate 128K; limit_zone one $binary_remote_addr 10m;

ロケーションブロック構成内:

limit_conn one 10;

この例では、IPごとに1メガビットで10接続が許可されます。

クレジット

4
x86fantini

Nginxアクセスログをスキャンする構成でfail2banを使用できます。これを助ける多くのガイドがウェブの周りにあります。

パターン認識を行う特殊なソフトウェア/ハードウェアがなければ、この種の攻撃をブロックすることは非常に困難です。おそらくあなたはある種のブラックリストを使用することができますが、あなたのユースケースに適合するものがあるかどうかはわかりません。

別の解決策は、ブラウザがjavascriptを使用しない限りダウンロードをブロックする、ある種のjavascriptウォールを使用することですが、これは悪い習慣であり、curl/wgetを使用する正当なユーザーをブロックします。

0
Gothrek