Nube de tags

Con la colaboración de ...

Preferimos Linux

Síguenos en Facebook

Diario informal de K-nábora

sep 22
2009

Balanceo de Carga con dos ADSL y Debian Lenny

Enviado por K-nábora Bufete Tecnológico en networkinglinux

Hola, quién halla llegado a este artículo ya sabe lo que quiere, entonces no me tomaré el tiempo de explicar de que se trata el balanceo de carga de conexiones a internet.

Para nuestro caso contamos con lo siguiente:

  • Debian Lenny AMD64 (igual para i386)
  • Kernel 2.6.26-2-1-amd64
  • Tres tarjetas de red Ethernet
  • Dos conexiones ADSL
  • Switch o AP inalámbrico
  • Cerebro inquieto y paciente
  • Café, mucho café.
Bien, lo primero es describir como está la red y las conexiones, para ello tenemos el siguiente dibujito:



Lo único que hay que tener en cuenta para que esta configuración funcione es quitarle los gateway a todas las interfaces de red, quedando entonces su /etc/network/interfaces sin líneas que digan gateway. En el sentido mas estricto tendríamos que limpiar la tabla main y esas cosas pero en fin, no es necesario y se pueden obviar algunos mensajes de error.

Este es mi /etc/network/interfaces:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback
address 127.0.0.1
netmask 255.0.0.0

# The primary network interface
# LAN
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
auto eth0

# ADSL1
allow-hotplug eth1
iface eth1 inet static
address 10.1.0.2
netmask 255.255.255.0
network 10.1.0.0
broadcast 10.1.0.255
#gateway 10.1.0.1
dns-nameservers 10.1.0.1 10.1.1.1

auto eth1

# ADSL2
iface eth2 inet static
address 10.1.1.2
netmask 255.255.255.0
network 10.1.1.0
broadcast 10.1.1.255
#gateway 10.1.1.1
dns-nameservers 10.1.1.1 10.1.0.1

auto eth2


A continuación dos scripts usados suficientemente comentados, incluyendo el NAT para la red local (compartir internet) y redireccionamiento para proxy transparente (pueden quitarlo si prefieren), estos scripts deben ponerse a correr desde /etc/rc.local o como prefieran, primero el de rutas y luego el de NAT
. Antes de ejecutar los scripts debemos agregar las tablas de rutas al archivo de rutas, esto se hace una sola vez:

echo 200 T1 >> /etc/iproute2/rt_tables
echo 201 T2 >> /etc/iproute2/rt_tables
echo 202 lento >> /etc/iproute2/rt_tables
echo 203 rapido >> /etc/iproute2/rt_tables


#!/bin/bash

IF0="eth0" # Interface conectada a la LAN
IF1="eth1" # Interface conectada a ADSL1 Lenta
IF2="eth2" # Interface conectada a ADSL2 Rápida
IP0="192.168.1.1" # Gateway Local, IP Local
IP1="10.1.0.2" # IP de la IF1
IP2="10.1.1.2" # IP de la IF2
P0_NET="192.168.1.0/24" # Red Local
P1_NET="10.1.0.0/24" # Red para IF1
P2_NET="10.1.1.0/24" # Red para IF2
P1="10.1.0.1" # Gateway para ADSL1
P2="10.1.1.1" # Gateway para ADSL2

# Creo las tablas de rutas para las dos interfaces uplink
echo "Creando las rutas para cada tabla"
ip route add ${P1_NET} dev ${IF1} src ${IP1} table T1
ip route add default via ${P1} table T1
ip route add ${P2_NET} dev ${IF2} src ${IP2} table T2
ip route add default via ${P2} table T2
echo "Hecho."

# Aseguro que cada red enviará sus solicitudes a la ip correcta
echo "Asegurando la ruta para cada interface e IP"
ip route add ${P1_NET} dev ${IF1} src ${IP1}
ip route add ${P2_NET} dev ${IF2} src ${IP2}
echo "Hecho."

# Creo dos reglas para que cada ip se fije a su tabla de rutas
echo "Creando reglas para cada tabla"
ip rule add from ${IP1} table T1
ip rule add from ${IP2} table T2
echo "Hecho."

# Hago el balanceo 1 a 2
echo "Haciendo el balanceo"
ip route add default scope global nexthop via ${P1} dev ${IF1} weight 1
nexthop via ${P2} dev ${IF2} weight 2
echo "Hecho."

# Agrego dos tablas de rutas estáticas para hacer marcado de paquetes sobre ellas
echo "Creando tablas para marcado de paquetes ..."
# Enlace lento
ip rule add fwmark 1 table lento
ip route add table lento via ${P1} dev eth1

# Enlace rápido
ip rule add fwmark 2 table rapido
ip route add table rapido via ${P2} dev eth2

echo "Refrescando las rutas"
ip route flush cache
echo "Hecho."

Y bien, noten que el balanceo se hizo de 1 a 2 para que la conexión rápida trabaje el doble de lo que trabaja la lenta, esto depende en si de lo bueno que sea cada isp y del uso que quieran hacer de cada conexión. Noten que se usa fwmark para marcar cada ruta y así poder usar esta marca en el marcado de paquetes. Existen otras técnicas mucho mas pulidas y con mejores resultados que esta, por ejemplo parchando el kernel para rutas dinámicas y cuanta cosa los gurús saben, pero a mi me va funcionando de 10 esta técnica. Así mismo se pueden usar marcas sobre las tablas T1 y T2, pero aquí están separadas por simple claridad.

Si todo está bien tendríamos las siguientes salidas:

edoras:~# ip route
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
10.1.0.0/24 dev eth1 proto kernel scope link src 10.1.0.2
10.1.1.0/24 dev eth2 proto kernel scope link src 10.1.1.2
default
nexthop via 10.1.0.1 dev eth1 weight 1
nexthop via 10.1.1.1 dev eth2 weight 2


edoras:~#
ip route list table T1
10.1.0.0/24 dev eth1 scope link src 10.1.0.2
default via 10.1.0.1 dev eth1

edoras:~#
ip route list table T2
10.1.1.0/24 dev eth2 scope link src 10.1.1.2
default via 10.1.1.1 dev eth2

edoras:~# ip route show table lento
default via 10.1.0.1 dev eth1

edoras:~# ip route show table rapido
default via 10.1.0.1 dev eth1

Con esto ya tenemos nuestras rutas y balanceo, en este punto el equipo que hace de router en el que estamos aplicando estas reglas debería navegar sin problemas. Pero nos falta el NAT para la red local y es aquí donde entra el otro script, noten como se usan las marcas:

#!/bin/bash

echo "Limpiando Reglas Anteriores..."
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t mangle -F

IF0="eth0" # Interface conectada a la LAN
IF1="eth1" # Interface conectada a ADSL1 Lenta
IF2="eth2" # Interface conectada a ADSL2 Rápida
IP0="192.168.1.1" # Gateway Local, IP Local
IP1="10.1.0.2" # IP de la IF1
IP2="10.1.1.2" # IP de la IF2
P0_NET="192.168.1.0/24" # Red Local
P1_NET="10.1.0.0/24" # Red para IF1
P2_NET="10.1.1.0/24" # Red para IF2
P1="10.1.0.1" # Gateway para ADSL1
P2="10.1.1.1" # Gateway para ADSL2

# Ahora hago el NAT

echo "Activando NAT ..."
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s ${P0_NET} -o ${IF1} -j MASQUERADE
iptables -t nat -A POSTROUTING -s ${P0_NET} -o ${IF2} -j MASQUERADE

# Redirecciono al Proxy
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport http -j DNAT --to ${IP0}":8080"
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport 81 -j DNAT --to ${IP0}":8080"
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport 8080:8099 -j DNAT --to ${IP0}":8080"
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport 3128:3130 -j DNAT --to ${IP0}":8080"

# Hago marcado de paquetes para asegurar que los paquetes de estos puertos encontrarán el camino de vuelta
echo "Realizando marcado de paquetes ..."
iptables -t mangle -A PREROUTING -i ${IF0} -s ${P0_NET} -p tcp --dport 1863 -m state --state NEW,ESTABLISHED,RELATED -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i ${IF0} -s ${P0_NET} -p tcp --dport 6667 -m state --state NEW,ESTABLISHED,RELATED -j MARK --set-mark 2

echo "Listo."

echo "Reglas Aplicadas"
iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v

El buen observador se habrá dado cuenta que con la tabla mangle se marcan los paquetes que pertenecen a determinados protocolos y que esto le da la posibilidad de definir que servicios quiere a través de que enlace, por ejemplo se podría pensar en mandar el molesto P2P a través del enlace lento (tarea para el lector).

Creo que eso es todo, recuerden que a la primera no funciona, que es bueno que lean algo de LARTC para que aprendan sobre rutas y control de tráfico en Linux y que siempre habrá una forma mas elegante, eficiente y simple de hacer las cosas. También recuerden que pueden añadir un servidor dns local, un proxy transparente y todo lo que quieran a esta configuración.

Si falla, reinicien la red y hagan ip route flush table sobre cada tabla creada. Modifiquen y vuelvan a probar.

Aquí un interesante artículo sobre balanceo de carga manual (Definir varios Gateway), puede servir también de acuerdo a la necesidad.


Comentarios (5)add
conexion con 2 adsl
escrito por estuardo gomez , diciembre 22, 2010
Hola buen dia, queria ver si me puedes ayudar, realice los pasos correspondientes para el balanceo de carga, copiando exactamente los pasos a seguir cambiando unicamente los datos de mi red. Al probar este tengo ping desde la pc cliente y puedo entrar al msn pero no logra cargar ninguna pagina web me da un error como que no tuviera los dns estos estan escritos en el cliente pero aun asi me da el mismo problema, espero me puedas ayudar.


Reporte el abuso
Voto negativo
Voto positivo
Votos: +0
Que ocurre exactamente?
escrito por K-nábora Bufete Tecnológico , febrero 12, 2010
Hola Sergio
Que ocurre exactamente? No puedes navegar a traves del proxy? El proxy se ejecuta en el mismo firewall que hace el balanceo de carga?
Si nos das mas datos a lo mejor te podemos ayudar

Un saludo
Reporte el abuso
Voto negativo
Voto positivo
Votos: +0
problema con proxy
escrito por sergio morales , febrero 11, 2010
-buenas disculpa hice esta configuracion con 2adsl y el proxy no filtra
la web no se que pueda estar haciendo mal habra alguna forma de saber
que es lo que ocurre
Reporte el abuso
Voto negativo
Voto positivo
Votos: +1
gracias
escrito por K-nábora Bufete Tecnológico , octubre 02, 2009
Hola Vicente
Gracias por tu aportación con ese enlace. La verdad es que, al contrario que con otro tipo de sistemas o soluciones basadas en Linux, existe muy poca información acerca de como aprovechar y exprimir al máximo las increibles funcionalidades de routing avanzado, y gestión QoS que nos ofrece el nucleo de Linux a través de la "suite" iproute2

Un saludo
Reporte el abuso
Voto negativo
Voto positivo
Votos: +2
Caso de Uso
escrito por Vicente , octubre 02, 2009
Mira esto http://www.damia.net/comos/balance/
Reporte el abuso
Voto negativo
Voto positivo
Votos: +6
Escribir comentario

security image
Escribe los caracteres de la imagen


busy