Tengo un problema con HAproxy.
Utilizo HAproxy como equilibrador de carga que distribuye las solicitudes HTTP entrantes a 5 servidores web. Normalmente, la solicitud de un cliente se reenvía a los servidores web con la IP del equilibrador de carga. Pero necesito IP de clientes o IP reales que soliciten algo de los servidores web. Porque necesitamos registrar las IP del cliente real.
Intento obtener las IP del cliente en los servidores web, pero no puedo tener éxito hasta ahora. Siempre veo la IP del equilibrador de carga.
Utilizo la opción x-forward-for pero no se resuelve el problema. Después de eso encontré otra opción " source 0.0.0.0:80 usesrc clientip " pero me equivoqué al intentar ejecutar HAproxy que trata sobre las necesidades de compilación con la opción USE_TPROXY del HAproxy. Lo hice, recompilo HAproxy con la opción USE_TPROXY pero no cambia nada. ¿Qué puedo hacer para conocer las IP reales del cliente?
Mi versión de kernel de Linux es 2.6.32-34 Quiero decir que el kernel es compatible con proxy transparente. y uso UBUNTU 10.4 LTS
mi archivo de configuración está aquí
global
maxconn 100000
uid 99
gid 99
daemon
defaults
option forwardfor except 127.0.0.1
mode http
(1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
(2)source 0.0.0.0:80 usesrc clientip
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen myWeb 0.0.0.0:80
mode http
balance source
option forwardfor header X-Client
option http-server-close
stats enable
stats refresh 10s
stats hide-version
stats scope .
stats uri /lb?stats
stats realm LB2\ Statistics
stats auth admin:xXx
server S1 192.168.1.117:80 check inter 2000 fall 3
server S2 192.168.1.116:80 check inter 2000 fall 3
server S3 192.168.1.118:80 check inter 2000 fall 3
(1) (2) Mientras probaba HAproxy utilicé una de estas dos líneas.
¿Alguien me ayuda a conocer las IP reales de los clientes que solicitan nuestros servidores?
Respuestas:
Resolví este problema. Puede ser que no fue un problema desde el principio. Hice una búsqueda en Google cuando me enfrenté a este problema, y vi que
línea para usar en el archivo haproxy.cfg y también otras opciones. Probé esas opciones, incluida la recompilación del haproxy ... Pero el problema real relacionado con el aprendizaje de las IP reales del cliente en los servidores web no proviene de HAproxy, se trata de leer encabezados por scripts de servidor, en nuestro caso este lenguaje de scripting es PHP.
Intento aprender las direcciones IP del cliente con estos comandos
y estos comandos muestran la IP de loadbalancer. Esto es correcto, pero eso no es lo que me esperaba. A pesar de la opción forwardfor, estos comandos me dieron la IP de loadbalancer
Al usar la opción de reenvío, habilitamos a HAproxy para insertar el encabezado x-reenviado por en las solicitudes del cliente enviadas a nuestros servidores web. HAproxy puso este campo en el encabezado pero lo ignoré. Hoy me di cuenta de que este es un campo de encabezado y tengo que leer este encabezado así
Con este comando obtuve la dirección IP del cliente, no la dirección IP del equilibrador de carga.
Pero mi oferta es para obtener los datos del encabezado para investigar la otra información es la función getallheaders () para PHP.
El final de todo mi último archivo haproxy.cfg es el siguiente.
Sin embargo, me faltan muchas cosas sobre HAproxy, como cuál es el significado uid o gid.
fuente
Si necesita la dirección IP del cliente en el registro de Apache, puede cambiar su configuración de apache para registrar el reenvío de X en lugar de la fuente original (5h)
fuente
Acabo de probar la solución de @ System y parece que el nombre del encabezado se cambió de
HTTP_X_FORWARDED_FOR
ax-forwarded-for
. Probablemente esté relacionado con la versión HAproxy, porque la respuesta fue escrita hace 5 años ...?Como ejemplo, esto está trabajando en la producción:
String requestIp = httpRequest.getHeader("x-forwarded-for");
fuente