TomcatのServletでクライアントIPを取得すると 127.0.0.1 になる現象

TomcatのServletでクライアントIPを取得するために HttpServletRequest の getRemoteAddr() メソッドを使っているのですが、取得するIPがいつも 127.0.0.1 となってしまうので調べてみました。環境は以下の構成です。NginxとTomcatは相乗りです。

ServletでのクライアントIP取得のソースコードです。


//IPアドレスの取得
String ip = request.getHeader("X-FORWARDED-FOR");
if ( ip == null || "".equals(ip) )
	ip = request.getRemoteAddr();
if ( ip == null )
	ip = "0.0.0.0";

このロジックだと request.getRemoteAddr(); がいつも 127.0.0.1 になってしまいます。ループバックアドレスなので自身のIPアドレスとなっているようです。つまり、TomcatからみたクライアントはNginxとなっています。

これを解消するにはNginx側の設定ファイルに proxy_set_header ディレクティブの追加が必要だとわかりました。以下のようにします。


location / {
	 :
	proxy_set_header X-Forwarded-for $remote_addr;
	proxy_pass http://localhost:8080/test/;
	 :
}

Nginxはデフォルトでは X-Forwarded-For ヘッダを付けてくれないので、付加する設定がいるようです。Servlet側でも request.getHeader("X-FORWARDED-FOR"); の処理を入れておく必要があります。こうするとクライアントIPの取得ができました。

X-Forwarded-For ヘッダはプロキシサーバーを通過した際に、送信元IPアドレスを特定するために使われます。HTTPヘッダには以下のような形で付与されます。

X-Forwarded-For: <client>, <proxy1>, <proxy2>

リクエストが複数のプロキシサーバーを通過する場合、それぞれの通過するプロキシサーバーのIPアドレスが右側に付け足されていきます。つまり、左端のIPアドレスが元のクライアントのIPアドレスになります。

なお、1つ手前のプロキシサーバー(一番最後に経由したプロキシサーバー)のIPアドレスは X-Forwarded-For ヘッダには記載されないので そのIPアドレスを取得するには request.getRemoteAddr() メソッドで取得します。

コメントを残す

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