haproxy y reenvío de la dirección IP del cliente a los servidores

15

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?

Sistema
fuente
Lo que estás buscando se llama 'proxy transparente'. iptables está involucrado de alguna manera, pero no estoy seguro exactamente cómo.
sysadmin1138
Al decir proxy transparente, menciono que los proxy que no modifican los encabezados http mientras distribuyen las conexiones entrantes. por lo tanto, la IP real del cliente solicitante de la página web se puede enviar al servidor web. Eso es lo que entendí del proxy transparente.
Sistema

Respuestas:

15

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

option forwardfor

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

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

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í

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

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.

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

El final de todo mi último archivo haproxy.cfg es el siguiente.

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    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:passwd

    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

Sin embargo, me faltan muchas cosas sobre HAproxy, como cuál es el significado uid o gid.

Sistema
fuente
2

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)

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Marcelo Bittencourt
fuente
Gracias por su respuesta Marcelo, pero no necesitamos la dirección IP del cliente en el registro de Apache. tratamos de aprender por nuestros scripts php.
Sistema
1

Acabo de probar la solución de @ System y parece que el nombre del encabezado se cambió de HTTP_X_FORWARDED_FORa x-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");

Roc Boronat
fuente