ホームページ  >  記事  >  運用・保守  >  Nginx と Nginx Plus を使用して DDOS 攻撃に対抗する方法

Nginx と Nginx Plus を使用して DDOS 攻撃に対抗する方法

WBOY
WBOY転載
2023-05-14 20:34:041150ブラウズ

1. アプリケーション層の DDOS 攻撃の特徴

アプリケーション層 (第 7 層/http 層) の DDOS 攻撃は、通常、トロイの木馬プログラムによって開始されます。ターゲット システムの脆弱性を悪用してより適切に設計できる。たとえば、多数の同時リクエストを処理できないシステムの場合、セッションを維持するために多数の接続を確立し、定期的に少数のデータ パケットを送信するだけで、システムのリソースが枯渇してしまい、処理できなくなる可能性があります。 DDoS の目的を達成するために新しい接続要求を受け入れます。その他の攻撃には、大きなデータ パケットを送信するために大量の接続要求を送信することが含まれます。この攻撃はトロイの木馬プログラムによって開始されるため、攻撃者は迅速に多数の接続を確立し、短期間に大量のリクエストを発行することができます。

以下は DDoS の特別な証拠です。これらの特性を利用して DDoS (含むがこれに限定されない) に対抗できます。

  1. 攻撃は、比較的固定された IP から発生することがよくあります。 IP セグメント、つまり各 IP には実際のユーザーよりもはるかに多くの接続とリクエストがあります。 (注: これは、そのようなリクエストすべてが DDoS 攻撃を表すという意味ではありません。NAT を使用する多くのネットワーク アーキテクチャでは、多くのクライアントがゲートウェイの IP アドレスを使用してパブリック ネットワーク リソースにアクセスします。ただし、それでも、そのようなリクエストの数とその数は接続数も ddos​​ 攻撃よりもはるかに少なくなります。)

  2. この攻撃はトロイの木馬によって発行され、その目的はサーバーに過負荷をかけることであるため、接続の頻度は要求は普通の人よりもはるかに高くなります。

  3. #user-agent は通常、非標準の値です。

  4. referer は、攻撃に簡単に関連付けられる値である場合があります

2. nginx と nginx plus を使用して ddos​​ 攻撃に対抗する

上記の ddos​​ 攻撃の特徴と組み合わせることで、nginx と nginx plus nginx plus には、DDoS 攻撃を効果的に防御するために、入口のアクセス トラフィックを調整し、リバース プロキシからバックエンド サーバーへのトラフィックを制御することで、DDoS 攻撃に抵抗するという目的を達成できます。

1. リクエスト速度の制限

nginx および nginx plus の接続リクエストを実際のユーザーリクエストの妥当な範囲内に設定します。たとえば、通常のユーザーが 2 秒ごとにログイン ページをリクエストできると思われる場合は、クライアント IP からのリクエストを 2 秒ごとに受信するように nginx を設定できます (1 分あたり 30 リクエストにほぼ相当)。

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; 
server { 
... 
location /login.html { 
limit_req zone=one; 
... 
} 
}

`limit_req_zone` コマンドは、リクエスト ステータスの特定のキー値 (上記の例ではクライアント IP ($binary_remote_addr)) を保存するために one という名前の共有メモリ ゾーンを設定します。 location ブロックの `limit_req` は、1 つの共有メモリ領域を参照することによって /login.html へのアクセスを制限します。

2. 接続数を制限する

nginx および nginx plus の接続数を、実際のユーザー リクエストの妥当な範囲内に設定します。たとえば、クライアント IP ごとに /store への接続を 10 個まで設定できます。

limit_conn_zone $binary_remote_addr zone=addr:10m; 
server { 
... 
location /store/ { 
limit_conn addr 10; 
... 
} 
}

`limit_conn_zone` コマンドは、特定のキー値 (上記の例ではクライアント IP ($binary_remote_addr)) の状態を保存するために、addr と呼ばれる共有メモリ領域を設定します。 location ブロックの `limit_conn` は、addr 共有メモリ領域を参照することにより、/store/ への最大接続数を 10 に制限します。

3. 遅い接続を閉じる

slowlris などの一部の DDoS 攻撃は、多数の接続を確立し、定期的にデータ パケットを送信することでセッションを維持します。攻撃の目的を達成するために、このサイクルは通常、通常のリクエストよりも低くなります。この場合、低速接続を閉じることで攻撃に抵抗できます。

`client_body_timeout` コマンドはクライアント要求の読み取りのタイムアウトを定義するために使用され、`client_header_timeout` コマンドはクライアント要求ヘッダーの読み取りのタイムアウトを設定するために使用されます。これら 2 つのパラメータのデフォルト値は 60 秒ですが、次のコマンドを使用して 5 秒に設定できます:

server { 
client_body_timeout 5s; 
client_header_timeout 5s; 
... 
}

4. Set ip blacklist
# #攻撃が特定の IP アドレスからのものであると判断された場合は、その IP アドレスをブラックリストに追加することができ、nginx はそのリクエストを受け付けなくなります。たとえば、攻撃が 123.123.123.1 ~ 123.123.123.16 の範囲の IP アドレスから発生していると判断した場合、次のように設定できます。

location / { 
deny 123.123.123.0/28; 
... 
}

または、攻撃が 123.123 から発生していると判断した場合.123.3、123.123.123.5、123.123.123.7 いくつかの IP は次のように設定できます:

location / { 
deny 123.123.123.3; 
deny 123.123.123.5; 
deny 123.123.123.7; 
... 
}

5. IP ホワイトリストを設定します


Web サイトのみの場合特定の IP または IP セグメントへのアクセスを許可します。allow コマンドと Deny コマンドを一緒に使用して、指定した IP アドレスのみに Web サイトへのアクセスを制限できます。次のように、192.168.1.0 セグメントのイントラネット ユーザーのみにアクセスを許可するように設定できます。

location / { 
allow 192.168.1.0/24; 
deny all; 
... 
}

deny コマンドは、allow で指定された IP 範囲を除く他のすべての IP アドレスからのアクセス要求を拒否します。

6. キャッシュを使用してトラフィックのピークを削減する


nginx のキャッシュ機能を有効にし、特定のキャッシュ パラメーターを設定することで、攻撃によるトラフィックを削減できます。同時に、バックエンド サーバーにかかるリクエストの負荷も軽減できます。以下にいくつかの便利な設定を示します:

    proxy_cache_use_stale ` の更新パラメータは、キャッシュされたオブジェクトをいつ更新するかを nginx に指示します。必要なのはバックエンドへの更新リクエストのみであり、キャッシュが有効である間、オブジェクトに対するクライアント リクエストはバックエンド サーバーにアクセスする必要はありません。ファイルに対する頻繁なリクエストによって攻撃が実行される場合、キャッシュによってバックエンド サーバーへのリクエストの数が大幅に削減されます。
  1. proxy_cache_key ` 命令定义的键值通常包含一些内嵌的变量(默认的键值 $scheme$proxy_host$request_uri 包含了三个变量)。如果键值包含 `$query_string` 变量,当攻击的请求字符串是随机的时候就会给 nginx 代理过重的缓存负担,因此我们建议一般情况下不要包含 `$query_string` 变量。

7. 屏蔽特定的请求

可以设置 nginx、nginx plus 屏蔽一些类型的请求:

  1. 针对特定 url 的请求

  2. 针对不是常见的 user-agent 的请求

  3. 针对 referer 头中包含可以联想到攻击的值的请求

  4. 针对其他请求头中包含可以联想到攻击的值的请求

比如,如果你判定攻击是针对一个特定的 url:/foo.php,我们就可以屏蔽到这个页面的请求:

location /foo.php { 
deny all; 
}

或者你判定攻击请求的 user-agent 中包含 foo 或 bar,我们也可以屏蔽这些请求:

location / { 
if ($http_user_agent ~* foo|bar) { 
return 403; 
} 
... 
}

http_name 变量引用一个请求头,上述例子中是 user-agent 头。可以针对其他的 http 头使用类似的方法来识别攻击。

8. 限制到后端服务器的连接数

一个 nginx、nginx plus 实例可以处理比后端服务器多的多的并发请求。在 nginx plus 中,你可以限制到每一个后端服务器的连接数,比如可以设置 nginx plus 与 website upstream 中的每个后端服务器建立的连接数不得超过200个:

upstream website { 
server 192.168.100.1:80 max_conns=200; 
server 192.168.100.2:80 max_conns=200; 
queue 10 timeout=30s; 
}

`max_conns` 参数可以针对每一个后端服务器设置 nginx plus 可以与之建立的最大连接数。`queue` 命令设置了当每个后端服务器都达到最大连接数后的队列大小,`timeout` 参数指定了请求在队列中的保留时间。

9. 处理特定类型的攻击

有一种攻击是发送包含特别大的值的请求头,引起服务器端缓冲区溢出。nginx、nginx plus 针对这种攻击类型的防御,可以参考

[using nginx and nginx plus to protect against cve-2015-1635]
)

10. 优化nginx性能

ddos 攻击通常会带来高的负载压力,可以通过一些调优参数,提高 nginx、nginx plus 处理性能,硬抗 ddos 攻击,详细参考:

[tuning nginx for performance]

三、识别ddos攻击

到目前为止,我们都是集中在如何是用 nginx、nginx plus 来减轻 ddos 攻击带来的影响。如何才能让 nginx、nginx plus 帮助我们识别 ddos 攻击呢?`nginx plus status module` 提供了到后端服务器流量的详细统计,可以用来识别异常的流量。nginx plus 提供一个当前服务状态的仪表盘页面,同时也可以在自定义系统或其他第三方系统中通过 api 的方式获取这些统计信息,并根据历史趋势分析识别非正常的流量进而发出告警。

以上がNginx と Nginx Plus を使用して DDOS 攻撃に対抗する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。