Описание википедии заголовка HTTP X-Forwarded-For
:
X-Forwarded-For: client1, proxy1, proxy2, ...
Документация nginx для директивы real_ip_header
гласит:
Эта директива устанавливает имя заголовка, используемого для передачи замещающего IP-адреса.
В случае X-Forwarded-For этот модуль использует последний ip в заголовке X-Forwarded-For для замены. [Акцент мой]
Эти два описания противоречат друг другу. В нашем сценарии X-Forwarded-For
заголовок в точности соответствует описанию - «реальный» IP-адрес клиента является самой левой записью. Аналогично, поведение nginx состоит в том, чтобы использовать самое правильное значение, которое, очевидно, является лишь одним из наших прокси-серверов.
Насколько я понимаю X-Real-IP
, он должен использоваться для определения фактического IP-адреса клиента, а не прокси-сервера. Я что-то упустил, или это ошибка в nginx?
И, кроме того, есть ли у кого-нибудь какие-либо предложения о том, как сделать так, чтобы X-Real-IP
заголовок отображал крайнее левое значение, как указано в определении X-Forwarded-For
?
источник
Разбор
X-Forwarded-For
заголовка действительно имеет недостатки в модуле nginx real_ip.Он начинается в крайнем правом углу строки заголовка и, как только он видит пробел или запятую, он перестает смотреть и вставляет часть справа от пробела или запятой в переменной IP. Таким образом, последний адрес прокси обрабатывается как исходный адрес клиента .
Это не играет хорошо в соответствии со спецификацией; это опасность того, что это не будет изложено в болезненно очевидных терминах в RFC.
В стороне: Трудно даже найти хороший первоисточник в формате, который был первоначально определен Squid - копание их документации подтверждает порядок; крайний левый - оригинальный клиент, самый правый - самый последний. Мне очень хочется добавить [нужную цитату] на эту страницу википедии. Одно анонимное редактирование, кажется, авторитет интернета по этому вопросу.
Если возможно, можете ли вы, чтобы промежуточные прокси перестали добавлять себя в конец заголовка, оставив только реальный адрес клиента?
источник
X-Forwarded-For
уже существует. (это правильный IP-адрес клиента). Затем nginx сам добавляет IP-адрес нашего балансировщика нагрузки (предыдущий переход) вX-Forwarded-For
заголовок. (предположительно добавляя то, что он видит как «удаленный адрес») Если бы он просто этого не делал, я мог бы просто использоватьX-Forwarded-For
заголовок, как и раньше. (мы недавно мигрировали в nginx)proxy_pass
- и даже тогда, только сproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
на месте.X-Forwarded-For
заголовок с исходным клиентским адресом слева и, возможно, с любыми предыдущими прокси, добавленными к нему. Таким образом, текущий обслуживающий прокси-сервер добавит предыдущий прокси-сервер (= инициатор) в конец этого списка и предоставит расширенный таким образомX-Forwarded-For
заголовок для следующего восходящего перехода. Конечно, они могли бы выбрать более очевидную формулировку.X-Real-IP - это IP-адрес фактического клиента, с которым общается сервер («настоящий» клиент сервера), который в случае прокси-соединения является прокси-сервером. Вот почему X-Real-IP будет содержать последний IP-адрес в заголовке X-Forwarded-For.
источник
X-Real-IP
возвращение IP - адрес моего собственного прокси - сервера когда - либо быть полезным?