HAProxy - comment ajouter l'IP du client dans les en-têtes X-Client-IP et X-Forwarded-For?

10

J'ai un problème avec le serveur HAProxy. Je veux transmettre en en-tête une adresse IP client. Je l'ai presque fait, mais il y a un cas intéressant et je ne peux pas le comprendre. J'ai besoin d'écrire l'IP du client à 2 endroits dans l'en-tête, dans les balises X-CLIENT-IP et X-FORWARDED-FOR.

Le problème est: quand j'utilise

option http-server-close
option forwardfor

Sur le serveur cible, je vois dans l'en-tête X-FORWARDED-FOR = xxx.xxx.xxx.xxx (ip client) mais il n'y a pas d'en-tête x-client-ip.

Quand j'utilise:

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

Sur le serveur cible, je vois l'en-tête X-CLIENT-IP = xxx.xxx.xxx (IP client) mais X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip)

J'ai besoin de voir sur l'en-tête cible où X-CLIENT-IP et X-FORWARDED-FOR ont une valeur d'IP client.

J'essaye de mélanger des configurations comme

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

Aucun effet. Je ne peux pas non plus installer de modules. La cible est IIS.

Des idées? :(

KacproSo
la source

Réponses:

12

Vous pouvez essayer de configurer un en-tête personnalisé, comme ceci:

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

Ou, vous pouvez même le copier à partir de l'en-tête X-Forwarded-For, je pense que la syntaxe irait quelque chose comme:

http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
Jakov Sosic
la source
La deuxième option me donne dans l'en-tête x-client-ip = req.hdr_ip (% 5bX-Forwarded-For% 5d), donc quelque chose ne va pas. Mais je vais essayer le premier.
KacproSo
La première résolution http-request set-header X-Client-IP% [src] fonctionne parfaitement.
KacproSo
Le dernier exemple est faux, la bonne règle est: http-request set-header X-Client-IP% [req.hdr_ip (X-Forwarded-For)]
Rfraile
X-Client-IP et X-Forwarded-For ont des objectifs différents. Il n'est pas sûr de copier X-Forwarded-For, car HAProxy peut renvoyer la valeur envoyée par le client.
Der_Meister
5

Si vous souhaitez utiliser les deux, vous devrez ajouter le second avec un http-requestmot-clé.

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]
GregL
la source
Je pense que set-header est préférable de supprimer les en-têtes malveillants envoyés par le client.
Der_Meister
@Der_Meister Vous avez peut-être raison, mais je ne vois pas en quoi cela a un rapport avec cette question ou réponse. Envie d'élaborer?
GregL
1
Le but de l'en-tête X-Client-IP est de dire au backend la véritable adresse IP de la connexion, et non une valeur aléatoire à partir d'un en-tête entrant. Ce n'est pas mentionné dans la question, je veux juste avertir les futurs lecteurs.
Der_Meister
Encore une fois, vous avez peut-être raison, mais dans cet exemple, le X-CLIENT-IPn'est pas défini par le client, mais plutôt par HAProxy en fonction de l'IP source. Je suggérerais de laisser ces commentaires sur les questions où cela est pertinent afin de ne pas confondre les lecteurs.
GregL
add-headerne supprime pas celui X-CLIENT-IPqui peut avoir été défini par le client. C'est pourquoi @Der_Meister a recommandé d'utiliser à la set-headerplace. Je suggère de modifier votre réponse pour l'utiliser à la set-headerplace.
pistache
0

La réponse suggérée ci-dessus qui ne fonctionnait pas pour KacproSo devait simplement lire la valeur en ajoutant &[...], cela devrait donc fonctionner correctement:

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

Essayer HAproxy 1.7, c'est la syntaxe correcte qui fait que cela fonctionne, sans les carrés carrés autour de X-Forwarded-For

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

Vous pouvez installer un module appelé mod_rpaf sur vos serveurs principaux. Ceci copie l'IP X-FORWARDED-FOR sur l'X-CLIENT-IP. Pour plus d'informations, voir ceci . Sous Windows, vous devriez avoir des modules similaires, quelque chose comme des filtres X-Forwarded-For ASAPI.

Jeroen
la source
Il ne peut installer aucun module ..
neutrinus