【AWS/ELB】X-Forwarded-Forを設定してもクライアントIPアドレスが取れない
※本ページのリンクにはプロモーションが含まれています。
こんにちは、Ryohei(@ityryohei)です!
本記事では、AWSのロードバランサー経由のアクセスに対してX-Forwarded-Forを設定してもクライアントIPアドレスが取れない場合の対処法をご紹介しています。
LogFormatにX-Forwarded-Forを設定してもクライアントIPアドレスが取れないな…。どうすればいんだろう?
上記の疑問にお答えします。
では、解説していきます。ロードバランサー経由のアクセスについて
ロードバランサーを経由してインスタンスにアクセスすると、ログにはロードバランサーのIPアドレスが記録されます。アクセスの経路としては「クライアント」→「ロードバランサー」→「インスタンス」となります。インスタンスに記録されるログのIPアドレスは、手前のロードバランサーのIPアドレスとなってしまうため、デフォルトの状態ではクライアントのIPアドレスを取ることはできません。
クライアントのIPアドレスを取るためには
とりあえずAWSのナレッジセンターに解決方法がないか検索します。キーワードは「ELB IPアドレス」として検索したところ、下記の記事がヒットしました。
解決したい内容がそのままナレッジセンターに投稿されていました。対応内容も設定ファイルを少し修正するだけで済むため、工数をかけずに対応できそうです。
これならいけそうな気がする!
私が検証した環境は下記の通りです。
OS | Amazon 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アドレスが取れない場合の対処法のご紹介でした!