Регистрация исходного IP-адреса запрашивающей стороны вместо пересылать IP-адрес прокси-сервера для определенных HTTP-запросов (журналы nginx)

Я использую nginx в качестве обратного прокси перед нашим веб-сервером приложения (gunicorn; это приложение Django). Большинство пользователей, обращающихся к этому веб-приложению, фактически маршрутизируются через прокси-сервер .

Поскольку запросы проходят через серверы прямого прокси, IP-адрес в этих случаях всегда исходит от прокси-серверов, а не от исходного запрашивающего. Я хочу исправить эту ситуацию.

Все запросы, исходящие от прямого прокси, содержат заголовок через: proxy . В таких запросах исходный IP-адрес запрашивающего отправляется в отдельном поле заголовка HTTP с именем X-IORG-FBS-UIP (а также X-FORWARDED-FOR ).

My вопрос в том, как я могу настроить nginx так, чтобы он определял, имеет ли запрос заголовок via: proxy , и если да, то регистрировал исходный IP-адрес запрашивающей стороны из X-IORG-FBS-UIP ] заголовок? Наглядный пример был бы отличным; заранее спасибо! У меня nginx версии 1.4.6


. Обратите внимание, что у меня нет диапазонов IP-адресов, используемых прокси-сервером прямого доступа. Если бы я это сделал, одним из способов решения этой проблемы была бы настройка etc / nginx / conf.d / proxies_acl.conf с:

set_real_ip_from 1.2.3.0/22;
set_real_ip_from 23.22.20.0/22;
real_ip_header X-IORG-FBS-UIP;
1
задан 22 April 2017 в 02:59
2 ответа

Попробуй. Интересно узнать, работает ли это. Если у вас есть клиенты, которые не переведены, это нарушит работу.

set_real_ip_from 0.0.0.0/0;
real_ip_header X-IORG-FBS-UIP;

Вышеуказанные операторы set_real_ip_from и real_ip_header являются стандартным способом сделать это. Единственная разница между вашей ситуацией и тем, что есть у большинства людей, заключается в том, что вы не знаете IP-адреса прокси. 0.0.0.0/0 означает «каждый IP-адрес», поэтому в приведенных выше операторах говорится «для каждого запроса получать IP-адрес клиента для журналов из заголовка X-IORG-FBS-UIP». Мое предположение состоит в том, что если этот заголовок не существует, он будет использовать фактический IP.

В большинстве случаев вы можете получить IP-адреса прокси. AWS, CloudFlare и т. Д. Почему вы не знаете IP-адреса своих прокси?

Я также отмечаю, что вы задали почти идентичный вопрос пару месяцев назад и приняли ответ. Если кто-то не отвечает на ваш вопрос, не помечайте его как ответ.

Запрошенный альтернативный метод - НЕ РАБОТАЕТ

Вы запросили альтернативный метод, основанный на наличии заголовка via: proxy. Я не верю, что это возможно. Я написал это

if ($http_X_via:proxy) {
  set_real_ip_from $remote_addr;
  real_ip_header X-IORG-FBS-UIP;
}

, но это не удается. Nginx сообщает, что set_real_ip_from не может заходить внутрь блока if. Это означает, что вам нужно знать свои IP-адреса заранее или использовать другое решение, описанное выше.

3
ответ дан 3 December 2019 в 18:30

Есть веская причина для указания IP-адреса прокси. Кто угодно может отправлять заголовки прокси на ваш сервер, при этом «реальный ip» установлен на произвольный IP-адрес, открывая потенциальные дыры в безопасности, если вы полагаетесь на адрес, переданный в этих заголовках. Вот почему модуль real_ip настроен так, чтобы вы указали доверенные прокси-серверы.

Если ваша цель - просто зарегистрировать предполагаемый реальный IP-адрес nginx, вам не нужно изменить IP запрашивающего. Вам нужно только зарегистрировать то, что находится в заголовках X-IORG-FBS-UIP и X-FORWARDED-FOR . Как описано здесь , вы можете настроить регистратор nginx для захвата X-FORWARDED-FOR следующим образом:

add the following line in your general nginx.conf in the http {} section.

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

Я думаю добавить вторую директиву регистратора для X-IORG-FBS-UIP позволит вам обрабатывать и то, и другое. Подробнее о настройке регистратора nginx здесь .

0
ответ дан 3 December 2019 в 18:30

Теги

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