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: