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

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

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