HAProxy: ¿cómo agregar IP de cliente en encabezados X-Client-IP y X-Forward-For?


10

Tengo un problema con el servidor HAProxy. Quiero reenviar en el encabezado una IP del cliente. Casi lo hago, pero hay un caso interesante y no puedo resolverlo. Necesito escribir la IP del cliente en 2 lugares en el encabezado, en las etiquetas X-CLIENT-IP y X-FORWARDED-FOR.

El problema es: cuando uso

option http-server-close
option forwardfor

En el servidor de destino, veo en el encabezado X-FORWARDED-FOR = xxx.xxx.xxx.xxx (ip del cliente) pero no hay un encabezado x-client-ip.

Cuando uso:

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

En el servidor de destino, veo el encabezado X-CLIENT-IP = xxx.xxx.xxx (IP del cliente) pero X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip)

Necesito ver en el encabezado de destino dónde X-CLIENT-IP y X-FORWARDED-FOR tienen el valor de IP del cliente.

Intento mezclar configuraciones como

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

Sin efecto Tampoco puedo instalar ningún módulo. El objetivo es IIS.

¿Algunas ideas? :(

Respuestas:


12

Puede intentar configurar un encabezado personalizado, como este:

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

O incluso puede copiarlo del encabezado X-Fordered-For, creo que la sintaxis sería algo así como:

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

La segunda opción me da en el encabezado x-client-ip = req.hdr_ip (% 5bX-Forward-For% 5d), entonces algo está mal. Pero intentaré el primero.
KacproSo

Primera resolución http-request set-header X-Client-IP% [src] funciona perfecto.
KacproSo

El último ejemplo es incorrecto, la regla correcta es: http-request set-header X-Client-IP% [req.hdr_ip (X-Fordered-For)]
Rfraile

X-Client-IP y X-Forward-For tienen diferentes propósitos. No es seguro copiar X-Fordered-For, porque HAProxy puede devolver el valor enviado por el cliente.
Der_Meister

5

Si desea utilizar ambos, deberá agregar el segundo con una http-requestpalabra clave.

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]

Creo que set-header es mejor para eliminar los encabezados maliciosos enviados desde el cliente.
Der_Meister

@Der_Meister Puede que tengas razón, pero no veo cómo eso tiene alguna relevancia para esta pregunta o respuesta. ¿Cuidado para elaborar?
GregL

1
El propósito del encabezado X-Client-IP es decirle al backend la dirección IP real de la conexión, no un valor aleatorio de un encabezado entrante. No se menciona en la pregunta, solo quiero advertir a los futuros lectores.
Der_Meister

Una vez más, es posible que tenga razón, pero en este ejemplo, X-CLIENT-IPel cliente no lo está configurando, sino HAProxy en función de la IP de origen. Sugeriría dejar estos comentarios en preguntas donde sea relevante para no confundir a los lectores.
GregL

add-headerno elimina el X-CLIENT-IPque haya sido configurado por el cliente. Es por eso que @Der_Meister recomendó usar en su set-headerlugar. Sugiero editar su respuesta para usar set-headeren su lugar.
pistache

0

La respuesta sugerida anteriormente que no funcionó para KacproSo solo necesitaba leer el valor agregando &[...], por lo que esto debería funcionar bien:

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

0

Probar con HAproxy 1.7 esta es la sintaxis correcta que hace que esto funcione, sin los corchetes alrededor de X-Forward-For

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

-2

Puede instalar un módulo llamado mod_rpaf en sus servidores de fondo. Esto copia la X-FORWARDED-FOR IP a la X-CLIENT-IP. Para más información ver esto . En Windows debería tener módulos similares, algo así como filtros X-Fordered-For ASAPI.


No puede instalar ningún módulo ..
neutrinus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.