Я использую 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;
Попробуй. Интересно узнать, работает ли это. Если у вас есть клиенты, которые не переведены, это нарушит работу.
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-адреса заранее или использовать другое решение, описанное выше.
Есть веская причина для указания 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 здесь .