Nginx の realip モジュールの使い方の基礎学習

Nginx の realip モジュールの使い方の基礎学習

序文

nginx モジュールには、公式とサードパーティの 2 種類があります。nginx のインストール情報を表示するには、コマンド nginx -V を使用し、--with nginx 起動時の読み込みに関する次のモジュール情報を確認できます。

realipモジュール

目的:ローカル Nginx がリバース プロキシ バックエンドにある場合、ユーザーの実際の IP アドレスを取得できます。

使用方法: realip 関数では、Nginx が ngx_http_realip_module モジュールを追加する必要がありますが、これはデフォルトではコンパイルされません。追加する必要がある場合は、コンパイル時に --with-http_realip_module オプションを追加して有効にしてください。

リアリップスコープ

set_real_ip_from、real_ip_header、real_ip_recursive はすべて、http、サーバー、およびロケーション ゾーン構成で使用できます。

いくつかの realip パラメータの説明

  • set_real_ip_from: リバースプロキシサーバーを設定します。つまり、サーバーのIPを信頼します。
  • real_ip_header X-Forwarded-For: ユーザーの実際の IP アドレスは、X-Forwarded-For リクエスト ヘッダーにあります。
  • リアルIP再帰:
    • off: real_ip_headerで指定されたHTTPヘッダーの最後のIPが実際のIPとして使用されます。
    • on: real_ip_headerで指定されたHTTPヘッダーの最後のIPが信頼されたサーバーではない場合、実際のIPとして扱われます。

http ヘッダーの X-Forwarded-For、X-Real-IP、およびリモート アドレスの説明

X-Forwarded-For は HTTP リクエスト ヘッダーにあり、HTTP リクエストの終了時の実際の IP アドレスを示すために使用される HTTP の拡張ヘッダーです。

形式は次のとおりです。

X-Forwarded-For: クライアント、プロキシ1、プロキシ2

Nginx プロキシは通常、次のように構成されます。

proxy_set_header ホスト $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

説明する:

  • X-Forwarded-For: Nginx が追加しますが、先頭部分は nginx が受信したリクエスト ヘッダーから取得されるため、この部分はあまり信頼できません。 IP 形式に準拠したもののみを使用できます。そうでない場合、XSS または SQL インジェクションの脆弱性が発生しやすくなります。
  • リモート アドレス: HTTP プロトコルには IP の概念がありません。リモート アドレスは TCP 接続から取得され、サーバーとの TCP 接続を確立するデバイスの IP を示します。したがって、リモート アドレスを偽造することはできません。
  • X-Real-IP: HTTP プロキシは、TCP 接続を確立するデバイスの IP アドレスを示すために使用されます。このデバイスは、別のプロキシの場合もあれば、実際の要求側の場合もあります。

Realip関数の例

以下に簡単なアーキテクチャ図を示します。

仮定1:

1. Nginx が realip モジュールを使用しない場合、2 番目の Nginx の X-Forwarded-For リクエストは 1.1.1.1 ですが、remote_addr アドレスは 2.2.2.2 です。このとき、アプリケーション サービスは X-Forwarded-For フィールドを通じてユーザーの実際の IP を取得できます。ただし、ここにはリスクがあります。中間に複数の層のリバース プロキシ サービスがある場合、一意のユーザーの実際の IP を取得することは不可能になります。

2. Nginx が realip モジュールを使用し、次のように設定されている場合、Nginx は X-Forwarded-For の最後の IP (2.2.2.2) を実際の IP として取得します。最後に、アプリケーション サービスによって取得されるアドレスも 2.2.2.2 ですが、実はこれはユーザーの IP ではありません。

2.2.2.2 から実際の IP を設定します。
2.2.2.3 から set_real_ip_from; 
real_ip_header X-Forwarded-For; 
real_ip_recursive をオフ;

3. Nginx が realip モジュールを使用し、次のように設定されている場合、2.2.2.2 は信頼できるサーバー IP であるため、Nginx は前方検索を続行し、1.1.1.1 が信頼できるサーバー IP ではないことを検出すると、それを実際の IP と見なします。しかし、実際には 1.1.1.1 はユーザーの IP です。最後に、アプリケーション サービスはユーザーの固有の実際の IP も取得します。

2.2.2.2 から実際の IP を設定します。
2.2.2.3 から set_real_ip_from; 
real_ip_header X-Forwarded-For; 
real_ip_recursive オン;

要約する

Nginx 基礎学習における realip モジュールの使用に関するこの記事はこれで終わりです。Nginx realip モジュールの使用に関する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx レベルで基本的なユーザー認証を構成する手順を完了します。
  • Nginxの基本についての簡単な紹介
  • Nginx の基本 - Gzip 設定ガイド
  • Nginx サーバーの基本的なセキュリティ構成といくつかのセキュリティのヒント
  • nginxの基本設定の説明
  • nginxの基礎を学ぶ

<<:  mysql-8.0.19-winx64 をインストールしてログインするための初心者向けチュートリアル (初心者必読)

>>:  JavaScript 関数呼び出し、適用、バインド メソッドのケース スタディ

推薦する

Nginx 設定ファイルの詳細な説明と最適化の提案ガイド

目次1. 概要2. nginx.conf 1) 設定ファイルの場所2) ワーカープロセス3) イベン...

divとspanの違いと使い方

目次1. DIVとSPANの違いと特徴2. スパンタグの概要3. 拡大と改善4. 凡例の効果の実証例...

大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション

MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...

MySQL はリレーショナルデータベースですか?

MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...

Reactはグローバル箇条書きボックスメソッドをカプセル化します

この記事の例では、Reactカプセル化グローバルポップアップボックスの具体的なコードを参考までに共有...

JavaScript エラー処理 try..catch...finally + は throw+TypeError+RangeError をカバーします

目次1. 目的2. 文法3. 練習する1. 目的通常、エラーが発生すると、スクリプトは直ちに停止し、...

JavaScript で H5 ゴールド コイン関数を実装する (サンプル コード)

今日は春節の金貨の赤い封筒のアクティビティを作りました。なかなか良い出来だと思います。皆さんと共有し...

MySQL コピーテーブルと許可分析の 3 つの実装方法

テーブルを素早くコピーする方法まず、テーブル db1.t を作成し、1000 行のデータを挿入します...

JavaScript Three.js でテキストを作成する最初の経験

目次効果テキストの作成を開始するまずフォントローダーを作成するフォントライブラリを読み込むテキストジ...

MySQLの遅いクエリ問題の詳細な分析データ送信

例を通して、MySQL のデータ テーブル送信のクエリが遅い問題の解決策を共有しました。最近、コード...

Vue の長いリストをすばやく読み込む方法

目次背景メインコンテンツ1. コンポーネントの比較2. 実装のアイデア3. キーメソッドソースコード...

複数の条件を持つ MySQL クエリ メソッド

複数の条件を持つ MySQL クエリ環境: MySQL 5.7 where ステートメントに複数の ...

Dockerfile を使用して SpringBoot プロジェクトをデプロイする方法

1. SpringBoootプロジェクトを作成し、jarパッケージにパッケージ化する2. Linux...

Dockerに証明書を追加する方法

1. アップグレードプロセス: sudo apt-get updateパッケージが見つからない、パッ...

HTML タグのカスタム属性に関する質問

以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...