[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Haproxy como transparente en Debian Wheezy



Hola buenas, he montado haproxy en Debian. Mi objetivo es balancear
tráfico a 3 servidores por TCP puerto 3306 Mysql.

El problema que he encontrado, que por lo visto despues de googlear
está más que reportado, es que cuando se conectan las máquinas
clientes y pasan por haproxy, la ip que aparece en los servidores
Mysql, es la ip del haproxy (balancador TCP) en vez de la ip de las
máquinas clientes.

Según he leído, antiguamente sobre kernels 2.6.X había que recompilar
el kernel para habilitar TPROXY.

http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

También pone ahí que había que compilar parcheando iptables con soporte tproxy.

Bueno después de volverme loco googleando y probando, he visto que el
módulo TPROXY ya viene incluído en los kernel 3.X

grep -i "tproxy" /boot/config-3.2-generic

CONFIG_NETFILTER_XT_TARGET_TPROXY=m

Con lo cual no haría falta compilar.

Por otro lado, hay que compilar haproxy con soporte tproxy, cargar
reglas iptables, rutas y añadir ciertos parámetros a sysctl:

http://blog.snapt.net/2012/01/16/snapt-haproxy-and-tproxy/

Dejando haproxy.cfg configurado así funciona:


global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        maxconn 4096
        uid 99
        gid 99
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  tcplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen mysql-cluster 0.0.0.0:3306
    mode tcp
    balance roundrobin
    option mysql-check user root

    server db01 10.4.29.100:3306 check
    server db02 10.4.29.99:3306 check
    server db03 10.4.29.98:3306 check


Balancea bien, pero el problema viene cuando quiero habilitar esta
directiva source 0.0.0.0 usesrc clientip , de esta forma:

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        maxconn 4096
        uid 99
        gid 99
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  tcplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen mysql-cluster 0.0.0.0:3306
    source 0.0.0.0 usesrc clientip
    mode tcp
    balance roundrobin
    option mysql-check user root

    server db01 10.4.29.100:3306 check
    server db02 10.4.29.99:3306 check
    server db03 10.4.29.98:3306 check


En cuanto añado eso, ya no me funciona. El telnet al puerto 3306 a la
ip de haproxy entra pero no llega a mysql.

Debugeando un poquito haproxy cuando hago telnet, no veo nada raro:

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result FAILED
Total: 3 (2 usable), will use epoll.
Using epoll() as the polling mechanism.






00000000:mysql-cluster.accept(0004)=0006 from [10.1.2.190:56280]
00000000:mysql-cluster.clicls[0006:0007]
00000000:mysql-cluster.closed[0006:0007]
00000001:mysql-cluster.accept(0004)=0006 from [10.1.2.190:56281]

Tenéis idea de qué puede estar pasando?

En cuanto quiero registrar las ips de los clientes que se conectarán
añadiendo la directiva "source 0.0.0.0 usesrc clientip" , ya no
funciona.

No sé si me falta algo.


Reply to: