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ロックの理解

推薦する

HTML テーブルタグチュートリアル (27): セルの背景画像属性 BACKGROUND

セルの背景画像を設定でき、任意の GIF または JPEG 画像ファイルを使用できます。基本的な構文...

JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明

目次1. JavaScript がシングルスレッドなのはなぜですか? 2. タスクキュー3. イベン...

MySQL kill コマンドの使用ガイド

KILL [接続 | クエリ] processlist_id MySQL では、各接続は個別のスレ...

MySQL 8 の新機能: 非表示のインデックス

背景インデックスは諸刃の剣です。クエリ速度は向上しますが、DML 操作も遅くなります。結局のところ、...

Docker での環境変数の使用とよくある問題の解決策

序文Docker はコンテナの環境変数を設定できます。設定方法は 2 つあります。イメージを作成する...

vue-routeルーティング管理のインストールと設定方法

導入Vue Router 、 Vue.jsの公式ルーティング マネージャーです。 Vue.jsのコア...

Linux でユーザーにルート権限を追加する方法の概要

1. ユーザーを追加します。まず、adduser コマンドを使用して共通ユーザーを追加します。コマン...

CSSに基づいてマウス入力の方向を決定する

以前、フロントエンド技術グループに所属していたとき、グループのメンバーが面接中に問題に遭遇したと言っ...

MySQL を使用して Excel でデータ生成を完了する方法

Excel は、データ分析に最もよく使用されるツールです。この記事では、MySQL と Excel ...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

js で下線とキャメルケースの変換を実装する (複数の方法)

目次適用シナリオ:方法 1: 正規表現 (推奨)方法2: 配列のreduceメソッドを使用する方法3...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

Linux の netstat コマンドの詳細な紹介

目次1. はじめに2. 出力情報の説明3. netstatの共通パラメータ4. netstatネット...

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...

あなたを救うために、私のテーブルは何を使えばいいでしょうか (Haiyu Blog)

テーブルはかつて、Web ページの開発、つまりレイアウトにおいて非常に重要な役割を果たしていました。...