はじめに
最近Azure Application Gatewayを触る機会があったのでその時の備忘録として。
クライアント⇒Application Gateway⇒WEBサーバーという経路でリクエストを受けた場合、WEBサーバーに記録されるリクエストのIPアドレスはクライアントのものではなく、Application GatewayのIPアドレスになります。(当たり前ですが)
そのためWEBサーバー側でアクセスログを取っていたり、IPアドレス制限などの仕組みが実装されている場合は正しく動作しなくなるため、WEBサーバーに届くIPアドレスをクライアントのIPアドレスにする必要があります。
やったこと
X-Forwarded-Forの確認
まずリクエストのどこかにクライアントのIPアドレスが含まれていないとどうしようもありません。
そこでApplication Gatewayの仕様を調べたところちゃんとX-Forwarded-Forをサポートしていました。
X-Forwarded-For とは、HTTPヘッダフィールドの一つ。HTTPプロキシサーバまたは負荷分散装置を経由してウェブサーバに接続するクライアントの送信元IPアドレスを特定する際のデファクトスタンダードである。
上記の説明の通り、クライアントのIPアドレスがHTTPヘッダ内にあることがわかりました。
Apache Tomcatの設定
Tomcatを使用しているため以下の設定をserver.xmlに追記します。
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" />
この設定を入れることでX-Forwarded-Forの値でIPアドレスを書き換えてくれるようになります。
確認
設定完了と思って動作確認してみました。
すると記録されるIPアドレスが以下のような形式になっていました。
XXX.XXX.XXX.XXX:YYYY
どうやらApplication Gatewayのv1ではX-Forwarded-Forに設定される値は「クライアントIP:ポート番号」の形式で設定されるみたいです。
回避策を探す
調べてみたところApplication Gatewayをv2にすることで、カスタムヘッダの設定ができるようになり、ポート番号を含まない形式で値をセットできるみたいです。
v1からv2へ移行
以下に公式の手順がありますが、私は作り直しました。
Azure Application Gateway と Web アプリケーション ファイアウォールを v1 から v2 に移行する
カスタムヘッダーの設定
以下の公式ドキュメントを参考に設定を行います。
X-Forwarded-For ヘッダーからポート情報を削除する
以上です。