ALB経由でHTTPヘッダーの追加・書き換えを確認してみた

最終更新日付: 2020年10月22日

AWSのELB(ロードバランサ)の中で、ALB(アプリケーションロードバランサ)を使用すると、ALB前後でHTTPヘッダーが書き換えられたり(変化)・追加(付与)されたりします。

例えば、その影響でALB経由でのProxyサーバー構成が構築できなかったりするので、具体的にどういう事か検証し確認していましました。

環境・前提条件

User → ALB → EC2

  • AWS ALB
  • ALBのバックエンドにEC2(Linux+apache+php)サーバーを構築しHTTPヘッダーを出力するページ(test.php)用意
  • User側のブラウザツールとしてPostmanを使用

環境を作り、ALBの前後でHTTPヘッダーがどう変化・付与されるか確認してみました。

結論、ALBはHTTPリクエストヘッダーの追加だけじゃなく書き換えもある!

  • HTTP Request(書換えられました!まさかの)
  • X-Forwarded-For(追加されました。ユーザーのソースIPアドレス)
  • X-Forwarded-Proto(追加されました)
  • X-Forwarded-Port(追加されました)
  • X-Amzn-Trace-Id(追加されました)
  • Connection(無くなりました)

今回は特により詳しく確認したかったため「仮に上記検証環境のEC2がProxyサーバーだったら?」というイメージで、Userのブラウザ(Postman)に「ALB DNS名」 or「 EC2 パブリックIPアドレス」をProxy設定してHTTPヘッダーの出力を確認してみました。

厳密にはALBを経由するとHTTP Requestが書き換わることがわかりました。
そのため、EC2 Proxyサーバーの冗長構成でフロントにALBを利用することが出来ないんですね(Proxyサーバーの場合はNLBを利用しましょう)。

以下、今回の結論を導いた検証結果情報になります。

ALB前のリクエストヘッダー相当

実際に、UserとALB間のHTTPリクエストヘッダーを調査しようとすると、パケットキャプチャーとか仕掛けなければならなくなり大変なので、相当する情報として、Userが直接EC2に接続しに行った場合のHTTPリクエストヘッダーをまず調べました。

Userが以下の設定でALBにアクセスしに行ったときの、EC2が受け取ったHTTPリクエストヘッダーの出力です。

  • UserのProxy設定に「EC2 パブリックIPアドレス」を設定
  • UserのURL Requestは「適当なURLのhttp://a.b.c/test.php」

EC2側の出力としましては、

HTTP Request Headers

HTTP RequestGET http://a.b.c/test.php HTTP/1.1
User-AgentPostmanRuntime/7.26.5
Accept*/*
Cache-Controlno-cache
Postman-Token603b2c7e-03e6-4db3-94e3-9cdb919a26d1
Hosta.b.c
Accept-Encodinggzip, deflate, br
Connectionkeep-alive

HTTP Response Headers

Upgradeh2,h2c
ConnectionUpgrade
X-Powered-ByPHP/5.4.16

HTTPレスポンスヘッダーは厳密には、phpの下のapacheが付加するHTTPレスポンスヘッダーも追加で存在します。

上記が、apacheも加わったユーザー側に返るHTTPレスポンスヘッダーです。apacheのバージョン情報とかもオンされていますね。

ALB後のHTTPリクエストヘッダー

同じUserから今度は、同じHTTPリクエストへッダーを、User→ALBになげ、ALB→EC2でEC2が受け取ったHTTPリクエストヘッダーを確認しました。

Userが以下の設定でALBにアクセスしに行ったときの、EC2が受け取ったHTTPリクエストヘッダーの出力です。

  • UserのProxy設定に「ALB DNS名」を設定
  • UserのURL Requestは「適当なURLのhttp://a.b.c/test.php」

EC2側の出力としましては、

HTTP Request Headers

HTTP RequestGET /test.php HTTP/1.1
X-Forwarded-For183.86.*.*
X-Forwarded-Protohttp
X-Forwarded-Port80
Hosta.b.c
X-Amzn-Trace-IdRoot=1-5f75d5d3-780ad3c84bfe37a27706631f
User-AgentPostmanRuntime/7.26.5
Accept*/*
Cache-Controlno-cache
Postman-Token8e9ff610-b111-4e21-9818-6dd0dc2ada1b
Accept-Encodinggzip, deflate, br

「Connection: keep-alive」HTTPヘッダーも無くなっていますね。

HTTP Response Headers

Upgradeh2,h2c
ConnectionUpgrade
X-Powered-ByPHP/5.4.16

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です