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 (client 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.

Будь-які ідеї? :(

Відповіді:


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-запиту набору X-Client-IP% [src] працює на відмінно.
KacproSo

Останній приклад невірний, правильне правило: http-запит набору заголовків 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]

Я думаю, що set-header краще видалити зловмисні заголовки, надіслані від клієнта.
Der_Meister

@Der_Meister Ви можете мати рацію, але я не бачу, як це має відношення до цього питання чи відповіді. Хочете допрацювати?
GregL

1
Мета заголовка X-Client-IP полягає в тому, щоб повідомити про вихідну реальну IP-адресу з'єднання, а не випадкове значення вхідного заголовка. Це не згадується в питанні, я просто хочу попередити майбутніх читачів.
Der_Meister

Знову ж, ви можете мати рацію, але в цьому прикладі X-CLIENT-IPне встановлюється клієнт, а HAProxy, заснований на вихідному IP-адресі. Я б запропонував залишити ці коментарі на питаннях, де це не так, щоб не бентежити читачів.
GregL

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])]

0

Пробуючи HAproxy 1.7, це правильний синтаксис, який робить цю роботу без квадратних дужок навколо X-Forwarded-For

   http-request set-header X-Client-IP %[req.hdr_ip(X-Forwarded-For)]

-2

Ви можете встановити модуль під назвою mod_rpaf на вашому сервері. Це копіює IP X-FORWARDED-FOR на X-CLIENT-IP. Для отримання додаткової інформації див. Це . У Windows у вас повинні бути подібні модулі, на зразок фільтрів X-Forwarded-For ASAPI.


Він не може встановити жодних модулів ..
neutrinus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.