4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure Application GatewayからくるIPアドレスをクライアントのIPアドレスにする【Apache Tomcat】

Posted at

はじめに

最近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に追記します。

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アドレスを書き換えてくれるようになります。

Class RemoteIpValve

確認

設定完了と思って動作確認してみました。
すると記録される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 ヘッダーからポート情報を削除する

以上です。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?