🎧

さくらのエンハンスド LBでのクライアントIP取得とApacheログフォーマット設定

に公開

はじめに

さくらのクラウドのエンハンスドロードバランサ(エンハンスドLB)では、前段にCDNなどがある構成でリクエストヘッダーにX-Forwarded-Forがすでにセットされている場合、独自仕様でX-Original-Forに書き換えます
そのため、Apacheのアクセスログで正しいクライアントIPを記録するには、ログフォーマットの調整が必要になります

この記事では、
デフォルトのApacheログフォーマットの解説
X-Original-Forヘッダーをログに出す方法
複数の経由IPをまとめてログに表示する設定例
を紹介します

1. Apacheのデフォルトログフォーマットの解説

Apacheの代表的なログフォーマットにcombinedがあります
これは以下のように定義されています

# /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
項目 説明
%h クライアントのIPアドレス
%l リモートログ名(通常は-)
%u 認証ユーザー名(未使用の場合は-)
%t リクエスト受信時刻
%r リクエスト行(例:GET / HTTP/1.1)
%>s ステータスコード
%b レスポンスのバイト数
%{Referer}i Refererヘッダー
%{User-Agent}i User-Agentヘッダー

この設定では%hの値が「クライアントIP」としてログに出ますが、ロードバランサー経由だと実際のクライアントIPは記録されません
ちなみにcombinedは定義したログフォーマットのニックネーム的なもの(フォーマット名)で自由に名前をつけることができます

2. X-Original-Forをログに出す方法

さくらのエンハンスドLBは、X-Forwarded-ForをX-Original-Forに書き換えます
そのため、Apacheのログに実クライアントIPを記録するには、X-Original-Forヘッダーをログフォーマットに追加します

例えば、次のように設定します

# /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Original-For}i\"" test1

このtest1フォーマットを使うように、CustomLog設定を変更します

CustomLog /var/log/httpd/access.log test1

実際にcurlコマンドを使って、X-Original-Forヘッダーを付与してApacheにリクエストを送ってみました
(本来はエンハンスドLB経由で確認するべきですが、今回は簡易的にcurlで検証しています)

% curl -H "X-Original-For: 123.456.789.123" http://example.com

このリクエストを送ると、Apacheのアクセスログには以下のように記録されました
ログの最後に、"123.456.789.123"とX-Original-Forの値が出力されています

#アクセスログ
xxx.xxx.xxx.xxx - - [10/Aug/2025:07:00:06 +0000] "GET / HTTP/1.1" 200 4 "-" "curl/8.7.1" "123.456.789.123"

3. 経由したIPを全部表示するには

X-Original-Forだけでなく、X-Forwarded-Forも併せてログに出すと経路が追いやすくなります

# /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Original-For}i %{X-Forwarded-For}i\"" test2

このtest2フォーマットを使うように、CustomLog設定を変更します

CustomLog /var/log/httpd/access.log test2

curlコマンドを使って、X-Original-ForとX-Forwarded-For両方を付与してみると、

% curl -H "X-Original-For: 123.456.789.123" -H "X-Forwarded-For: 456.789.123.456" http://example.com

以下のようにログに両方の出力が記録されました
ここでは、123.456.789.123がX-Original-For、456.789.123.456がX-Forwarded-Forに対応しています

#アクセスログ
xxx.xxx.xxx.xxx - - [10/Aug/2025:07:05:45 +0000] "GET / HTTP/1.1" 200 4 "-" "curl/8.7.1" "123.456.789.123 456.789.123.456"

まとめ

  • さくらのエンハンスドLBはX-Forwarded-ForをX-Original-Forに書き換える仕様があるため、
    Apacheログに実クライアントIPを残すには%{X-Original-For}iをログフォーマットに追加する必要があります
  • 複数の経由IPを追いたい場合は、X-Original-ForとX-Forwarded-For両方をログに出すと便利です

Discussion