さくらのエンハンスド 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