Skip to content

間接的アクセスの送信元アドレスを 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_configLogFormat ディレクティブで設定します。 デフォルトでは以下になっていました。

<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 を利用しない場合)

クライアントから直接、サーバへアクセスします。

構成

file

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 でも基本的な考え方は同じです。

file

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"