Apache/2.4.27を使用しています
VirtualHost内で、次のようにしてロードバランサーからリモートクライアントIPヘッダーを転送しています。
RemoteIPHeader X-Forwarded-For
これは、その仮想ホストによって提供されるアプリケーションに必要です。
これは、メインのhttpd.confコンテキスト内のログ形式です。
LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
VirtualIP内にRemoteIPHeader X-Forwarded-Forがリストされている場合、ApacheはリモートクライアントIPのログへの書き込みを停止します。
それをVirtualHostから削除すると、リモートクライアントIPがログ内に再び表示され始めます。
LogFormatのRemoteIPHeader X-Forwarded-For
が(%{X-Forwarded-For}i)
で機能しない理由はありますか?
よろしくお願いします!
Mod_remoteipを使用する場合は、%aをその形式に復元します。
Bugzillaでは、mod_remoteipは%aを埋め、%{X-Forwarded-For} iから削除します。したがって、信頼できるプロキシが1つある単純なケースでは、%aは、mod_remoteipにより、X-Forwarded-Forでの表示に使用される値を保持します。
プロキシレイヤー(Nginx)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
バックエンドレイヤー(Apache)
# Log format config
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
CustomLog "logs/access_log" common env=forwarded
# Header config
RemoteIPHeader X-Real-IP
RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 192.168.10.10 192.168.10.11
説明:
proxy_set_header-ディレクティブは、nginxがバックエンドに送信するヘッダーを設定します。この例では、ヘッダーに2つの変数を送信します:X-Forwarded-For
とX-Real-IP
X-Forwarded-For-プロキシ側では、このヘッダーがバックエンドに渡され、そのレイヤーからアクセスできるように設定する必要があります
X-Real-IP-Webページの必要な変数には影響しませんが、Apacheサーバーがクライアントのアドレスをログに記録できるように、有効にしたままにします(ログ形式も設定する必要があります)自体):
### X-Real-IP enabled
172.217.20.206 - - [03/Jun/2017:11:12:11 +0200] "GET /tls-check.php?9832 HTTP/1.0" 200 1409
### X-Real-IP disabled
172.16.21.11 - - [03/Jun/2017:15:12:49 +0200] "GET /tls-check.php?13266 HTTP/1.0" 200 1448
カール
:~$ curl -H Cache-Control: no-cache -ks https://example.com/tls-check.php?${RANDOM} | grep "HTTP_X_FORWARDED_FOR\|HTTP_X_REAL_IP\|SERVER_ADDR\|REMOTE_ADDR"
[HTTP_X_FORWARDED_FOR] => 172.217.20.206
[HTTP_X_REAL_IP] => 172.217.20.206
[SERVER_ADDR] => 192.168.10.100
[REMOTE_ADDR] => 192.168.10.10
tls_check.php
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
exit;
?>
これを、@ DaWe4444の正しい答えに対するコメントではなく、フォーマットを取得するための答えとして追加します。正しいのですが、最初はわかりませんでした。
わかりやすくするために、私の最終的な構成は次のようにまとめました:
RemoteIPHeader Client-ip
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy my.proxy.ip.address
これは、Debian上のApache 2.4.25のアップストリームであるApache Traffic Serverで機能します。
Apache2.confの結合されたログ形式の行を次のように変更する必要がありました。
-LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
+LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
一部のレシピでは、X-Forwarded-Forヘッダーに基づいてログ形式を切り替える必要がありますが、mod_remoteipはそのヘッダーの設定を解除するため、それらはmod_remoteipでは機能しません。 %hはDNSルックアップコストを負担するため(%aは単なるクライアントIPです)、それがデフォルトであることに驚いていました。昔、クエリでDNSを無効にすることは、すべてのApache管理者が最初に行うことの1つでした。ログファイルアナライザーがその部分を処理します。
\" \"
で囲んでみてください。RefererヘッダーとUser-Agentヘッダーで行うのと同じです。
LogFormat "%h \"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined