Balancear Carga con dos ADSL y un solo equipo proxy: iproute2

Imagen de Taber
0 puntos

Planteemos la situación:

Mi empresa tiene 2 adsl, repartidos como dios le dio a entender, es decir, cada uno tiene configurado de puerta de enlace uno de los dos pero de manera aleatoria. Como os podeis imaginar esto no es solución, ya que cuando se caia un adsl todo el mundo que tubiera ese adsl como puerta de enlace dejaba de tener internet. Tenemos un adsl de 4 megas y otro de 20 megas (bueno teoricos).

Bien, la solución fue el balanceo de carga con los dos adsl, y que ademas asignara diferentes pesos a cada una de las conexiones, para dar mas carga a un adsl que otro. No me voy a parar mucho en explicar los conceptos de redes, asi que puede ser algo "duro" de leer...

Yo pense que esto iba a ser complicado, pero no fue asi. Cogi una maquina antigua, un Pentium III a 733 con 1 Gb y 3 tarjetas ethernet. Instalé una ubuntu como servidor (al final usaremos Debian, ya que recomiendan un Kernel 2.4 para la estabilidad o algo asi... pero con Ubuntu funciona igual de bien). Hay que instalar el paquete "iproute2", con esto tendremos un monton de comandos nuevos que permiten trastear a nivel 3, vamos a nivel IP, con tu linux. A destacar el comando "tc" que te permite hacer un QoS de manera muy sencillita.

Bueno a lo que ibamos:
1.) Tenemos 3 tarjetas ethernet: eth0, eth1, eth2. donde:
eth0 (192.168.0.x) -> red privada (192.168.0.0/24)
eth1 (10.10.10.2) -> adsl1 (10.10.10.1)
eth2 (10.10.11.2) -> adsl2 (10.10.11.1)

Mi maquina que funcionara para balancear carga tiene esta topologia de red, como veis usa 3 subredes. Hay que destacar que la conexion entre los routers de adsl y la maquina, pueden ser cables directamente conectados, o usar un switch... eso depende de los cacharros que tengas por alli :)

2.) Comprobamos que tenemos el comando "ip", si no es asi, mira si has instalado el paquete "iproute". Este comando nos permitirá hacer las rutas y el balanceo de carga.
3.) Inserta esto:
# echo 200 adsl1 >> /etc/iproute2/rt_tables
# echo 201 adsl2 >> /etc/iproute2/rt_tables

Esto nos introduce dos nuevas tablas de enrutamiento llamadas "adsl1" y "adsl2", con esos numeros asociados (mira los que ya estan en uso haciendo un "more /etc/iproute2/rt_tables" y asi no machacar ninguna tabla). Asi podremos definir reglas diferente para cada uno de los adsl sin hacer todo un lio, y ademas poder saber en todo momento que estamos haciendo.
4.) Definimos el enrutamiento de adsl1:
# ip route add 10.10.10.0/24 dev eth1 src 10.10.10.2 table adsl1
# ip route add default via 10.10.10.1 table adsl1

Esto le dice que la red 10.10.10.0 es la red de mi interfaz eth1 con la salida por el adsl.
Compruebalo mediante: ip route show table adsl1
5.) Definimos el enrutamiento del adsl2:
# ip route add 10.10.11.0/24 dev eth2 src 10.10.11.2 table adsl2
# ip route add default via 10.10.11.1 table adsl2

Idem a lo anterior.
6.) Poner las rutas principales:
# ip route add 10.10.10.0/24 dev eth1 src 10.10.10.2
# ip route add 10.10.11.0/24 dev eth2 src 10.10.11.2

Date cuenta que ahora no decimos en que tabla meterlo, por lo que se mete en la tabla principal. Lo anterior era para cuando el trafico ya esta en una de las dos subredes de salida y necesitamos saber como enrutarlo. En cambio las segundas son las primeras reglas para que funcione y las envie dondo debe.
7.) ¿Donde mando esto?
# ip rule add from 10.10.10.2 table adsl1
# ip rule add from 10.10.11.2 table adsl2

Esto sirve para aplicar las reglas almacenadas en cada una de las tablas cuando se cumple que vienen de esas ips.
8.) La madre del cordero: Balanceo de carga.
ip route add default scope global nexthop via 10.10.10.2 dev eth1 weight 1 nexthop via 10.10.11.2 dev eth2 weight 2
Como ves, le he dicho: "Usa eth1 1 de cada 3 veces, sino usa eth2 2 de cada 3 veces".

Solo existe un problema. Las rutas son cacheadas, es decir, si tu pides "www.google.es" y se enruta por adsl1, la siguiente vez, hasta que caduque el cacheo, ira por adsl1... Esto es malo... Ya que si adsl1 se cae, las rutas cacheadas fallaran, aunque adsl2 este disponible, si no estan cacheadas iran por adsl2.
Para solucionarlo, habria que parchear el kernel, segun estos parches: http://www.ssi.bg/~ja/#routes
Aunque con hacer: ip route flush se podria arreglar de manera manual.

Imagen de Gabriel_M
+1
0
-1