間接的アクセスの送信元アドレスを X-Forwarded-For で記録する
クライアントから LB や CDN、Reverse Proxy などを介さず、直接、サーバへアクセスする場合、サーバのログには「クライアントの送信元 IP アドレス」が記録されます。しかし、クライアントとサーバの間に LB や CDN、Reverse Proxy を介している場合、サーバから見た送信元 IP アドレスは「LB などのアドレス」に見えてしまいます。 これではサーバ側で正確な送信元を把握出来ない為、LB などで X-Forwarded-For というヘッダにオリジナルの送信元 IP アドレスを挿入します。 サーバは X-Forwarded-For が存在する場合、このヘッダを読み取ることで「本来の正確な送信元 IP アドレス」を理解することが出来ます。 今回は Apache のログに X-Forwarded-For を追加して記録する設定方法をメモしておきます。
検証環境¶
対象 | バージョン |
---|---|
Amazon Linux | release 2023.6.20250218 |
Apache | 2.4.62 |
Apache のログ設定¶
今回の検証対象である Amazon Linux 2023 では、Apache の設定ファイルは /etc/httpd/conf/httpd.conf
にあります。 ログに出力する項目は mod_log_config の LogFormat ディレクティブで設定します。 デフォルトでは以下になっていました。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
直接アクセスの場合 (X-Forwarded-For を利用しない場合)¶
クライアントから直接、サーバへアクセスします。
構成¶
Logromat ディレクティブ¶
デフォルトのままです。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
ログ出力例¶
192.0.2.111 - - [07/Mar/2025:09:48:26 +0000] "GET / HTTP/1.1" 200 2867 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
間接アクセスの場合 (X-Forwarded-For を利用する場合)¶
Logformat ディレクティブの設定に %{X-Forwarded-For}i
を追加します。 この状態でクライアントから間接的にサーバへアクセスします。
構成¶
クライアント / サーバを CDN と記載していますが、LB や Reverse Proxy でも基本的な考え方は同じです。
Logromat ディレクティブ¶
<IfModule log_config_module>
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
ログ出力例¶
ログ出力に X-Forwarded-For ヘッダの内容が追加されています。 もし X-Forwarded-For ヘッダが存在しない場合、最初の部分が空になります (エラーになるわけではありません)。
192.0.2.222 192.0.2.111 - - [07/Mar/2025:09:48:26 +0000] "GET / HTTP/1.1" 200 2867 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"