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

Haproxy неправильно передает заголовок X-Forwarded-For

У меня есть внутренние веб-серверы, которые получают запросы через haproxy-> nginx-> fastcgi. Веб-приложение использовалось для просмотра нескольких IP-адресов в заголовке X-Forwarded-For, соединенных запятыми (самый оригинальный IP-адрес слева).

В какой-то момент в недавнем прошлом (только что заметил, поэтому не уверен, что это вызвало) что-то изменилось, и теперь я вижу только один IP-адрес, переданный в заголовке моему веб-приложению.

Я пробовал с haproxy 1.4.21 и 1.4.22 (недавнее обновление) с таким же поведением. У Haproxy установлен заголовок forwardfor:

option forwardfor

Конфигурация Nginx fastcgi_params определяет этот заголовок, который будет передан в приложение:

fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;

У кого-нибудь есть идеи о том, что здесь может быть не так?

РЕДАКТИРОВАТЬ: Я только начал регистрировать переменную $ http_x_forwarded_for в журналах nginx, а nginx когда-либо видит только один IP-адрес, чего никогда не должно быть, поскольку мы всегда должны видеть, что наш haproxy ip добавлен туда, верно? Итак, проблема должна заключаться либо в обработке nginx входящей переменной, либо в том, что haproxy неправильно ее создает. Я буду копать ...

РЕДАКТИРОВАТЬ № 2: Я включил ведение журнала запросов и ответов в HAProxy, и он ничего не выплывает для X-Forwarded-For, что кажется очень странным:

10 октября 10:49:01 newark-lb1 haproxy [19989]: 66.87.95.74:47497 [10 октября 2012 г .: 10: 49: 01.467] http service / newark2 0/0/0/16/40 301 574 - - ---- 4/4/3/0/0 0/0 {} {} "GET / 2zi HTTP / 1.1" O

Вот параметры, которые я установил для этого в своем интерфейсе:

mode http
option httplog
capture request header X-Forwarded-For len 25
capture response header X-Forwarded-For len 25
option httpclose
option forwardfor

РЕДАКТИРОВАТЬ № 3: На самом деле кажется, что haproxy изменяет заголовок и просто передает один на бэкэнд. Это существенно влияет на нашу производственную службу, поэтому, если у кого-то есть идеи, мы будем очень признательны. Я в тупике ... :(

Чтобы ответить на ваш последний вопрос в комментарии, нормально иметь более одного IP-адреса в XFF, этот заголовок представляет собой список значений, и прокси часто добавляют туда адрес своего клиента. Поскольку все участники длинной цепочки добавляют туда значения, ваш сервер должен использовать их в обратном порядке. Например, последнее значение будет добавлено экземпляром haproxy перед сервером, а предыдущее значение будет добавлено обратным кешем перед haproxy и т. Д.

Если вы предпочитаете не адаптировать приложение для правильного анализа заголовка, вы также можете попросить haproxy удалить его перед добавлением собственного заголовка XFF:

reqidel ^X-Forwarded-For:

Таким образом, сервер получит добавленную стоимость только от haproxy, который будет клиентом haproxy.

Я думаю, что есть некоторая путаница в том, как вы пытаетесь использовать заголовок X-Forwarded-For.

Во-первых, тот факт, что nginx видит один IP-адрес, означает, что haproxy правильно его добавляет. Заголовок содержит только адрес источника, с которого haproxy получил соединение, поэтому это нормально, что вы не видите IP-адрес haproxy в журналах nginx.

Во-вторых, также ожидается, что вы не заметите x-forwarded-for во входящих запросах, потому что только некоторые исходящие прокси добавляют заголовок, но в целом рекомендуется не делать этого при выходе в Интернет. Если некоторые пользователи отправят вам запрос с таким заголовком, вы увидите его в захвате haproxy, и nginx зарегистрирует это значение и IP-адрес клиента, добавленный haproxy.

Чего я не понимаю, так это вашего пункта №3, потому что вы, кажется, предполагаете, что заголовок обязательно присутствует во входящих запросах, что, очевидно, не так, судя по захватам haproxy и журналам nginx. Я только что отправил вам запрос «X-Forwarded-For: Привет, Джесси, это Вилли», который вы должны увидеть в журналах как haproxy, так и nginx, если это поможет вам устранить неполадки.

Возможно, раньше вы привыкли видеть там несколько адресов, потому что либо один из ваших основных посетителей использовал исходящий прокси, который добавил заголовок XFF, либо потому, что у вас был другой обратный прокси перед haproxy (например: apache, stunnel , ...).

Кстати, вы должны заменить «option httpclose» на «option http-server-close», это позволит поддерживать активность клиентов и сократить время загрузки страницы для тех, у кого высокая задержка.