HAProxy - как добавить ip клиента в заголовки X-Client-IP и X-Forwarded-For?

10

У меня проблема с HAProxy сервером. Я хочу перенаправить в заголовок клиентский IP. Я почти сделал это, но есть интересный случай, и я не могу понять это. Мне нужно написать клиентский IP в 2 местах в заголовке, в тегах X-CLIENT-IP и X-FORWARDED-FOR.

Проблема: когда я использую

option http-server-close
option forwardfor

На целевом сервере я вижу в заголовке X-FORWARDED-FOR = xxx.xxx.xxx.xxx (ip клиента), но заголовка x-client-ip нет.

Когда я использую:

option forwardfor header X-Client-IP
option http-server-close

На целевом сервере я вижу заголовок X-CLIENT-IP = xxx.xxx.xxx (IP-адрес клиента), но X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip)

Мне нужно видеть на целевом заголовке, где X-CLIENT-IP и X-FORWARDED-FOR имеют значение клиентского IP.

Я пытаюсь смешивать конфигурации, как

 option forwardfor
 option forwardfor header X-Client-IP
 option http-server-close

Нет эффекта. Я не могу также установить любые модули. Цель - IIS.

Есть идеи? :(

KacproSo
источник

Ответы:

12

Вы можете попробовать настроить пользовательский заголовок, например так:

http-request set-header X-Client-IP %[src]

Или вы можете даже скопировать его из заголовка X-Forwarded-For, я думаю, что синтаксис будет выглядеть примерно так:

http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
Яков Сосич
источник
Второй вариант дает мне в заголовке x-client-ip = req.hdr_ip (% 5bX-Forwarded-For% 5d), так что что-то не так. Но я попробую сначала.
KacproSo
Первое разрешение http-запроса set-header X-Client-IP% [src] работает отлично.
KacproSo
Последний пример неверен, правильное правило: http-запрос set-header X-Client-IP% [req.hdr_ip (X-Forwarded-For)]
Rfraile
X-Client-IP и X-Forwarded-For имеют разные цели. Копировать X-Forwarded-For небезопасно, потому что HAProxy может возвращать значение, отправленное клиентом.
Der_Meister
5

Если вы хотите использовать оба, вам нужно добавить второе с http-requestключевым словом.

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]
GregL
источник
Я думаю, что set-header лучше удалить вредоносные заголовки, отправленные с клиента.
Der_Meister
@Der_Meister Вы можете быть правы, но я не понимаю, как это имеет отношение к этому вопросу или ответу. Хотите разработать?
Грегл
1
Цель заголовка X-Client-IP - сообщить бэкэнду реальный IP-адрес соединения, а не случайное значение из входящего заголовка. Это не упоминается в вопросе, я просто хочу предупредить будущих читателей.
Der_Meister
Опять же, вы можете быть правы, но в этом примере, X-CLIENT-IPэто не устанавливается клиентом, а скорее HAProxy на основе исходного IP. Я хотел бы предложить оставить эти комментарии по вопросам , где это Релевент так, чтобы не читателям путайте.
Грегл
add-headerне удаляет то, X-CLIENT-IPчто могло быть установлено клиентом. Вот почему @Der_Meister рекомендовал использовать set-headerвместо этого. Я предлагаю изменить ваш ответ, чтобы использовать set-headerвместо этого.
фисташка
0

Предложенный выше ответ, который не работал для KacproSo, просто нужно было прочитать значение, добавив &[...], так что это должно работать нормально:

http-request set-header X-Client-IP %[req.hdr_ip([X-Forwarded-For])]
user489680
источник
0

При использовании HAproxy 1.7 это правильный синтаксис, который делает эту работу без квадратных скобок вокруг X-Forwarded-For

   http-request set-header X-Client-IP %[req.hdr_ip(X-Forwarded-For)]
user3540644
источник
-2

Вы можете установить модуль с именем mod_rpaf на ваш внутренний сервер. Это копирует X-FORWARDED-FOR IP в X-CLIENT-IP. Для получения дополнительной информации см. Это . В Windows у вас должны быть похожие модули, что-то вроде фильтров X-Forwarded-For ASAPI.

Йерун
источник
Он не может установить какие-либо модули ..
Neutrinus