Balanceo de carga

Cuando tenemos un router conectado a internet, hay ocasiones en las que no es suficiente con realizar el encaminamiento a través de un solo proveedor de acceso a internet, sino que es necesario realizar un balanceo de carga entre varias líneas de conexión a internet, como por ejemplo dos lí­neas ADSL.

Al balancear la carga entre varias líneas podemos decidir qué parámetro tener en cuenta para realizar ese balanceo: podemos realizarlo en base a las direcciones IP origen, la dirección IP destino, el puerto origen o destino u otros factores. La configuración que se muestra a continuación balancea la carga de forma aleatoria entre los dos accesos a internet en base al peso que se otorgue a cada enlace. Con esto se consigue repartir la carga entre los dos enlaces en base a su disponibilidad de ancho de banda, por ejemplo.

Realizar un balanceador de carga es una tarea que se puede realizar de forma muy sencilla utilizando un router con GNU/Linux siguiendo los siguientes pasos:

Datos previos

Si suponemos los siguientes datos:

eth0: Interfaz conectado a un ADSL
eth1: Interfaz conectado a otro ADSL
IP0: Dirección IP de la máquina en eth0
IP1: Dirección IP de la máquina en eth1
GW0: Dirección IP del gateway en el interfaz eth0
GW1: Dirección IP del gateway en el interfaz eth1
NET0: Subred de la salida ADSL 0
NET1: Subred de la salida ADSL 1

Definir tablas de rutas

Definir dos tablas de routing auxiliares en el fichero /etc/iproute2/rt_tables, simplemente añade estas dos lí­neas:

2 T0
3 T1

Añadir rutas de encaminamiento

Añadir información a las dos tablas auxiliares con información de routing de cada una de las dos salidas:

ip route add default via GW0 dev table T0
ip route add NET0 dev eth0 src IP0 table T0
ip route add default via GW1 dev table T1
ip route add NET1 dev eth1 src IP1 table T1

Añadir las reglas de encaminamiento

Añadir las reglas necesarias para utilizar cada una de las dos tablas auxiliares:

ip rule add from IP0/32 table T0
ip rule add from IP1/32 table T1

Añadir la ruta por defecto

Añadir la ruta por defecto en la tabla principal, que se encarga de repartir la carga. Puedes cambiar el peso de cada enlace después del parámetro weight:

ip route add default scope global nexthop via GW0 dev eth0 weight 1
nexthop via GW1 dev eth1 weight 1

Y esto es básicamente lo que hay que hacer. Aunque recomiendo echar un vistazo a las siguientes direcciones donde lo explican más en detalle:

Howto del LARTC y en especial al apartado que hablan sobre balanceo de carga.

Y como siempre lo mejor es hacer uso de tcpdump y comprobar lo que está pasando por cada interfaz.