こんにちは、Ryohei(@ityryohei)です!

本記事では、AWSのロードバランサー経由のアクセスに対してX-Forwarded-Forを設定してもクライアントIPアドレスが取れない場合の対処法をご紹介しています。

LogFormatにX-Forwarded-Forを設定してもクライアントIPアドレスが取れないな…。どうすればいんだろう?

上記の疑問にお答えします。

では、解説していきます。

ロードバランサー経由のアクセスについて

ロードバランサーを経由してインスタンスにアクセスすると、ログにはロードバランサーのIPアドレスが記録されます。アクセスの経路としては「クライアント」→「ロードバランサー」→「インスタンス」となります。インスタンスに記録されるログのIPアドレスは、手前のロードバランサーのIPアドレスとなってしまうため、デフォルトの状態ではクライアントのIPアドレスを取ることはできません。

クライアントのIPアドレスを取るためには

とりあえずAWSのナレッジセンターに解決方法がないか検索します。キーワードは「ELB IPアドレス」として検索したところ、下記の記事がヒットしました。

参考:https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-capture-client-ip-addresses/

解決したい内容がそのままナレッジセンターに投稿されていました。対応内容も設定ファイルを少し修正するだけで済むため、工数をかけずに対応できそうです。

これならいけそうな気がする!

私が検証した環境は下記の通りです。

OSAmazon Linux 2018.03
WebサーバーApache2.4

WebサーバーはApacheのため、Apacheの設定例を参考に設定ファイルを修正します。

LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

設定ファイルを修正後、下記コマンドを実行して設定を反映。

sudo /etc/init.d/httpd reload

反映完了後、再度稼働しているサイトにアクセスしてログを確認したところ……

ロードバランサーのIPアドレスが記録されていました。設定ファイルの内容とナレッジセンターの投稿内容を何度も見直しましたが、修正内容に間違いはありません。

他に追加で設定が必要なのだろうと思い、しばらくネットの海をさまよったところ、海外の記事に解決方法がありました。

接続元IPを取るにはRemoteIPHeaderの設定が必要

クライアントIPアドレスを取るためには、RemoteIPHeaderの設定が必要とのこと。

RemoteIPHeaderについてはこちらをご参照いただければと思いますが、対象のモジュールがインストールされていれば、設定ファイルに一行追加すればクライアントIPアドレスが取れるみたい。ものは試しということで、設定ファイルに追記してみました、

RemoteIPHeader X-Forwarded-For
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

更新した設定ファイルをサーバーに反映して、再びサイトにアクセスしてログを確認したところ……

きちんとクライアントのIPアドレスが記録されていました!無事に解決してほっとしました。

ちなみにLogFormatは下記の記述でも問題ないようですので、わかりやすい方を採用してくださいね。

RemoteIPHeader X-Forwarded-For
LogFormat "%a %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

最後に

AWSで困ったときはナレッジセンターを見るようにしていますが、インターネット上で活動しているクラウドエンジニアの方はレベルも高くて参考になる記事が多いですね。最近は海外の記事でも翻訳機能を使って手軽に見ることができるようになったので、英語サイト検索用のプロファイルを作るもの悪くないもしれませんね。

以上、AWSのELB経由のアクセスに対してX-Forwarded-Forを設定してもクライアントIPアドレスが取れない場合の対処法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。