本日は、OpenResty Edge のもう一つの機能をご紹介いたします:リクエストがサードパーティのプロキシを経由する場合に、OpenResty Edge から真のクライアント IP アドレスを取得する方法です。

ほとんどの場合、リクエストがサードパーティのプロキシを経由すると、OpenResty Edge が受信するクライアントアドレスはプロキシサーバーのアドレスになります。

Embeded image

時には、条件判断、リクエスト頻度制限、ログ記録などのシナリオで使用するために、真のクライアント IP アドレスを取得する必要があります。

Embeded image

グローバル設定で「信頼できる実 IP 設定元」と「実 IP ヘッダー」を設定する

OpenResty Edge の Admin Web コンソールに入りましょう。これは私たちのコンソールのサンプルデプロイメントです。各ユーザーは自身のローカルデプロイメントを持っています。

スクリーンショット

まず、「Global Config」ページに移動します。

スクリーンショット

ここでは複数の設定を行う必要があります。

スクリーンショット

最初に Trusted hosts to set real IP を設定します。

Screenshot

Trusted hosts to set real IP は、Real IP header の設定を許可する IP アドレスのリストです。リクエストが信頼されていないホストからの場合、Real IP header は無視されます。

IP アドレス 52.53.251.226 を入力します。

Screenshot

次に、プロキシの真の IP を含むリクエストヘッダーを指定する必要があります。通常、これは X_Forwarded_For です。

スクリーンショット

リクエストヘッダーに複数の IP アドレスが存在する場合、システムはリスト内の最後の IP アドレスを採用します。

埋め込み画像

保存します。

Screenshot

この新しい変更をプッシュするために、リリースする必要があります。

スクリーンショット

このボタンをクリックします。

スクリーンショット

リリースします!

スクリーンショット

変更が全てのゲートウェイサーバーに同期されました。これで、先ほどの変更が全てのゲートウェイクラスターとサーバーにプッシュされました。

埋め込み動画

埋め込み動画

埋め込み動画

私たちの設定変更は、サーバーのリロード、再起動、またはバイナリアップグレードを必要としません。そのため、非常に効率的でスケーラブルです。

埋め込み画像

クライアントアドレスを出力するようにアプリケーションを設定する

次に、クライアントアドレスを出力できるようにアプリケーションを設定します。

スクリーンショット

以前のサンプルアプリケーション、test-edge.com を引き続き使用できます。

スクリーンショット

そのアプリケーションに入ります。

スクリーンショット

「Page Rules」ページに移動します。

スクリーンショット

すでにページルールが 1 つ定義されています。このページルールは、特定のアップストリームへのリバースプロキシを設定しています。

スクリーンショット

クライアントアドレスを出力するために、EdgeLang を使用してページルールを作成します。EdgeLang については、専用のビデオで紹介しています。

スクリーンショット

「Edit」ボタンをクリックします。

Screenshot

条件を真に設定し、以下の部分がどのような状況でも実行されるようにします。

スクリーンショット

クライアントアドレスを出力します。

スクリーンショット

保存します。

スクリーンショット

いつものように、この新しい変更をプッシュするためにリリースする必要があります。

スクリーンショット

このボタンをクリックします。

スクリーンショット

リリースします!

スクリーンショット

変更が全てのゲートウェイサーバーに同期されました。

スクリーンショット

OpenResty Edge で受信したクライアントアドレスを検証する

ゲートウェイサーバーにリクエストを送信し、OpenResty Edge で受信したクライアントアドレスを検証します。

プロキシとして使用するために、アメリカにあるリモートサーバーにターミナルからログインします。

スクリーンショット

curl コマンドラインツールを使用して HTTP リクエストを送信します。

curl http://test-edge.com/

Screenshot

出力されたクライアントアドレスがプロキシのアドレスであることがわかります。

スクリーンショット

次に、真のクライアントアドレスを含む X-Forwarded-For ヘッダーを持つ HTTP リクエストを送信します。

curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40"

Screenshot

出力されたクライアントアドレスが真のアドレス(104.28.243.40)であることがわかります。

スクリーンショット

次に、X-Forwarded-For ヘッダーに複数の IP アドレスが含まれている場合を見てみましょう。

curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40, 105.56.18.52"

Screenshot

ヘッダーの最後の IP アドレスが出力されていることがわかります。

スクリーンショット

このサーバーからログアウトします。

スクリーンショット

信頼されたホストリストにない別のサーバーにログインします。

スクリーンショット

同様に X-Forwarded-For ヘッダーを持つリクエストを送信します。

curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40"

Screenshot

出力されたクライアントアドレスがプロキシのアドレスであることがわかります。

Screenshot

真の IP は、クライアント IP に関連するすべてのことに影響を与えます。

いくつかの例を見てみましょう。Client cityClient address が影響を受けます。

Limit request rate アクションも影響を受けます。

Screenshot

ただし、HTTPS リクエストの SSL または TLS ハンドシェイクレートを制限する機能は影響を受けません。なぜなら、ハンドシェイクプロセス中にクライアントアドレスの書き換えが行われないためです。

Screenshot

OpenResty Edge について

OpenResty Edge は、マイクロサービスと分散トラフィックアーキテクチャ向けに設計された多機能ゲートウェイソフトウェアで、当社が独自に開発しました。トラフィック管理、プライベート CDN 構築、API ゲートウェイ、セキュリティ保護などの機能を統合し、現代のアプリケーションの構築、管理、保護を容易にします。OpenResty Edge は業界をリードする性能と拡張性を持ち、高並発・高負荷シナリオの厳しい要求を満たすことができます。K8s などのコンテナアプリケーショントラフィックのスケジューリングをサポートし、大量のドメイン名を管理できるため、大規模ウェブサイトや複雑なアプリケーションのニーズを容易に満たすことができます。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!