Conexiones múltiples a Internet. Balanceo de carga.
En este artículo detallo la configuración de red necesaria para gestionar varias conexiones a Internet de forma que se facilita el reparto de carga entre éstas basado en la decisión de enrutamiento del kernel.
Este balanceo de carga no es perfecto, ya que las rutas se cachean, de forma que la misma dirección será servida siempre por la misma interfaz hasta que se limpie la cache.
La parte original de este artículo radica en que la configuración que se presenta permite realizar el reparto de carga entre redes idénticas, por redes idénticas me refiero a redes con la misma dirección, máscara y gateway, al contrario que en todos los ejemplos citados en la literatura al respecto que siempre realizan las conexiones sobre redes distintas, lo cual por otra parte se supone que es lo más habitual.
La configuración de ejemplo se realiza sobre dos interfaces, una de ellas inalámbrica, ya que son las interfaces de las que yo dispongo.
Script
#!/bin/bash
# split.sh
# XAE. J2E2. 11/07/08
# Gestión de dos conexiones a Internet.
# Balanceo de carga
# El balanceo de carga se realiza en las tablas de routing, de forma que no se
# puede considerar un balanceo de carga al uso, ya que una vez que se decide
# enrutar una red en una de las tablas ésta hace uso de la misma interfaz hasta
# que se limpie la caché.
#
# Se definen tantas tablas de routing como interfaces.
# Se crea una ruta multipath con balanceo de carga que incluye a las interfaces
# definidas.
#
# Las conexiones no tienen porque pertenecer a redes distintas, es decir se
# puede realizar la conexión a dos redes idénticas con incluso la misma
# dirección asignada como gateway, al contrario que en todos los ejemplos
# citados en la literatura al respecto que siempre realizan las conexiones sobre
# redes distintas, lo cual por otra parte se supone que es lo más habitual.
# Para evitar la limitación de redes distintas hay que incluir en cada tabla
# explícitamente el dispositivo en la definición de cada gateway, para evitar
# que tome el definido por otra red idéntica.
# En el balanceo de carga se debe utilizar la dirección IP como selector en
# lugar de la dirección del gateway, ya que esta es múltiple; de esta forma el
# algoritmo de balanceo dispone de dos IP's distintas sobre las que elegir.
# Todo esto se tiene que poder hacer usando iptables, aunque de esta forma
# parece mucho más sencillo.
#
# El sistema es tolerante a fallos.
# Si una de las interfaces falla no falla todo el sistema.
# La recuperación es automática en el caso de conexiones de red cableada pero
# las conexiones inalámbricas precisan intervención manual, creo que la
# recuperación tras fallo se puede automatizar.
#
# Ejemplo con dos interfaces
IF1="eth1" # Interfaz
IP1="192.168.1.11" # IP
P1="192.168.1.1" # Gateway
P1_NET="192.168.1.0/24" # Red
#Wifi
IF2="eth2"
IP2="192.168.1.12"
P2="192.168.1.1"
P2_NET="192.168.1.0/24"
# Reinicializa las conexiones
ip address flush dev $IF1
ip link set $IF1 down
ip address flush dev $IF2
ip link set $IF2 down
sleep 1
ip link set $IF1 up
ip link set $IF2 up
sleep 1
# Balanceo de carga
# eth1
# Se utiliza la tabla 1
ip address add $IP1 dev $IF1
ip address add $P1_NET dev $IF1
ip route add $P1_NET dev $IF1 src $IP1 table 1
ip route add default via $P1 dev $IF1 table 1
# eth2
# Se utiliza la tabla 2
ip address add $IP2 dev $IF2
ip address add $P2_NET dev $IF2
ip route add $P2_NET dev $IF2 src $IP2 table 2
ip route add default via $P2 dev $IF2 table 2
# Reglas
# Cada IP ha su tabla correspondiente
ip rule add from $IP1 table 1
ip rule add from $IP2 table 2
# Ruta multipath
# Balanceo de carga en función de $IP1/2
ip route add default scope global equalize nexthop via $IP2 dev $IF2 weight 1 nexthop via $IP1 dev $IF1 weight 1
# Limpia la cache
ip route flush cache
# Este truco hace que se 'despierte' la interfaz wifi
iwconfig $IF2 mode monitor
sleep 1
iwconfig $IF2 mode managed
exit 0
Detalles
Lo que hacemos es crear tantas tablas de routing como interfaces y las configuramos con la salvedad de que a la hora de definir el gateway incluimos de forma explícita el dispositivo de la interfaz, de esta forma podemos tener en cada tabla un gateway con la misma dirección de red y que el kernel sea capaz de diferenciarlos.
A la hora de crear la ruta multipath que realiza el balanceo de carga utilizamos como selector no la dirección del gateway, como es lo habitual y que en este caso son la misma dirección, sino la dirección de la interfaz de red de forma que el sistema dispone de dos valores diferentes para poder elegir la ruta.
Esta configuración interfiere con el NetworkManager, de forma que hay que deshabilitarlo.
Las redes inalámbricas han de estar configuradas antes de ejecutar el script, es decir han de estar asociadas al punto de acceso.