Laravelのnginxのと悪質な要求を防ぐためにポリシーを制限します

まず、問題の背景

最近同社は、SMSや電子メールアラートの多数で、その結果、アプリケーションの応答タイムアウトの部分に影響を与え、最近は高すぎることが多いCPUサーバをカバーする複数の行だ、調査およびデータベースログのaccess.log後、APIインタフェースをブラッシングすることが判明した、悪質な狂気要求、120回/秒程度最大。

この地域にはないの前にあまりにも多くの経験、この問題は、どのような解決策や戦略レコードにさらされた後、それらを扱うことは非常に、ちょうどウェイクに言及し、この問題をスムーズにされていません。

展開ラインは次のようになりますnginxの+ laravel。

まず、我々はそれがもはやPHP-FPMプロセスに転送少ないメモリ消費量を、取り上げる、nginxのレベルからスタートしてみてください。
第二に、(悪質な)要求特徴

良い良い機能と同様に、効果的に悪質なリクエストを制御するには、この機能によって、特定の機能をキャプチャする必要があります。

短时间内,IP对某接口产生大量请求
user_agent,非正常信息或为空
请求量比平时要高涨很多。

第三に、制限ポリシー(nginxの)

要求の数を制限

まず、それは次のように構成された単一の時間のリクエスト数IPとIP接続を制御することです:

HTTP {
limit_req_zone $ binary_remote_addrゾーン= 1:1メートル率= 1R /秒;

server {
    location /api/ {
        limit_req zone=one burst=5;
    }
}

}

主制御limit_req_zone単一IP要求率、完全な制限を使用して、リーキーバケットアルゴリズム、limit_req_zoneサイズは、主にIP要求の統計情報を格納するために使用される、1M IP 16 000は、残りの場合、要求は毎秒16,000を超えた場合、保存することができますアクセスは、アクセス503サービスが一時的に利用できないでしょう。

上記のテンプレートが提供され、最大値はもはや毎秒つの要求よりも、最大遅延要求が5以下ではありません。

インターフェイスは、200ミリ秒、300ミリ秒であるたびに、私たちのサーバーの応答時間ならば、我々は制限することを毎秒を消費する1000ミリ秒/インタフェースの応答時間に応じて設定する必要があります。
同時接続数を制限

エンドユーザーは、周波数を制限する要求、または悪質な要求の多くがまだあるならば、我々はまた、同時の数を制限することができます。

HTTP {
limit_conn_zoneます$ binary_remote_addrゾーン= 1:1メートル。

server {
    location /api/ {
       limit_conn one 10;
    }
}

}

limit_conn_zone:主に同時要求の数を制御するのに使用される、周波数があまりにも速くすることはできません。

意味limit_req_zoneと一致limit_conn_zoneサイズ、動的制御は、上記の場合に、必要とされ得る、各クライアントIP制限は、同時接続10の最大数を表します。
IPブラックリストを設定します。

IP要求があまりにも頻繁に、または完全にIPアクセスのための必要性を排除するとブラックリストはnginxの設定を拒否して、IPアクセスを無効にすることができます。

HTTP {
blockip.confを含みます。
}

ブラックリストの設定

195.91.112.66を否定。
192.168.2.100を否定。

ブラックリストに追加された後、再び403禁止。そこに訪問する
イメージの
UA(ユーザーエージェント)の情報を制限します

HTTP {
サーバー{
するif($ HTTP_USER_AGENT〜* "カール"){
403を返します。
}
}
}

顧客カールエンドのために禁止UAで上記の情報は、ダイレクトリターン403。

遮断さ|により、複数のUAを禁止します。

もし($ HTTP_USER_AGENT〜* "カール| wgetの"){
403を返します。
}

(4個)、制限ポリシー(laravel)

当社laravelプロジェクトでは、スロットルミドルウェアがあり、ポリシーは次のように構成され、ユーザーが効果的に禁止悪意のあるリクエストすることができ、上記のアプリケーション層であることができます:

ルート::グループ([ 'ミドルウェア' => 'スロットル:30:1']、関数(){
ルート::いずれか( '/ログイン'、 'LoginController @ログイン');
});

分あたりの最大ログイン要求30をルーティングするスロットル構成、要求の数、第二のパラメータを制御するための最初のパラメータは、要求の周波数を制御するために使用され、それは上記の構成を示し、各クライアントIP。

限界を超えた腹腔ときにクライアント要求、サーバーは429のあまりにも多くの試みを返します。レスポンス

使用シーンは
最近、レポート照会システムの負荷分散クラスタの構成は、2つの実装は、セッション管理戦略のEhcacheのとRedisのをベースとしている、完成されています。

私たちは皆知っているサーバーのリソースが限られているが、クライアントの要求は、(悪意のある攻撃を排除していない)無制限で、ほとんどの正常な応答を確保するために要求を、クライアントの要求のいくつかをあきらめなければならなかった、私たちはnginxのを使用します。操作を制限し、この操作は、主に他の正常な要求は正常な反応であることをそうすることを、サーバー上の圧力を軽減することができます。

nginxのは、どのような単一のIPに毎秒50回のアクセスを制限するように、基本的な絞りを使用します。我々は一度設定、クライアントに503エラーを返しますよりも、nginxのは、モジュールを制限することによって、我々は、同時接続数を設定することができます。これは、CCの攻撃を防ぐのに非常に有効であることができます。iptablesファイアウォールと相まって、基本的にはCCの攻撃は無視されます。

使い方

confに設定

HTTP統一場の設定可能

リミット要求

limit_req_zone $ binary_remote_addr $ uriのゾーン= api_read:20メートル率= 50R /秒;

IPで構成された接続ゾーン

limit_conn_zoneする$ binary_remote_addrゾーン= perip_conn:10メートル;

ゾーンを接続することにより構成されたサーバ

ゾーン$ SERVER_NAME = perserver_conn limit_conn_zone:100メートル;
サーバー{
80聞く;
サーバー名report.52itstyle.com;
インデックスのlogin.jsp;
LOCATION / {
#要求は、デフォルトのキュー0制限することで、バースト
。limit_req =ゾーン= api_readバーストを5;
接続各IP 2に制限同時要求
limit_conn perip_conn 2、
コネクション#限定サービス(すなわち、サーバへの同時接続の数を制限する)
limit_conn perserver_conn 1000;
接続速度
limit_rate 100K;
proxy_pass HTTP://報告;
}
}
{報告アップストリーム
フェア;
SERVER = 172.16.1.120:8882重量= 2.1 max_fails fail_timeout = 30秒;
SERVER = 172.16.1.120:8881量が= 2.1 max_fails fail_timeout = 1930;
}
エラー503を構成
デフォルトでは、量が上限を超え、意志503エラー、ヒントを報告しました。

503サービスは一時的に使用できません

サーバーでは、一時的である。それは、メンテナンスのダウンタイムや容量の問題にあなたの要求によりサービスすることができません。してください試して再び後で。申し訳ありませんがため不便で。
してくださいレポートこのメッセージと米国に次の情報に含まれています。
ありがとうございました!
これは、ディスプレイと何も間違っているが、フレンドリーなことに、ここではカスタム503エラーが発生しています。

500 502 503 504 /50x.html error_page、
LOCATION = {/50x.html
ルートHTML;#50Xカスタムエラー
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

設定手順の
limit_conn_zone

容器は、各IPセッション状態記憶のために定義されています。この例では32バイト/セッションに応じて、それは3,200,000セッションを処理することができる、100Mコンテナを定義します。

limit_rate 300K;

各接続制限速度300kのために、ここではなく、IPの制限速度よりも、接続速度であることに注意してください。IPは、2つの同時接続を許可している場合、このIPは、レート制限limit_rate×2です。

バースト= 5。

これは、次のチェックポイントのREQ 5席を置くことと等価です。リクエストが超えた場合は制限速度が停止し、空の席に座るように頼んだ、などの行にされたチェックポイントが空の場合は、あなたが渡すことができます。でも座席が占有されている場合は、申し訳ありませんが、直接クライアントサーバーに返さ要求が応答を取得忙しいです。だから、request_rate 10000要求は、キューを待つことができることを、何の関係も、10000に設定して破裂しながらチェックポイントまたは5つの要求(亀スピード)の1秒リリース。しかし、また、常に、並ばないので、nginxのも、一定の時間をかけて、タイムアウト、ラインアップを設定するだけでなく、直接返され、サーバがビジー状態の応答を返します。

構成上nginxのは、以下のモジュールを必要とする:
ngx_http_limit_conn_module(静的)
ngx_http_limit_req_module(静的)

実行nginxの-Vがインストールされているかどうかを確認することができます。

概要
流量制限の目的は、悪質なリクエストを防ぐため、悪意のある攻撃やフローは、システムのピークを超えないようにすることです。

多くの実装がありますが、nginxのは、制限モジュールは一つだけの考えです。悪意のあるトラフィックの要求、または拒否nginxの悪質なIPに使用されるキャッシュ遮蔽層へのアクセスを制限します。

おすすめ

転載: www.cnblogs.com/djwhome/p/12543739.html