Apache не регистрирует удаленный IP при наличии RemoteIPHeader X-Forwarded-For

Я использую 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?

Спасибо!

2
задан 14 December 2017 в 17:14
5 ответов

Восстановить% a в этом формате если вы собираетесь использовать mod_remoteip.

В bugzilla, mod_remoteip заполняет%, пока он удаляется из% {X-Forwarded-For} i. Так что в простом случае с одним доверенный прокси,% a будет содержать значение, используемое для просмотра в X-Forwarded-For из-за mod_remoteip

3
ответ дан 3 December 2019 в 09:15

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;

?>
3
ответ дан 3 December 2019 в 09:15

Попробуйте заключить его между \ "\" так же, как это делается с заголовками Referer и User-Agent

LogFormat "%h \"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
0
ответ дан 3 December 2019 в 09:15

Я добавляю это как ответ, чтобы получить форматирование,вместо комментария к правильному ответу @ 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; Эту часть обрабатывают анализаторы файлов журнала.

0
ответ дан 3 December 2019 в 09:15

У меня работает. Заменил %h на %a

LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
1
ответ дан 22 May 2020 в 06:49

Теги

Похожие вопросы