Problema amb iptables + ipvsadm (Balanceador de carga web)

Buenas, he intentado montar en mi casa un balanceador de carga web, para aprender. Pero no se donde puedo tener el error que hace que no funcione... El script que hago servir és este: (Perdon por los comentarios en catalan, si hay algo que no entendais, lo posteo sin problemas)

#!/bin/bash
#Es carregue el modul de l'algorisme balancejador de càrrega Round Robin
modprobe ip_vs_rr
#S'habilite el reenviament de paquets IP
echo 1 > /proc/sys/net/ipv4/ip_forward
#Es defineix la comanda per a l'administració de les iptables i del ipvsadm (balancejador)
IPTABLES=/sbin/iptables
IPVSADM=/sbin/ipvsadm
ARXIUIPS=/root/ips
#Defineixo el rang de servidors
REDLOCAL=192.168.1.4/5

#Com que tinc ip dinàmica comprovo si aquesta ha canviat respecte de la vella, emmagatzemada a /root/ips
NOVA_IP=`links -dump http://checkip.dyndns.org | awk ' { print $4 } '`
var2=`tail -1 $ARXIUIPS`

if [[ $NOVA_IP != $var2 && -n $NOVA_IP ]] ; then

#Si ha canviat la ip emmagatzemo aquesta al arxiu /root/ips
echo $NOVA_IP >> $ARXIUIPS

#Netejo qualsevol configuracio de iptables
$IPTABLES -F

#Netejo qualsevol configuracio a la taula nat
$IPTABLES -t nat -F

#S'indica que per a qualsevol paquet amb origen a la xarxa local es realizará el procés de masquerading
$IPTABLES -t nat -A POSTROUTING -s $REDLOCAL -j MASQUERADE

#Es permet el reenviament de datagrames amb origen a la xarxa local
$IPTABLES -A FORWARD -s $REDLOCAL -j ACCEPT

#Es neteja qualsevol configuració anterior de ipvsadm
$IPVSADM -C

#S'afegeix el servei virtual al port 80 utilitzant round robin (rr) com a scheduler
$IPVSADM -A -t $NOVA_IP:80 -s rr

#S'afegeixen els servidors reals associats al servei virtual definit anteriorment
#Aquestos s'identifiquen amb les seves direccions IP y ports on escolten
#S'especifica en els dos casos que la tècnica de balanceig a utilitzar serà la de NAT (mitjançant el paràmetre -m)
$IPVSADM -a -t $NOVA_IP:80 -r 192.168.1.4:80 -m
#$IPVSADM -a -t $NOVA_IP:80 -r 192.168.1.5:80 -m

#Actualitzo els dominis a la nova ip
ddclient -ip $NOVA_IP -host jibarz.homelinux.net
ddclient -ip $NOVA_IP -host jibarz.homelinux.org
ddclient -ip $NOVA_IP -host jibarz.homelinux.com

fi

Las líneas del dyndns las podeis obviar, son por la ip dinamica. Este script se actualizara cada vez que cambie la ip.

En los servidores tengo puesto como gateway la ip del balanceador. No creo que haya ningun tipo de configuración más importante que ésta. Solo decir que el balanceador está detrás de un router que tiene abierto el puerto 80 hacia él (hacia el balanceador).

Haber si alguien ve donde tengo el fallo... Porque mira que lehe dado vueltas...

Saludos!!!
Hola,

Creo que falta información ...
Qué es lo que falla?
Haciendo un ipvsadm -L -n ves los nodos en la vip?
Qué tipo de balanceo haces con el lvs? direct routing, nat mode??

Saludos,
Hola. Pues sí, sí los veo, de hecho, el resultado del comando que me has pedido és:

deadlock:/home/jibarz/Documents/uni/3r/gasi/exposicio2/arxius# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 80.39.190.199:80 rr
-> 192.168.1.5:80 Masq 1 0 0
-> 192.168.1.4:80 Masq 1 0 0

Por otro lado, la informacion que me pides está en el script, en las líneas comentadas, por si no lo entendeis en catalán (creo que entendible esta parte), el método utilizado és NAT y el tipo de balanceo es el round robin. Tengo los dos puestos correctamente en el kernel creo. Con soporte para LVS, para RR en el LVS, y para el NAT.

El router lo tengo redirigido hacia el balanceador (puerto 80) y la puerta de enlace de los servidores és el balanceador.

La única diferencia entre mi red i la del manual que he seguido http://www.buanzo.com.ar/files/lvs.pdf, és que mi balanceador tiene que enviar al router y el router hacia la ip que ha solicitado el acceso y en el manual, el balanceador parece que sea el router, és decir, recibe la respuesta del servidor web desde dentro de la red y lo envia hacia fuera directamente.

Por eso que a lo mejor tengo que modificar las líneas:

$IPVSADM -A -t $NOVA_IP:80 -s rr

$IPVSADM -a -t $NOVA_IP:80 -r 192.168.1.4:80 -m
$IPVSADM -a -t $NOVA_IP:80 -r 192.168.1.5:80 -m

cambiando la ip de salida, para qeu envie al router y éste envie al ordenador que ha hecho la peticion. O añadir alguna regla de iptables.

He puesto el ethereal en el balanceador y el resultado és el siguiente:

IP_Source IP_Destination TCP 48408 > www [SYN] Seq=0 Ack=0 Win=5840 Len=0 MSS=1460 TSV=1433941 TSER=0 WS=2

donde la ip source es la del cliente (un amigo que engañé para probarlo), ip destination la del balanceador dentro de la red local ( 192.168.1.2).

i como resposta:

IP_SOURCE IP_DESTINATION TCP www > 48408 [RST, ACK] Seq=0 Ack=0 Win=0 Len=0

donde ip_source és la del balanceador ( 192.168.1.2) i la del destino la de antes. Pero como se puede ver, se rechaza la conexión (RST). A que puede ser debido??


Haber si alguien ve donde tengo el fallo.

Saludos!!
Jose.
2 respuestas