ALBのX-Forwarded-Forオプションの挙動を見てみる

記事タイトルとURLをコピーする

IE課で研修中の前田(青)です。今回はALBのX-Forwarded-Forオプションの動作を実際に見ていきたいと思います。

X-Forwarded-Forとは?

X-Forwarded-For(以降、XFFと記載)とは、HTTPヘッダのフィールドの一つです。使用することで、クライアントのIPアドレスをWebサーバへ知らせることが出来ます。
Webサーバに記録される送信元IPアドレスは、HTTPリクエストが経由してきたプロキシやロードバランサーなど中継地点のIPアドレスになり、クライアントIPアドレスを知ることが出来ません。
しかし、中継地点でXFFフィールドをHTTPリクエストに追加するようにすることで、クライアントIPアドレスをWebサーバへ知らせることが可能になります。



ALBにもXFFフィールド関連のオプションがあります。下記の画像のように「付加」、「保持」、「削除」の3つのオプションがあります。

詳細な説明はAWS公式ブログ に分かりやすく記載されていますが、それぞれのオプションは下記のような動作をします。

付加…XFFフィールドをHTTPリクエストに追加し、配下のEC2へ転送します。デフォルトではこの設定が有効になっています。
保持…HTTPリクエストに特に何もせず、配下のEC2へ転送します。
削除…HTTPリクエストのXFFフィールドを削除します。


検証環境の説明

今回は下記のような環境を構築しました。
XFFオプションの「保持」を選択した場合の挙動を分かりやすくするため、プロキシの役割を担うEC2も構築しています。


検証方法・結果

①ALBのXFFオプションを設定します。

②WebサーバEC2にてtcpdumpコマンドを実行し、パケットをキャプチャしておきます。

③クライアントEC2にてcurlコマンドを実行し、ALBのドメインに向けてプロキシサーバを経由してHTTPリクエストを送信します。

④②でキャプチャしておいたパケットをWiresharkで見てみます。

1.XFFオプション「付加」の場合

ALBがHTTPリクエストにXFFフィールドを付加します。そのためクライアントEC2とプロキシEC2のIPアドレスが記録されています。


2.XFFオプション「保持」の場合

ALBがHTTPリクエストの中身を保持し、XFFフィールドを追加しません。
プロキシEC2通過時点のXFFフィールドがそのままWebサーバに転送されたため、クライアントEC2のIPアドレスのみが記録されています。


3.XFFオプション「削除」の場合

ALBがHTTPリクエストのXFFフィールドを削除します。そのため、XFFフィールド自体が存在しません。


おまけ

「クライアントポートの保持」を有効にする場合

ALBには下記画像のように「クライアントポートの保持」という設定があります。 これを有効にした場合はどうなるのでしょうか?

XFFフィールドに、プロキシEC2からALBへのHTTPリクエストに使用された送信元ポート番号が記載されました。


XFFオプションを有効化しても、リクエスト発信源となるクライアントIPが分かるとは限らない

下図のようにプロキシでXFF設定を無効化すればALBで「付加」を選択しても記録されるのはプロキシのIPのみとなります。
そのため、ALBのXFFオプションを有効化しても必ずリクエスト発信源のクライアントIPがALB配下へ通知できるとは限りません。


プロキシEC2のsuqid設定ファイルにて、XFFフィールドを削除するように設定


ALBのXFFオプションは「付加」にしていたが、WebサーバEC2に届いたHTTPリクエストにはプロキシEC2のみが記録されている。

感想

XFFについては概念として理解していましたが、実際に中身を見てみて実感することが出来ました。 私と同じように、XFFの動作を実際に見てみたいという方の一助になれば幸いです。

前田 青秀(執筆記事の一覧)

2023年2月入社 技術4課

AWS資格12冠

ジムに通い始めましたが、なるべく楽してマッチョになりたい…