Balancear la carga manualmente (definir mas de un gateway)

La idea de balancear la carga manualmente es poder definir más de un gateway para distintos destinos, especificados por nosotros mismos. De esta manera, podremos tener dos o más salidas a internet y definir salidas hacia distintos rangos de direcciones ip.

multi gateway

Esto sirve de gran utilidad cuando nos conectamos a una red wifi que –por casualidad– llega hasta nuestro lugar de trabajo o nuestras casas e inocentemente queremos usarla. Por ejemplo, si tenemos un lugar de descargas, podemos dejar una máquina con una ruta estática que haga que cuando conecte a una IP x.x.x.x su salida a internet sea por el gateway predefinido por nosotros.
Para esto vamos a usar el comando route.

En este ejemplo, usaremos los destinos mi blog (este sitio), Google y Yahoo, para definir distintas salidas.
El primer paso consiste en identificar la dirección IP a la que queremos definir un gateway por defecto estático, batsa con que hagamos un ping al dominio de destino.

[zerial@daila ~]$ ping -c1 google.cl
PING google.cl (216.239.59.104) 56(84) bytes of data.
64 bytes from gv-in-f104.google.com (216.239.59.104): icmp_seq=1 ttl=243 time=258 ms
[zerial@daila ~]$ ping -c1 yahoo.es
PING yahoo.es (217.146.186.221) 56(84) bytes of data.
64 bytes from rc1.vip.ird.yahoo.com (217.146.186.221): icmp_seq=1 ttl=53 time=251 ms
[zerial@daila ~]$ ping -c1 blog.zerial.org
PING blog.zerial.org (72.14.186.179) 56(84) bytes of data.
64 bytes from blog.zerial.org (72.14.186.179): icmp_seq=1 ttl=55 time=189 ms

Ya tenemos identificadas las tres direcciones IP de destino:

blog.zerial.org -> 72.14.186.179
google.cl -> 216.239.59.104
yahoo.es -> 217.146.186.221

En nuestra red local tenemos 3 gateways disponibles, por ejemplo los con la direccion ip 192.168.0.1, 192.168.0.2 y 192.168.0.3.
Haremos que para llegar a blog.zerial.org usemos el gateway 1, a google.cl el gateway 2 y a yahoo.es el gateway 3.
Ejecutamos las siguientes reglas:
[root@daila ~]# route add -host 72.14.186.179 gw 192.168.0.1
[root@daila ~]# route add -host 216.239.59.104 gw 192.168.0.2
[root@daila ~]# route add -host 217.146.186.221 gw 192.168.0.3

Podemos comprobarlo haciendo una traza (traceroute) a los distintos destinos, veremos que el primer salto es nuestro nuevo gateway.
[root@daila ~]# traceroute blog.zerial.org
traceroute to blog.zerial.org (72.14.186.179), 30 hops max, 40 byte packets
1 192.168.0.1 (192.168.0.1) 1.582 ms 2.249 ms 3.687 m
[root@daila ~]# traceroute blog.zerial.org
traceroute to google.cl (216.239.59.104), 30 hops max, 40 byte packets
1 192.168.0.2 (192.168.0.2) 2.582 ms 2.256 ms 3.187 m
[root@daila ~]# traceroute yahoo.es
traceroute to yahoo.es (217.146.186.221), 30 hops max, 40 byte packets
1 192.168.0.3 (192.168.0.3) 1.555 ms 1.249 ms 3.688 m

Tambien podemos definir distintos gateways para distintos rangos de direcciones IP, para esto debemos cambiar el parametro -host < host> por -net < NET>.
Por ejemplo, ejecutamos el comando whois sobre la ip de zerial.org
[zerial@daila ~]$ whois 72.14.186.179
[...]
NetRange: 72.14.176.0 - 72.14.191.255
CIDR: 72.14.176.0/20
[...]

Nos interesa lo que dice NetRange y CIDR, entonces ejecutamos:
[root@daila ~]# route add -net 72.14.176.0 gw 192.168.0.2
De esta forma, todas las salidas a las direcciones ip que incluye la red 72.14.176.0 serán despachadas por el gateway 192.168.0.2.

editado Haldrik escribió en su blog algo similar, que nos puede servir para balancear la carga entre dos lineas adsl. Recomiendo leerlo.

5 comentarios

  1. Y si por esas casualidades de la vida obtenemos asi sin querer un wifi de vtr utlizando un router vtr, cada conexion significa una ip diferente, cool xd.

  2. Hola. La verdad no entiendo el sentido de esto. En un primer momento pense que el post se referia balance de carga. Salu2.-

  3. Zerial

    agosto 3, 2009 a las 12:12 am

    @Sebastian: Por eso hago referencia al termino “manual”, no es algo automatico, es un balanceo manual. Tener mas de una salida a internet (mas de 1 adsl) y poder definir porque gateway salir hacia cada red o host.

    Toda esta idea nacio por una conversacon con Haldrik en irc, el por su lado escribio esto:
    http://gnu-haldrik.blogspot.com/2009/05/balanceo-de-carga-con-dos-adsl-y-lenny.html

    saludos

  4. Saludos,
    Muy buena la información.
    Y si en caso de que quisiera enrutar una subred de la red local a un gateway especifico como podría hacerlo?.
    Es decir tengo las siguientes interfaces y red local:
    gw1: 192.168.170.1
    gw2:10.10.10.1
    Red Local: 192.168.10.1
    Si quiero que todo el tráfico de
    192.168.10.5/32 salga por gw1
    Gracias.

  5. Hola Oliver,

    No estoy seguro de que con “route” puedas hacer eso, ya que no puedes router desde un “source”. Tendrias que usar iptables y reenviar el trafico que venta de un source X hacia un destino Y.

    Con route puedes hacer que “todo el trafico HACIA” un rango o una red, se vaya por un GW. Pero no puedes decirle “todo el trafico que VENGA desde”.

    Mira la documentacoin de “route” “ip route” y “iptables”:

    http://linux.die.net/man/8/ip

    http://linux.die.net/man/8/iptables

    http://linux.die.net/man/8/route

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.