Назад | Перейти на главную страницу

nginx с real_ip - регистрирует удаленный адрес клиента и адрес прокси

У меня есть экземпляр nginx, настроенный за несколькими прокси-серверами балансировки нагрузки, и я использую real_ip чтобы получить IP-адрес клиентов в remote_addr для обработки моим приложением Python.

Однако в своих журналах я хотел бы записать прокси-сервер, который действительно сделал запрос, но $remote_addr теперь перезаписан, и я не могу найти ничего, что говорило бы о том, что была сделана его копия.

Как я смогу это сделать?

Ваши настройки могли измениться с тех пор, как вы разместили этот вопрос, но у меня была та же проблема, и, наконец, доступно решение. Я размещу его здесь на случай, если Google привлечет на эту страницу кого-нибудь еще.

Как указывает @Michael Hampton ♦ в своем ответ к моя собственная версия этого вопроса, nginx добавил переменную $realip_remote_addr к Модуль Real_IP. Он содержит исходное значение $remote_addr, что позволяет вам использовать / регистрировать как исходный IP-адрес клиента, так и IP-адрес сервера, который отправил фактический запрос в nginx. Это было добавлено в версию 1.9.7 в ноябре 2015 года.

Не понимаю, хотите ли вы войти на стороне nginx или внутри своего приложения>

Для стороны nginx вы можете использовать $ http_x_forwarded_for в определении nginx log_format, примерно так:

log_format  main  '$remote_addr - $remote_user [$time_local] [$msec] [$request_time] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

Сам модуль не поддерживает этого. Однако обратные прокси (для которых в основном используется real_ip) могут предоставлять поле заголовка HTTP, содержащее IP-адрес прокси.

К сожалению, вы не можете проверить, был ли адрес переписан или нет, поэтому клиент, не подключающийся через прокси-сервер с поддержкой real_ip, может подделать поле заголовка.

Проверьте документ своего прокси, возможно, вы можете использовать поле заголовка HTTP для IP-адреса.