nginx が複数のプロキシ層を通過して実際の送信元 IP を取得するプロセスの詳細な説明

nginx が複数のプロキシ層を通過して実際の送信元 IP を取得するプロセスの詳細な説明

質問

Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には $http_X_Forwarded_For はユーザーの実際の IP アドレスであり、$remote_addr はプロキシの上位層のアドレスにすぎません。

解決:

httpモジュールに追加

set_real_ip_from 172.17.10.125; #上位プロキシ IP アドレス real_ip_header X-Forwarded-For;
real_ip_recursive オン;

追加後、nginx を起動してエラーを報告します。

nginx: [emerg] /home/lnidmp/nginx/conf/nginx.conf:26 に不明なディレクティブ「set_real_ip_from」があります

realipモジュールを追加してnginxを再コンパイルする必要がある

1. /usr/local/nginx-1.15.12に移動します

2. ./configure --prefix=/usr/cmcc/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module

3. インストールする

親切なヒント:

1. set_real_ip_fromは、信頼できるプロキシからの実際のユーザーIPを受け入れることを意味します

2. real_ip_headerは受信したメッセージのhttpヘッダーを参照し、前のプロキシから送信されたユーザーIPを取得します。

3. real_ip_recursive: ユーザーの IP が取得されるまで再帰的に除外するかどうか (デフォルトはオフ)

まず、real_ip_header は http ヘッダー名を指定します。デフォルトは X-Real-Ip です。デフォルト値が使用されていると仮定すると、nginx はメッセージを受信した後に http ヘッダー X-Real-Ip をチェックします。

(1)IPがある場合、送信者のIPがset_real_ip_fromで指定された信頼できるIPリストに含まれているかどうかを確認します。信頼されている場合、X-Real-Ip の IP 値はフロント プロキシによって通知されたユーザーの実際の IP 値であると判断され、その値が独自の $remote_addr 変数に割り当てられます。信頼されていない場合は処理されず、$remote_addr は送信者の IP アドレスのままになります。

(2)X-Real-Ipに複数のIP値がある場合、例えば、前のプロキシは次のように設定されます:proxy_set_header X-Real-Ip $proxy_add_x_forwarded_for;

取得されるのは IP の文字列なので、real_ip_recursive の値が重要になります。 Nginx は、set_real_ip_from の信頼リスト内の IP を IP リストの右から左に比較します。

real_ip_recursive がオフの場合、右端の IP が信頼できる IP であると判明すると、次の IP (右から 2 番目) がユーザーの実際の IP であると見なされます。

real_ip_recursive がオンの場合、信頼できない IP アドレスが見つかるまで、IP アドレスは右から左に比較されます。

次に、IP 値も $remote_addr にコピーします。

本番環境の nginx 構成ファイルは次のとおりです。

ユーザー www;
ワーカープロセス 10;
ワーカー_rlimit_nofile 51200;

#error_log ログ/error.log;
#error_log ログ/error.log 通知;
#error_log ログ/error.log 情報;
error_log /data/logs/nginx_error.log クリット;

#pid ログ/nginx.pid;


イベント {
 epoll を使用します。
 ワーカー接続数 51200;
}

http {
 mime.types を含めます。
 デフォルトタイプ アプリケーション/オクテットストリーム;

 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 # '$status $body_bytes_sent "$http_referer" '
 # '"$http_user_agent" "$http_x_forwarded_for"';

 #access_log ログ/access.log メイン;

 サーバー名ハッシュバケットサイズ 128;
 server_tokens オフ;
 1時間で期限切れになります。
 sendfile オフ; 
 tcp_nopush オン;
 fastcgi_connect_timeout 1200秒;
 fastcgi_send_timeout 1200秒;
 fastcgi_read_timeout 1200秒;
 fastcgi_buffer_size 128k;
 fastcgi_buffers 8 128k;#8 128
 fastcgi_busy_buffers_size 256k;
 fastcgi_temp_file_write_size 256k;
 キープアライブタイムアウト65;
 tcp_nodelay オン;
 エラーページ 404 /; 
 gzip オン;
 gzip_min_length 2048;
 gzip_バッファ 4 16k;
 gzip_http_バージョン1.1;
 gzip_types text/plain css html application/xml application/x-javascript ;

 上位プロキシ IP アドレスから set_real_ip_from;
 real_ip_recursive オン;
 real_ip_header X-Forwarded-For;

 log_format アクセス '$remote_addr - $remote_user [$time_local] "$request" '
       '$status $body_bytes_sent "$http_referer" '
       '"$http_user_agent" $http_x_forwarded_for';
##################### 含む ##############################################

conf.d/*.conf をインクルードします。
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx プロキシ転送構成を通じてクロスドメイン API プロキシ転送を実装する方法
  • Goを使用してNginxプロキシを追加する方法の詳細な説明
  • 内部 IP アクセスのみを許可する Nginx プロキシ設定を追加する方法
  • Nginx プロキシ パス設定からプレフィックスを削除する実装
  • オペレーターが知っておくべき 18 個の Nginx プロキシ キャッシュ構成のヒント (どれを知っていますか?)
  • Nginx リバース プロキシでセッション永続性を実装する 2 つの方法の詳細な説明
  • nginxリバースプロキシのマルチポートマッピングの実装
  • nginx を介して方向プロキシを実装するプロセスの図

<<:  vue.js を使用してドラッグ アンド ドロップ機能を実装する方法

>>:  更新SQL文に基づくMySQLロックの理解

推薦する

Windows での MySQL インストール チュートリアル (画像とテキスト付き)

MySQL インストール手順 MySQL は、スウェーデンの MySQL AB によって開発された...

MySQLの実行プロセスとシーケンスについての簡単な説明

目次1:mysql実行プロセス1.1: コネクタ1.2: キャッシュ1.3: アナライザー1.4: ...

MySQLが2つのテーブルを関連付ける際のエンコードの問題と解決策

Mysqlが2つのテーブルを関連付けると、次のエラーメッセージが生成されます:照合順序の不正な組み合...

MySQL UNION演算子の基本知識ポイント

MySQL UNION 演算子このチュートリアルでは、MySQL UNION 演算子の構文と例を紹介...

Ubuntu の MySQL のパラメータ ファイル my.cnf の詳細な分析

序文MySQL に関する私の理解に基づくと、パフォーマンスの最適化作業やマスター スレーブ レプリケ...

MySQLのさまざまなオブジェクトのサイズと長さの制限について話しましょう

目次識別子の長さ制限権限テーブルの範囲フィールドの長さ制限データベースとテーブルの数の制限テーブルサ...

Linux touch コマンドの使用例

Linux touch コマンドの詳細な説明: 1. コマンド機能:ファイルまたはディレクトリの作成...

OpenShift のクイックインストールの詳細な手順

OpenShift 3.9 の最新バージョンを体験する最も早い方法。準備 [root@host ~]...

読み込み進捗バーのネイティブ JS 実装

この記事では、ネイティブ JS によって実装された動的読み込みプログレス バーの特殊効果を紹介します...

Dockerで最もよく使われるイメージコマンドとコンテナコマンドの詳細な説明

この記事では、Docker の使用で最もよく使用されるイメージ コマンドとコンテナ コマンドを一覧表...

IE をフリーズさせる HTML コード

任意のテキスト エディターを開き、次のコードをコピーして、たとえば SomeFilename.htm...

CentOS はローカル yum ソースを使用して LAMP 環境を構築するグラフィック チュートリアル

この記事では、ローカル yum ソースを使用して CentOS 上に LAMP 環境を構築する方法に...

MySQLクエリ条件におけるonとwhereの配置の違いの分析

導入今日SQLを書いているときに、問題が発生しました。要件は、データを照会し、スコアと過去 1 週間...

Win10でIIS10を構成し、ASPプログラムのデバッグをサポートする手順

マイクロソフトIIS (Internet Information Server) は、Microso...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...