Я использую Apache/2.4.27
Внутри VirtualHost я пересылаю IP-заголовок удаленного клиента от Loadbalancer с:
RemoteIPHeader X-Forwarded-For
Что необходимо приложению, обслуживаемому этим Virtualhost.
Это формат журнала в основном контексте httpd.conf.
LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Когда у меня в списке RemoteIPHeader X-Forwarded-For для виртуального хоста, Apache перестает записывать IP удаленного клиента в логи.
Когда я удаляю его из VirtualHost, IP удаленного клиента снова начинает появляться в логах.
Есть идеи, почему RemoteIPHeader X-Forwarded-For
не играет с (%{X-Forwarded-For}i)
из LogFormat?
Спасибо!
Восстановить% a в этом формате если вы собираетесь использовать mod_remoteip.
В bugzilla, mod_remoteip заполняет%, пока он удаляется из% {X-Forwarded-For} i. Так что в простом случае с одним доверенный прокси,% a будет содержать значение, используемое для просмотра в X-Forwarded-For из-за mod_remoteip
Proxy Layer (Nginx)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
Backend Layer (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 отправляет на backend; поэтому в этом примере мы отправляем две переменные (в заголовки): X-Forwarded-For
и X-Real-IP
X-Forwarded-For - на стороне прокси это должно быть установлено, что этот заголовок должен передаваться на серверы и быть доступным с их уровня
X-Real-IP - он не влияет на требуемые переменные на веб-странице, но мы оставляем его включенным, чтобы сервер 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
:~$ 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;
?>
Попробуйте заключить его между \ "\"
так же, как это делается с заголовками Referer и User-Agent
LogFormat "%h \"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Я добавляю это как ответ, чтобы получить форматирование,вместо комментария к правильному ответу @ DaWe4444. Хотя это правильно, я сначала не понял этого.
Чтобы пояснить, моя последняя конфигурация закончилась как:
RemoteIPHeader Client-ip
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy my.proxy.ip.address
, которая работает для восходящего сервера трафика Apache на Apache 2.4.25 на Debian.
Мне нужно было изменить строку объединенного формата журнала в 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; Эту часть обрабатывают анализаторы файлов журнала.