Я использую nginx как обратный прокси-сервер перед нашим веб-сервером приложения (gunicorn; это приложение Django). Большинство пользователей, запускающих это веб-приложение, фактически проходят через прямой прокси.
Поскольку запросы проходят через серверы прямого прокси, IP-адрес в этих случаях всегда поступает от прокси-серверов, а не от исходного отправителя. Я хочу исправить эту ситуацию.
Все запросы, исходящие от прямого прокси, содержат заголовок via:proxy
. В таких запросах исходный IP-адрес запрашивающего отправляется в отдельном поле заголовка HTTP, которое называется X-IORG-FBS-UIP
(а также X-FORWARDED-FOR
).
Мой вопрос: как настроить nginx, чтобы он определял, есть ли в запросе via:proxy
заголовок, и если да, регистрирует исходный IP-адрес запрашивающей стороны из X-IORG-FBS-UIP
заголовок? Наглядный пример был бы отличным; заранее спасибо! У меня nginx v 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 настроен так, чтобы вы указали доверенный прокси-серверы.
Если ваша цель - просто заставить nginx регистрировать предполагаемый реальный IP-адрес, вам не нужно менять 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 Вот.