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? :(

KacproSo
fuente

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])
Jakov Sosic
fuente
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]
GregL
fuente
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])]
usuario489680
fuente
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)]
usuario3540644
fuente
-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.

Jeroen
fuente
No puede instalar ningún módulo ..
neutrinus