Spring Boot detrás de un proxy inverso ignorando las cabeceras X-Forwarded.
Recientemente migramos nuestros servicios de Spring Boot (2.2 y 2.4) a un nuevo clúster de Kubernetes (EKS).
Tenemos Traefik ejecutándose como proxy inverso con un balanceador de carga público adjunto.
Desde nuestra migración, los servicios de Spring ya no aceptan los encabezados X-Forwarded. Verificamos tres veces los encabezados que son recibidos por esos servicios provenientes del proxy inverso, pero spring parece ignorarlos y marcar el HTTPServletRequest como inseguro, lo que básicamente rompe nuestro sistema.
Los siguientes encabezados son enviados por el proxy (eliminando los encabezados User Agent y Sec-Fetch) y recibidos por nuestros servicios de Spring.
Encabezado: host=test.example.intern
Encabezado: authorization=Bearer xxx
Encabezado: referer=https://test.example.intern/profile
Encabezado: x-forwarded-for=172.32.11.128
Encabezado: x-forwarded-host=test.example.intern
Encabezado: x-forwarded-port=443
Encabezado: x-forwarded-proto=https
Encabezado: x-forwarded-server=traefik-84794d75b9-p2q7z
Encabezado: x-real-ip=172.32.11.128
Otra cosa “divertida” es que si intercambiamos los servicios usando herramientas como telepresencia y ejecutamos el servicio localmente, funciona incluso si los encabezados son los mismos. Lo mismo sucede si simulamos la llamada de los proxies inversos, estableciendo los encabezados X-Forwarded idénticos a los que provienen del proxy, funciona.
Comparamos la configuración y los encabezados enviados de los mismos servicios que se ejecutan en nuestros otros clústeres de k8s en Google Cloud y Azure, que son idénticos (además de las direcciones IP de origen, obviamente).
Los rangos de IP del servicio del clúster y los CIDR del pod también se establecen en la configuración de server.tomcat.remoteip.internal-proxies
. Otra cosa que intentamos sin éxito es establecer server.forward-headers-strategy
a NATIVE.
¿Alguien sabe qué es lo que posiblemente pasamos por alto o podría orientarnos en la dirección correcta aquí?
Gracias de antemano,
Rob
davy.ai
Resolución de problemas de encabezados X-Forwarded en servicios Spring Boot que se ejecutan en Kubernetes con Traefik como proxy inverso
Problema
Después de migrar los servicios Spring Boot a un nuevo clúster de Kubernetes con Traefik como proxy inverso y un balanceador de carga de cara al público, los encabezados X-Forwarded no son aceptados por los servicios Spring, lo que hace que HttpServletRequest sea marcado como inseguro y rompa el sistema.
Encabezados
Los encabezados X-Forwarded recibidos por los servicios Spring de Traefik son:
Pasos para solucionar el problema
Solución
El problema podría ser causado por el hecho de que el sistema utiliza un certificado autofirmado, lo que hace que Spring Boot ignore los encabezados X-Forwarded. Para resolver el problema, es necesario agregar el certificado al almacén de confianza de los servicios Spring Boot.
Para agregar el certificado al almacén de confianza, siga estos pasos:
Con estos pasos, los encabezados X-Forwarded deberían ser aceptados por los servicios Spring Boot y el sistema debería estar funcionando correctamente.