haproxy - pasa ip original / remota en modo tcp

8

Tengo un haproxy configurado con keepalived para el equilibrio de carga y la conmutación por error de IP de un clúster percona, y dado que funciona muy bien, me gustaría usar el mismo lb / failover para otro servicio / demonio.

He configurado haproxy de esta manera:

listen my_service 0.0.0.0:4567
    mode tcp
    balance leastconn
    option tcpka
    contimeout      500000
    clitimeout      500000
    srvtimeout      500000

    server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
    server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3

El equilibrio de carga funciona bien, pero el servicio ve la IP del equilibrador de carga en lugar de las IP reales de los clientes. En el modo http, es bastante fácil hacer pasar haproxy por la IP remota, pero ¿cómo lo hago en modo tcp? Esto es crítico debido a la naturaleza del servicio que necesito para equilibrar la carga.

¡Gracias! Vito

Vito Botta
fuente
aquí está la documentación completa de haproxy 1.6.6 cbonte.github.io/haproxy-dconv/…

Respuestas:

3

Solo para futuras referencias, keepalived es una solución para la conmutación por error y no el equilibrio de carga (¿tal vez te refieres a LVS?). el modo proxy transparente para HAProxy no tiene nada que ver con ninguna forma especial de enviar la IP original, ese sería el modo HTTP no transparente normal donde puede usar un encabezado HTTP estandarizado para esto.

En mi opinión, la respuesta correcta a la pregunta original es: podría compilar soporte de proxy transparente en HAProxy en un núcleo de Linux habilitado para TPROXY. Esto, junto con la versión de soporte de TPROXY adecuada + la configuración de iptables en la misma máquina, permite un soporte de proxy tcp totalmente transparente. Esto significa que los servidores de fondo NO necesitan ninguna configuración especial.

Tenga en cuenta que esta no es la configuración recomendada para HAProxy y solo debe usarse si es absolutamente necesario.

Robbert
fuente
2

Aparentemente hay algún tipo de modo "transparente" para haproxy que nunca he visto o con el que no quiero tener nada que ver, que puedas probar. De lo contrario, deberá enseñar lo que sea que sea el servicio de back-end sobre la forma especial de haproxy de enviar la IP original ("PROXY blahblah") y hacer que el servicio extraiga la IP original de eso.

Sin embargo, ¿por qué te molestas con el haproxy? Ya se ha mantenido en su lugar, y también hace un equilibrio de carga transparente adecuado.

womble
fuente
Hola, muchas gracias por tu respuesta :) Estoy leyendo algunas cosas sobre el soporte 'tproxy', supongo que esto es lo que quisiste decir. Además, no había considerado el equilibrio de carga con keepalived directamente para esto. ¿Keepalived pasa la IP original del cliente?
Vito Botta
Sí, keepalived mantiene intacta la IP original, porque es un equilibrador de carga, no un proxy.
womble
2

El uso send-proxyen su configuración (por servidor) le dará la fuente-ip original en el lado del servidor receptor, incluso en modo TCP. Esto requiere HAProxy 1.5+.

Puede encontrar más información sobre el protocolo proxy en la documentación de HAProxy .

listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout      500000
clitimeout      500000
srvtimeout      500000

server host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
server host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
Nils Schmidt
fuente
Hola Nils, gracias por la solución, pero cuando ingreso send-proxy, causa que el db caiga (el haproxy no puede detectar el host)
neobie
Lo mismo sucedió conmigo también con DB. alguna solución ?
Peeyush
-4

Esta configuración funcionó para mí. La IP de origen se puede recuperar en $ _SERVER ['HTTP_X_FORWARDED_FOR']:

global
        [..... cosas usuales .... ]   
        SSL-servidor-verificar ninguno

interfaz principal *: 5000
        enlace *: 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        modo http
        opción hacia adelante
        reqadd X-Fordered-Proto: \ https
        default_backend https_server

servidor de https_servicio
        modo http
        saldo al menos
        opción tcpka
        tipo de tabla de palo tamaño ip 200k caducan 30m
        servidor srv04 192.168.1.10:443 verificación ssl
        servidor srv05 192.168.1.11:443 verificación ssl
Pedro Sayago
fuente
2
Esta respuesta no se aplica. La conexión no es HTTP.
Longneck
¿Estás sugiriendo que la conexión https debe estar en modo tcp?
Pedro Sayago
No, estoy diciendo que la pregunta usa tcp, y su respuesta solo se aplica a http / s.
cuello largo
ok, buena suerte entonces, no he encontrado ningún documento relativo a haproxy en el modo tcp que reenvía ip. Tal vez la capa donde se procesan las solicitudes no puede pasar esta información.
Pedro Sayago