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の動作を実際に見てみたいという方の一助になれば幸いです。