web-dev-qa-db-ja.com

RemoteIPHeader X-Forwarded-Forが存在する場合、ApacheはremoteIPをログに記録しません

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)で機能しない理由はありますか?

よろしくお願いします!

2
DaWe4444

Mod_remoteipを使用する場合は、%aをその形式に復元します。

Bugzillaでは、mod_remoteipは%aを埋め、%{X-Forwarded-For} iから削除します。したがって、信頼できるプロキシが1つある単純なケースでは、%aは、mod_remoteipにより、X-Forwarded-Forでの表示に使用される値を保持します。

3
DaWe4444

プロキシレイヤー(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-ForX-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;

?>
3
trimstray

これを、@ 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つでした。ログファイルアナライザーがその部分を処理します。

0
Bill McGonigle

\" \"で囲んでみてください。RefererヘッダーとUser-Agentヘッダーで行うのと同じです。

LogFormat "%h \"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
0
ezra-s