nginxフロー制御とアクセス制御の実装

nginxフロー制御とアクセス制御の実装

nginx トラフィック制御

レート制限は非常に便利ですが、Nginx では誤解され、誤って設定されることが多い機能です。これを使用して、ユーザーが特定の時間内に実行できる HTTP リクエストの数を制限できます。リクエストは、単純な Web サイトのホームページに対する GET リクエスト、またはログイン フォームに対する POST リクエストになります。レート制限は、ブルートフォースによるパスワードクラッキングの速度を遅くするなど、セキュリティ目的で使用できます。また、受信リクエストのレートを実際のユーザーの標準的な値に制限し、ターゲット URL アドレスを(ログ経由で)識別することで、DDOS 攻撃から保護するためにも使用できます。より一般的には、この機能は、多数の同時ユーザー要求によって上流のアプリケーション サーバーが過負荷になるのを防ぐために使用されます。

以下では、Nginx のトラフィック制限の基本と高度な設定を紹介します。「トラフィック制限」は Nginx Plus にも適用されます。

1. Nginxのフローを制限する方法

Nginx の「フロー制限」は、帯域幅が制限されている緊急事態に対処するために通信およびパケット交換コンピュータ ネットワークで広く使用されているリーキー バケット アルゴリズムを使用します。それは、口からは水が流れ出ているが、底からは水が漏れているバケツのようなものです。バケツから水が注がれる速度がバケツの底から水が漏れる速度よりも速い場合、バケツの水は溢れます。同様に、リクエスト処理の観点では、水はクライアントからのリクエストを表し、バケツは「先入れ先出しスケジューリング アルゴリズム」(FIFO) に従って処理を待機しているリクエストのキューを表します。バケツの底から漏れる水は、バッファから出てサーバーによって処理されるリクエストを表し、バケツから溢れる水は、破棄されて処理されないリクエストを表します。

2. 基本的な電流制限を設定する

「トラフィック制限」設定には、以下に示すように、 limit_req_zonelimit_reqという 2 つの主要なディレクティブがあります。

192.168.62.155 の設定:
limit_req_zone $binary_remote_addr ゾーン=mylimit:10m レート=1r/s;
アップストリーム myweb {
    サーバー 192.168.62.157:80 重み=1 max_fails=1 fail_timeout=1;
    }
サーバー{
    聞く 80;
    server_name ローカルホスト;

    場所 /ログイン {
        制限要求ゾーン=mylimit;
        proxy_pass http://myweb;
        proxy_set_header ホスト $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
192.168.62.157 の設定:
サーバー{
    聞く 80;
    server_name ローカルホスト;
    場所 /ログイン {
        ルート /usr/share/nginx/html;
        インデックス index.html index.html;
        }
}


2回クリックした後

limit_req_zoneディレクティブはレート制限に関連するパラメータを定義しますが、 limit_reqディレクティブは、それが出現するコンテキスト (この場合は、「/login/」へのすべてのリクエスト) でレート制限を有効にします。

limit_req_zoneディレクティブは通常、HTTP ブロックで定義され、複数のコンテキストで使用できます。次の 3 つのパラメータが必要です。

  • キー - 適用される制限を定義するリクエスト属性。この例の Nginx 変数$binary_remote_addrには、クライアント IP アドレスのバイナリ形式が格納されます。つまり、それぞれの IP アドレスを、3 番目のパラメータで設定された要求レートに制限できるということです。 (この変数は、クライアント IP アドレス$remote_addrの文字列形式よりもスペースをあまり取らないために使用されます)
  • ゾーン - 各 IP アドレスのステータスと、制限されている要求された URL へのアクセス頻度を保存するために使用される共有メモリ ゾーンを定義します。共有メモリ領域に保存された情報は、Nginx ワーカー プロセス間で共有されることを目的としています。定義は、 zone=keywordで識別されるゾーンの名前と、コロンとそれに続くゾーン サイズの 2 つの部分で構成されます。 16,000 個の IP アドレスの状態情報には約 1 MB が必要なので、この例の領域には 160,000 個の IP アドレスを格納できます。
  • レート - 最大リクエスト レートを定義します。この例では、レートは 1 秒あたり 1 リクエストを超えることはできません。 Nginx は実際にはミリ秒単位の精度でリクエストを追跡するため、レート制限は 1000 ミリ秒ごとに 1 つのリクエストに相当します。 「バースト」は許可されていないため (次のセクションを参照)、前のリクエストから 1000 ミリ秒以内に到着したリクエストは拒否されます。

limit_req_zoneディレクティブは、共有メモリ ゾーンのトラフィック制限とパラメータを設定しますが、実際には要求レートを制限するものではありません。だから追加する必要がある

limit_reqディレクティブは、特定のlocationまたはserverブロックにトラフィック制限を適用します。上記の例では、 /login/リクエストのフローを制限します。

各 IP アドレスは、1 秒あたり/login/へのリクエストを 1 回に制限されるようになりました。より正確には、前回のリクエストから 1000 ミリ秒以内にその URL をリクエストすることはできません。

3. 緊急事態への対応

1000 ミリ秒以内に 2 つのリクエストを受信した場合はどうなりますか? 2 番目のリクエストでは、Nginx はクライアントにエラーを返します。アプリケーションは本質的にバースト的になる傾向があるため、これは望ましいことではないかもしれません。代わりに、余分なリクエストをバッファリングして、タイムリーに処理したいと考えています。設定を更新し、 limit_reqburstパラメータを使用しましょう。

limit_req_zone $binary_remote_addr ゾーン=mylimit:10m レート=10r/s;
    アップストリーム myweb {
        サーバー 192.168.62.157:80 重み=1 max_fails=1 fail_timeout=1;
        }
       
    サーバー{
        聞く 80;
        server_name ローカルホスト;
        場所 /ログイン {
            limit_req ゾーン=mylimit バースト=20;
            proxy_pass http://myweb;
            proxy_set_header ホスト $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

burstパラメータは、ゾーンで指定されたレートを超えてクライアントが実行できるリクエストの数を定義します (例のmylimitゾーンでは、レートは 1 秒あたり 10 リクエスト、つまり 100 ミリ秒ごとに 1 リクエストに制限されます)。前のリクエストから 100 ミリ秒以内に到着したリクエストはキューに配置され、キューのサイズは 20 に設定されます。

つまり、特定の IP アドレスから 21 件のリクエストが送信された場合、Nginx は最初のリクエストをすぐに上流サーバー ファームに送信し、残りの 20 件のリクエストをキューに配置します。次に、キューに入れられたリクエストを 100 ミリ秒ごとに転送し、着信リクエストによってキューに入れられたリクエストの数が 20 を超えた場合にのみ、Nginx はクライアントにエラーを返します。

4. フロー制御関連の機能を設定する

1. ログを設定する

デフォルトでは、Nginx はレート制限により遅延またはドロップされたリクエストを以下のようにログに記録します。

2019/02/13 04:20:00 [エラー] 120315#0: *32086 リクエストを制限中、超過: ゾーン「mylimit」による 1.000、クライアント: 192.168.1.2、サーバー: nginx.com、リクエスト: 「GET / HTTP/1.0」、ホスト: 「nginx.com」

ログエントリに含まれるフィールド:

  • 制限されたリクエスト - ログエントリが「制限された」リクエスト用であることを示します
  • 超過 - 対応する「レート制限」設定を超えるミリ秒あたりのリクエスト数
  • ゾーン - 「フロー制限」が実装されるゾーンを定義します
  • client - リクエストを行ったクライアントの IP アドレス
  • サーバー - サーバーのIPアドレスまたはホスト名
  • リクエスト - クライアントによって開始された実際の HTTP リクエスト
  • ホスト - HTTP ヘッダー内のホストの値

デフォルトでは、Nginx は上記の例の[error]に示すように、拒否されたリクエストをerrorレベルでログに記録します (Nginx は遅延されたリクエストをより低いレベル、通常はinfoレベルでログに記録します)。 Nginx のログ レベルを変更するには、 limit_req_log_levelディレクティブを使用します。ここでは、拒否されたリクエストのログレベルをwarnに設定します。

ログの場所とレベルを必ず定義してください。

limit_req_zone $binary_remote_addr ゾーン=mylimit:10m レート=1r/s;
    アップストリーム myweb {
        サーバー 192.168.62.157:80 重み=1 max_fails=1 fail_timeout=1;
        }
    サーバー{
        聞く 80;
        server_name ローカルホスト;

        場所 /ログイン {
            limit_req ゾーン=mylimit バースト=20;
            limit_req_log_level 警告;
            proxy_pass http://myweb;
            proxy_set_header ホスト $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

テストにアクセスし続けてerror.logログを確認します

2. クライアントに送信されたエラーコード

通常、クライアントが設定されたトラフィック制限を超えると、Nginx はステータス コード 503 (サービスが一時的に利用できません) で応答します。 limit_req_statusディレクティブを使用して、他のステータス コード (以下の 404 ステータス コードなど) に設定できます。

limit_req_zone $binary_remote_addr ゾーン=mylimit:10m レート=10r/s;
	アップストリーム myweb {
    	サーバー 192.168.62.157:80 重み=1 max_fails=1 fail_timeout=1;
		}
	サーバー{
    	聞く 80;
    	server_name ローカルホスト;
		
    	場所 /ログイン {
			制限要求ゾーン=mylimit;
			limit_req_log_level 警告;
			制限要求ステータス 404;
        	proxy_pass http://myweb;
          proxy_set_header ホスト $host:$server_port;
	      	proxy_set_header X-Real-IP $remote_addr;
      		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        	}
	}


5. nginxトラフィック制御の概要

ここでは、HTTP リクエストのさまざまな場所に対するリクエスト レートの設定や、「レート制限」のburstパラメータの構成など、Nginx および Nginx Plus によって提供される「レート制限」機能の多くの機能を説明しました。

nginx アクセス制御

1. nginx アクセス制御モジュール

(1)IPベースのアクセス制御:http_access_module
(2)ユーザーの信頼に基づくログイン:http_auth_basic_module

2. IPベースのアクセス制御

1. 設定構文

構文: allow address | CIDR | unix: | all;
デフォルト: いいえ デフォルトのコンテキスト: http、server、location

構文: deny address | CIDR | unix: | all;
デフォルト: いいえ デフォルトのコンテキスト: http、server、location

2. /etc/nginx/conf.d/access_mod.confの内容を次のように変更します。

サーバー{
    聞く 80;
    server_name ローカルホスト;
    場所 ~ ^/admin {
        ルート /home/www/html;
        インデックス index.html index.hml;
        192.168.1.8 を拒否します。
        すべて許可する。
        #192.168.1.8 を拒否します。
        }
}
#注記:
最初にアクセスを許可した場合は、アクセスを拒否する方法を定義します。その場合、アクセス拒否は効果がありません。

仮想マシンのホスト IP は192.168.1.8 、仮想マシン IP は192.168.1.11であるため、ホストマシンはここへのアクセスが禁止され、他のすべての IP はアクセスが許可されます。
ホストマシンはhttp://192.168.1.11/adminにアクセスし、 403 Forbiddenを表示します。
もちろん、逆の設定も可能で、 allow 192.168.1.0/24;などの IP セグメント設定方法も使用できます。これは、このセグメントを満たすすべての IP がアクセスできることを意味します。

3. すべてのリクエストを拒否する場所を指定する

特定の URL アドレスへのリクエストのレートを制限するのではなく、すべてのリクエストを拒否したい場合は、 locationブロックでdeny all ディレクティブを設定します。

サーバー{
    聞く 80;
    server_name ローカルホスト;
    場所 /foo.html {
        ルート /home/www/html;
        すべてを否定する;
        }
}

3. ユーザーの信頼に基づいたログイン

1. 設定構文

構文: auth_basic string | off;
デフォルト:auth_basic オフ;
コンテキスト: http、サーバー、場所、limit_except

構文: auth_basic_user_file ファイル;
デフォルト: コンテキストなし デフォルトでは: http、server、location、limit_except
ファイル: ユーザー名とパスワード情報を保存するファイル。

2. 設定例

access_mod.conf名前をauth_mod.confに変更します。内容は次のようになります。

サーバー{
	聞く 80;
	server_name ローカルホスト;
	場所 ~ ^/admin {
		ルート /home/www/html;
		インデックス index.html index.hml;
		auth_basic "認証アクセステスト!";
		auth_basic_user_file /etc/nginx/auth_conf;
		}
}

auth_basic offはなく、ログイン検証機能が有効になっており、 auth_basic_user_fileアカウントとパスワード ファイルを読み込みます。

3. パスワードファイルを作成する

[root@192 ~]# mkdir /home/www/html/admin -p
[root@192 ~]# vim /home/www/html/admin
こんにちはqf
[root@192 ~]# yum install -y httpd-tools #htpasswd はオープンソースの http サーバー apache httpd のコマンド ツールで、http 基本認証のパスワード ファイルを生成するために使用されます [root@192 ~]# htpasswd -cm /etc/nginx/auth_conf user10 // 初めて新しいユーザーを作成します [root@192 ~]# htpasswd -m /etc/nginx/auth_conf user20 // 2 回目にユーザーを追加します [root@192 ~]# cat /etc/nginx/auth_conf
ユーザー10:$apr1$MOa9UVqF$RlYRMk7eprViEpNtDV0n40
ユーザー20:$apr1$biHJhW03$xboNUJgHME6yDd17gkQNb0

4. アクセステスト

5. 制限事項

(1)ユーザー情報はファイルに依存している (2)機械的な操作と管理のため効率が悪い

nginx フロー制御とアクセス制御の実装に関するこの記事はこれで終わりです。より関連性の高い nginx フロー制御とアクセス制御のコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nginx イングレス プロキシ Websocket トラフィックを構成する方法
  • nginx サーバーの IP とトラフィック統計を取得する Python 実装例
  • トラフィック攻撃を防ぐためのNginx設定の詳細な説明
  • Nginx 構成統計フロー帯域幅要求とリアルタイム要求ステータス記録方法
  • Nginx トラフィックコピー ngx_http_mirror_module モジュールの使用方法の詳細な説明

<<:  MySQL はどのようにしてデータの整合性を確保するのでしょうか?

>>:  Vue.jsでタブ切り替えと色変更操作を実装する解説

推薦する

JavaScript コンソールのその他の機能

目次概要コンソールログコンソール.infoコンソール.警告コンソールエラーコンソールテーブルコンソー...

JavaScriptのURLオブジェクトとは何かについて話しましょう

目次概要ハッシュプロパティホストプロパティホスト名属性Href属性起源のプロパティユーザー名とパスワ...

MySQLの半同期の詳細な説明

目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...

MySQL 数値型オーバーフローの処理方法

さて、質問させてください。MySQL で列を int(0) に設定すると何が起こりますか?この問題を...

Dockerのインストール方法とDockerの4つのネットワークモードの詳細説明

1. Dockerをインストールするyum -y install docker-ioインストールが完...

モバイル Web アプリ上の画像が鮮明ではなく、非常にぼやけているのはなぜですか?

なぜ?最も簡単に言えば、ピクセルは均等ではないということです。携帯電話に表示される写真はとても繊細に...

Mysqlリモート接続構成を実装する2つの方法

Mysqlリモート接続構成を実装する2つの方法会社で働いていると、誰かのコンピュータに保存されている...

タグ li はブロックレベル要素ですか?

なぜ高さを設定できるのでしょうか。<h1 /> などの要素とは異なり、「セミインライン」...

Linuxコマンドのファイル上書きとファイル追加の詳細な説明

1. コマンド > と >> の違いコマンド>: ファイルが存在する場合は、...

Nginx を使用して IP アドレスが悪意を持って解決されるのを防ぐ方法

Nginxを使用する目的Alibaba Cloud ECS クラウド サーバーを使用して、まずは著者...

CSSフロートの特性についての簡単な説明

この記事では、CSS フロートの特徴を紹介します。皆さんと共有し、自分用のメモとして残したいと思いま...

HTML のインラインブロックの空白を素早く削除する 5 つの方法

inline-block プロパティ値は、「インライン」要素のマージンとパディングを制御する必要があ...

MySQL で JSON 形式のフィールドをクエリする詳細な説明

作業開発プロセス中に、顧客の名前、携帯電話番号、ID カード、およびドキュメントの種類を動的に保存す...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

Zabbix ベースの Jenkins プロセス監視の詳細な説明

1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...