?>/script>'; } ?> Balanceo de carga en linux Widgets Magazine

Autor Tema: Balanceo de carga en linux  (Leído 35774 veces)

0 Usuarios y 1 Visitante están viendo este tema.

rh3nt0n

  • Visitante
Balanceo de carga en linux
« en: 11-06-2007, 22:15 (Lunes) »
Citar
Varios interfaces conectados a un ADSL (Load balancing)
June 8th, 2007 by Busindre

Muchas veces tenemos varios interfaces de red (Ethernet / Wireless) que sobran y no se les da todo el uso que merecen. Vamos a ver como poder usar múltiples tarjetas conectadas todas a un solo ordenador y a un mismo router ADSL, de forma que el trafico sea repartido entre todos los interfaces de red que dispongamos (Balanceo de carga).

Esto puede carecer de utilidad a simple vista, pero permite aumentar el ancho de banda en una red LAN y le da más confiabilidad a la conexión, ya que cuando un interfaz muere los demás se reparten el trabajo siendo transparente para el usuario. Lógicamente, aunque carezca de poca importancia, también complicaría un poco el entendimiento del tráfico capturado por un supuesto espía de la red.

Ejemplo de aumento de ancho de banda:

Tarjeta FastEthernet (100 Mbps) + Wireless (11 Mbps) + Wireless (54) Mbps = 165 Mbps (Teóricos)

NOTA: Por supuesto hablamos del ancho de banda de la red LAN, el ADSL contratado no varía lógicamente. Para lograr un aumento del ancho de banda ADSL, cada interfaz de red debe conectarse a otro router ADSL para sumar los anchos de banda, no es el caso.

GNU/Linux se encarga automáticamente del balanceo de carga entre los interfaces si usamos kernels no muy antiguos. Solo debemos de crear unas ip virtuales en el router e indicar a GNU/Linux las rutas por defecto (A esas ip virtuales) con misma métrica para que el trafico pueda ser batido entre interfaces, como veremos en el ejemplo de fácil comprensión.

Opciones del kernel activadas

equal cost multi path (Por norma activada)

En Kernel 2.6 ademas es recomendable activar:

Dentro de IP: Virtual Server Configuration > IP virtual server support

TCP load balancing support
UDP load balancing support
ESP load balancing support
AH load balancing support

NOTA: Por norma si el kernel es nuevo todo esto viene activado.

Comandos interesantes:


ip route show -> Muestra las rutas.
ip route show cache -> Muestra las rutas en cache.
ip route flush default -> Borra las rutas.
ip route flush cache -> Borra las utas de la cache.

Permitir que linux enrute (Permite a GNU/Linux pasar paquetes entre los distintos interfaces de red)

# echo 1 > /proc/sys/net/ipv4/ip_forward

NOTA: Obligatorio hacerlo antes de levantar los interfaces !!

Ficheros de interes:

/proc/net/rt_cache -> Rutas de la cache
/proc/sys/net/ipv4/route/gc_timeout -> Tiempo usado por el kernel para eliminar una ruta.
/proc/sys/net/ipv4/route/max_size -> Tamaño máximo de la caché de rutas. Se eliminan entradas antiguas cuando la caché alcance el limite.

Demos paso al ejemplo practico para ver como implementar el balanceo.

Interfaces usados

eth0 (Fastethernet) 100 Mbps
rausb0 (Wireless 11g) 54 Mbps
wlan (Wireless 11b) 11 Mbps

Router: Xavi Wireless x7868r (ADSL)

Configurando las direcciones IP:

Lo primero que debemos hacer es configurar el router para que escuche peticiones de múltiples redes. En el caso del ejemplo usaremos la redes:

192.168.1.1 / 255.255.255.0 (Default)
192.168.2.1 / 255.255.255.0 (Virtual)
192.168.3.1 / 255.255.255.0 (Virtual)

Pocos son los routers ADSL que no permiten aplicar alias a los interfaces que permita el acceso al mismo con varias ip pertenecientes a distintas redes. Mostraremos como hacerlo en el router Xavi, pero como comente en los demás el proceso de creación sera distinto, pero no por ello complicado. El nombre que suele recibir es "Segmentación de Red- IP alias".

Navegador: 192.168.1.1 -> "LAN Settings.." -> "Change default LAN port IP address" -> "Advanced..." -> Creamos las ip de la forma anteriormente comentada.

En otros routers por ejemplo Zyxel la forma de hacerlo seria esta.

Una vez tenemos debidamente configurado el router para responder peticiones desde distintas redes, tenemos que crear las direcciones IP de los interfaces que conectaran al router, ya sean ethernet o wireless. El router al que intentamos conectar en este ejemplo usa encriptación WEP de 64 bits, para darle un poco mas jugo veamos que pasos realizar para conectarnos con las distintas tarjetas. Lo haremos de forma estándar ya que cada distribución de GNU/Linux permite configurar la red de formas distintas con distintas aplicaciones gráficas, archivos de configuración y demás. Al hacerlo mediante comandos estándar debería de funcionar en todas las distros.

Direcciones IP de los interfaces:

192.168.1.33 / 255.255.255.0 (Wlan0) -> Wireless
192.168.2.1 / 255.255.255.0 (Rausb0) -> Wireless
192.168.3.1 / 255.255.255.0 (eth0)

* Conectando wlan0 a la red Wireless:


#wlanctl-ng wlan0 lnxreq_ifstate ifstate=enable
#wlanctl-ng wlan0 dot11req_mibset mibattribute=dot11PrivacyInvoked=true
#wlanctl-ng wlan0 dot11req_mibset mibattribute=dot11WEPDefaultKeyID=0
#wlanctl-ng wlan0 dot11req_mibset mibattribute=dot11WEPDefaultKey0=aa:aa:aa:aa:aa
#wlanctl-ng wlan0 lnxreq_autojoin ssid=Wireless_gratis authtype=opensystem

* Configurando dirección IP de wlan0:


#ifconfig wlan0 192.168.1.33 netmask 255.255.255.0 broadcast 192.168.1.255
#route add default gw 192.168.1.1 dev wlan0

* Conectando rausb0 a la red Wireless:


# iwconfig rausb0 essid Wireless_gratis mode managed channel 2
# iwconfig rausb0 key aaaaaaaaaa

* Configurando dirección IP de rausb0:

#ifconfig rausb0 192.168.2.33 netmask 255.255.255.0 broadcast 192.168.2.255
#route add default gw 192.168.1.1 dev rausb0


* Configurando dirección IP de eth0:


# ifconfig eth0 192.168.3.33 netmask 255.255.255.0 broadcast 192.168.3.255
# route add default gw 192.168.33.1 dev eth0

Comprobando que están todas las Interfaces correctamente conectadas:

# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 * 255.255.255.0 U 0 0 0 eth0
192.168.2.0 * 255.255.255.0 U 0 0 0 rausb0
localnet * 255.255.255.0 U 0 0 0 wlan0
loopback * 255.0.0.0 U 0 0 0 lo
default 192.168.3.1 0.0.0.0 UG 0 0 0 eth0
default 192.168.2.1 0.0.0.0 UG 0 0 0 rausb0
default 192.168.1.1 0.0.0.0 UG 0 0 0 wlan0

Ahora mediante cualquier monitor / analizador de la red (gkrellm, net-applet, etc.. ) debemos hacer ping a las distintas direcciones ip del "gateway / router / puerta de enlace predeterminada,.." Es decir, si hago un ping a una ip del gateway debemos de observar actividad en la interfaz de red unida a dicha red del gateway:

ping -s 999 192.168.3.1 -> Debe mostrarse actividad en el interfaz eth0
ping -s 999 192.168.2.1 -> Debe mostrarse actividad en el interfaz rausb0
ping -s 999 192.168.1.1 -> Debe mostrarse actividad en el interfaz wlan0

De no ser así, es que alguna red falla (Problemas Wireless / Direccionamiento IP / Fallo en la creación de la ip-virtual del router) y no se batirá carga a través de ella. Este paso es importante ya que aunque sin tener tres interfaces de red el router también contestaría a cualquiera de esas ip teniendo una sola tarjeta de red, se debe tener en cuenta.

Una vez todas las interfaces estén funcionando correctamente GNU/Linux se encargará de batir la carga de forma efectiva entre las interfaces de red. Veamos un ejemplo de como quedaria una salida del comando iwconfig para ver de que forma aparecen configuradas las tarjetas wireless:
PLAIN TEXT
XML:
rausb0    RT73 WLAN  ESSID:"Wireless_gratis"  Nickname:"busipc"
          Mode:Managed  Frequency=2 MHz  Access Point: 00:01:38:68:02:D9   
          Bit Rate=54 Mb/s   
          RTS thr:off   Fragment thr:off
          Encryption key:AAAA-AAAA-AA
          Link Quality=77/100  Signal level:-62 dBm  Noise level:-99 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

wlan0     IEEE 802.11-b  ESSID:"Wireless_gratis"  Nickname:"Wireless_gratis"
          Mode:Managed  Frequency:2.417 GHz  Access Point: 00:01:38:68:02:D9   
          Bit Rate:11 Mb/s   Tx-Power:18 dBm   
          Retry min limit:8   RTS thr:off   Fragment thr:off
          Encryption key:AAAA-AAAA-AA   Security mode:open
          Link Quality=65/92  Signal level=-34 dBm  Noise level=-100 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Veamos como el Kernel mueve / balancea la carga entre las tres interfaces:

Balanceo de carga con tres interfaces

El orden es el siguiente, de izquierda a derecha eth0, rausb0 y wlan0. Como podemos apreciar en eth0 tenemos fullduplex, subida y bajada por el mismo interface, en los otros dos solo tenemos bajada. también a parte de balancear en cuanto a la subida y bajada lo hace por protocolo.

eth0 -> TCP, SMTP, UDP, BITTORRENT, DNS, HTTP Y MSNMS (Subida y bajada)
rausb0 -> TCP y MSNMS (Bajada)
wlan0 -> BITTORRENT y UDP (Bajada)

Como vemos lo hace de forma organizada, ahora veamos que ocurre si perdiéramos un interfaz,.. por ejemplo el ethernet, quedándonos solo con las dos tarjetas wireless unidas al router / punto de acceso.

Balanceo de carga con dos interfaces wireless

Como vemos en la imagen, de la subida se encarga una tarjeta y de la bajada la otra. Pero también podemos encontrarnos con que bate la carga de la siguiente forma:

Balanceo de carga con dos interfaces wireless, en modo fullduplex las dos

Cada interfaz maneja tanto trafico de subida y de bajada. Como vemos puede ser muy variante la forma en la que GNU/Linux balancea la carga entre interfaces dependiendo del momento, la carga, los interfaces, el orden de las rutas por defecto,.. Como vemos algo muy fácil al alcance de todo el mundo y que permite usar las interfaces de red que nos sobran, aumentando un poco la estabilidad y el ancho de banda de nuestras conexiones.

extraido de aki:
http://www.busindre.com/varios-interfaces-conectados-a-un-adsl-load-balancing/#more-1063
http://foro.elhacker.net/index.php/topic,132517.msg791693.html#msg791693

Para que no se pierda ;)
saudos

devil_demon

  • Visitante
Re: Balanceo de carga en linux
« Respuesta #1 en: 30-06-2009, 20:23 (Martes) »
Muy interesante, yo estoy intentando montar un sistema debian con balanceo de carga para que haga de proxy-enroutador en un ciber con 3 taretas de red, las dos primeras iran cada una a un router adsl distinto ya que tiene contratadas dos lineas adsl y la tercera interface ira al switch donde se conectan el resto de Pcs. Los pcs en su configuracion pondran de puerta de enlace el pc con debian y ese sistema montado y los paquetes saldran por los dos adsl con balanceo de carga.

Cuando lo consiga pondre como hacerlo claramente mientras tanto el que se atreva le dejo la guia que estoy siguiendo.
http://gnu-haldrik.blogspot.com/2009/05/balanceo-de-carga-con-dos-adsl-y-lenny.html


Tambien este interesante hacer bonding que consiste en tener dos tarjetas de red al switch en un ordenador para darle redundancia de errores y en teoria duplicar la velocidad, pero bueno hay unos cuantos modos, es como Raid de tarjetas de red.

Os dejo otro interesante link sobre el bonding

http://crysol.inf-cr.uclm.es/es/node/811
« Última modificación: 30-06-2009, 22:25 (Martes) por devil_demon »