martes, 20 de marzo de 2012

Unir conexiones ADSL-Wifi


Introducción

Conceptos previos, conceptos erróneos y funcionamiento del protocolo de Internet

Cuando alguien entra a su casa , generalmente entra por la puerta , o si es medio paranoico, tal vez por la ventana. Pero nunca por las dos a la vez, ya que un cuerpo partido a la mitad no puede sobrevivir.

En el modelo TCP/IP pasa exactamente lo mismo. Un paquete sale (petición) y entra (respuesta) "obligadamente" siempre por la misma gateway y mismo DNS.

Si un paquete saliera por una puerta de enlace "1", deberia volver por la misma, porque sino se perdería. (time to live, traceo , etc) 
 
Resumiendo, se puede sumar y aumentar la velocidad global de descargas, pero no la de un archivo en particular.

Teóricamente no es posible descargar 1 solo archivo con dos conexiones diferentes. La razón de esto, es que cuando uno empieza a descargar un archivo de un servidor, el servidor estable una espiece de "tunel" entre tu direccion IP y el para asi poder comunicarse. Dado que las dos conexiones de internet tienen diferentes direcciones IP, el servidor sólo establecera conexión con alguna de las dos. En teorçoa es posible hacerle creer al servidor que las dos conexiones estan bajo 1 sola IP, pero eso causaria un caos al tratar de recibir los paquetes de datos, porque no existe ningún protocolo que regule este tipo de transferencia de datos.

Pero si podemos hacer que este archivo se descargue por segmentos y posteariormente unimos los trozos, con lo que al final el resultado que obtendremos será la suma de bambas conexiones.

Por lo tanto no resulta tan sencillo "sumar" dos conexiones a internet, porque el protocolo tcp/ip tiene ciertas limitaciones. Pero si podremos hacerlo por hardware rápidamente tal y como veremos más adelante.

Lo que normalmente se hace es repartir (que no es lo mismo que sumar a la vez dos conexiones) 2+2 = 4, pero a veces es mejor que unos usen 2 y los otros 2 y no que todos usen 4 a la vez.

Podemos repartir el ancho de banda de varias maneras (QoS) (Calidad del servicio)

- Podemos usar una conexión para navegar y otra para bajar ficheros (por el tipo de tráfico, http, ftp, smtp, pop3, skype, youtube, escritorio remoto), por rangos de ip (por departamentos de trabajo, etc) que unas salga por una conexión y otras por otra)

- Podemos configurar cuánto saldrá por cada WAN y cuantó entrará (kbps) así si abres en tu PC youtube saldra por WAN1 y si entras a otras webs por WAN2, igual puedes deperminar dominios que salgan por determinada WAN

- Podemos distrubir las solicitudes procedentes de la LAN a través de una politica "round-robin" (por peso) a través de múltiples pasarelas de Internet. En otras palabras, si en un determinado momento sólo hay un usuario de internet haciendo sólo una conexión TCP (por ejemplo, se ejecuta sólo una descarga desde la web), su tráfico se derivará a traves de una única pasarela, por lo que no habría beneficio en el equilibrado de conexiones. En cambio, si la LAN está repleta de usuarios, cada uno ejecutando múltiples solicitudes al mismo tiempo, como un todo, sus conexiones tendrán acceso a un mayor ancho de banda, lo que equivale a la suma de los anchos de banda de acceso único.

IP Failover (fail over, a prueba de fallas)

Failover es cuando tenemos una o más conexiones y cuando falla una salimos automáticamente por la otra que si que funcione. También llamado conexión redundante. Si una de las líneas falla, el router continua automáticamente la conexión utilizando exclusivamente la segunda.

para no aburrirte, te dejo unas nenas bien lindas...
 




   Ahora vamos a la practica...


a) Balanceo de Carga (Load balancing)
¿Qué es?
Repartir ancho de banda

El balanceo no suma, reparte.


b) Sumar ancho de banda (Bonding)
Juntar conexiones, unir conexiones, sumar dos conexiones o más

Bonding: ip network multipathing con LINUX

¿Qué es el bonding? Es un driver que originalmente venía con los parches para clusters beowulf, desde hace un tiempo se puede implementar en un kernel 2.2X, 2.4X y 2.6x ¿Pero qué hace realmente?¿Para que sirve? Es la forma de tener dos tarjetas de red funcionando como una sola y aprovechando el ancho de banda de las dos a la vez En definitiva con bonding (ip network multipathing) tendríamos dos tarjetas de red físicas y por encima una virtual que suministra el servicio.

El bonding es una técnica que permite agregar varios interfaces de red físicos en uno único virtual. A cada interfaz físico se le denominará slave (esclavo). Con esto podemos realizar un balanceo de carga entre las dos interfaces y conseguir un ancho de banda final igual a la suma de los anchos de banda de cada slave.

Necesitamos al menos dos conexiones a internet para hacer bonding.

Tipos de Balanceos de Carga con bonding:

Round Robin balance-rr (modo 0)
Va repartiendo el tráfico (entrante) asignando de forma rotatoria cada conexión a una entrada WAN distinta, es decir, la primera a la WAN 01, la siguiente a la WAN 02, la tercera de nuevo a la WAN 01, ...

Se emplea un algoritmo round robin entre la cola virtual y las de los esclavos. Es algo así como: un paquetillo para un esclavo, otro para otro esclavo, un paquetillo para un esclavo, otro para el otro... etc. Es el algoritmo que se usa por defecto.

active-backup (modo 1):

Realmente no balancea la carga, usa sólo un esclavo y en caso de fallar, usa el siguiente disponible. Si falla el activo, pasa al slave (pasivo)

balance-xor (modo 2):

Para transmitir una trama lo hace basado en el siguiente calculo: (MAC de origen XOR MAC destino)%numero de interfaces slaves. De esta manera para cada MAC de destino se selecciona una interfaz en concreto. Este modo nos ofrece balanceo de carga y tolerancia a fallos.

broadcast (modo 3):

se transmite todo por todas las interfaces. Este método no balancea tampoco, pero provee tolerancia a fallos.

802.3ad (modo 4):

Se trata del estandard IEEE 802.3ad (Dynamic link aggregation) también llamado “port trunking“. Permite la definición de agregados ofreciendo alta disponibilidad

balance-tlb (modo 5):

balancea la carga de transmisión entre los esclavos dependiendo de la velocidad de estos y de la carga total. El tráfico es recibido por un esclavo, en caso de fallar otro esclavo toma su MAC y continúa recibiendo tráfico.

balance-alb (modo 6)

realiza el balanceo anterior además de un balanceo también en la recepción.


Otros tipos de balanceo de carga en aparatos de hardware:

Basado en sesiones
Cada conexión de salida se compone de varias conexiones TCP/IP, el router reparte las conexiones de cada sesión entre los dos puertos WAN. Un ejemplo, una página de Internet tiene una sesión TCP/IP por cada elemento de la misma, cuando un usuario se conecta a esa página Web a través del router XiNCOM, los elementos de la página se descargan paralelamente y a la vez utilizando las dos líneas WAN de forma simultanea, es decir, repartiendo los elementos entre las dos líneas de conexión.

Basado en paquetes
En lugar de repartir las conexiones TCP/IP de una sesión, el balanceo de carga basado en paquetes reparte los paquetes de cada conexión TCP/IP entre los dos puertos WAN.

Funcionamiento

¿Cómo lo hacemos?

- Mediante Software

En Windows con el programa WinGate, Double surfer, mobile net switch
virtualwifi, BVRP Connection Manager, MultiNetwork Manager, WiFi Hopper 1.2
Midpoint Internet LoadBalancer, etc

Con el comando "route" (modificando la tabla de rutas, la ruta de encaminamiento, cambiando la puerta de enlace (gateway))

En Linux con pfsense (una distrbución liviana basada en FreeBSD derivada de m0n0wall), Brazilfw, o Mikrotik

pfSense permite balanceo de carga (load balancing) con detección de fallo (fail-over)
con fail-over. Permite además añadir un Portal Cautivo o captivo (hotspot), OpenVPN, gestión del ancho de banda (limitar y repartir ancho de banda) (Traffic Shape), tráfico por prioridades, etc

Con los comandos iproute2

Ejemplos

________
+------------+ /
| | |
+-------------+ Provider 1 +-------
__ | | | /
___/ _ +------+-------+ +------------+ |
_/ __ | if1 | /
/ | | |
| Local network -----+ Linux router | | Internet
_ __/ | | |
__ __/ | if2 |
___/ +------+-------+ +------------+ |
| | |
+-------------+ Provider 2 +-------
| | |
+------------+ ________

Datos previos

Si suponemos los siguientes datos:

Citar
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:

Código:
[color=#000000]2 T0
3 T1[/color]

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:

Código:
[color=#000000]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[/color]

Añadir las reglas de encaminamiento

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

Código:
[color=#000000]ip rule add from IP0/32 table T0
ip rule add from IP1/32 table T1[/color]

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:

Código:
[color=#000000]ip route add default scope global nexthop via GW0 dev eth0 weight 1
nexthop via GW1 dev eth1 weight 1[/color]

Ejemplo 2:

Cómo juntar dos ADSL

Nomenclatura:

Citar
eth0 -> primer interfaz conectado a la ADSL1
192.168.1.1 -> IP asociada a eth0
192.168.1.2 -> IP del router ADSL1
192.168.1.0/24 -> subred donde hay ADSL1

eth1 -> primer interfaz conectado a la ADSL2
192.168.2.1 -> IP asociada a eth1
192.168.2.2 -> IP del router ADSL2
192.168.2.0/24 -> subred donde hay ADSL2

Primero:
Crear dos tablas de rutas adicionales al fichero /etc/iproute2/rt_#tables/.
Es tan sencillo como abrir el fichero con un editor de texto y añadir las dos líneas siguientes:
200 ADSL1
201 ADSL2

Segundo:
Asignamos cada subred a la tabla e interfaz correspondiente.
Desde el prompt del sistema:
Código:
[color=#000000]# ip route add 192.168.1.0/24 dev eth0 src 192.168.1.1 table ADSL1
# ip route add default via 192.168.1.2 table ADSL1
# ip route add 192.168.2.0/24 dev eth1 src 192.168.2.1 table ADSL2
# ip route add default via 192.168.2.2 table ADSL2[/color]

Tercero:
Ahora hace falta asegurar que el servidor contesta por la misma interfaz que se ha hecho la petición.
Código:
[color=#000000]# ip route add 192.168.1.0/24 dev eth0 src 192.168.1.1
# ip route add 192.168.2.0/24 dev eth1 src 192.168.2.1[/color]

Quarto:
Sólo hace falta crear la ruta por defecto balanceada.
Código:
[color=#000000]# ip route add default scope global netxhop via 192.168.1.2 dev eth0 weight 1 nexthop via 192.168.2.2 dev eth1 weight 1[/color]

- Mediante Hardware

Routers de doble Wan (Dual Wan) "Multihomed" o "Multiwan".

Balanceador de carga con el protocolo CARP (Common Address Redundancy Protocol), básicamente es proporciona redundancia. Es decir que si tu internet falla, el software lo detecta en decimas de segundo y te hace el switch hacia el enlace bueno, el usuario nunca se da cuenta cuando falla el servicio.

Muxing, multiplexar líneas ADSL.

Sólo es posible por hardware.


Limitar y Repartir ancho de banda

Palabras claves: Traffic Shapper o Traffic Shapping, QoS, fair queuing

QoS (Quality of Service o Calidad de Servicio) es un conjunto de protocolos y tecnologías que garantizan la entrega de datos a través de la red en un momento dado. Una de las principales metas de QoS es la priorización.

Por defecto, cuando enviamos información por una interfaz (tarjeta de red en este caso) las tramas de datos se encolan en una pila FIFO: la primera trama en entrar, es la primera en salir.

Configurar QoS (Quality of Service) en el router.

Los routers Zyxel llevan la opción "Media Bandwidth Management"
http://www.adslzone.net/tutorial-20.18.html

Los routers CT Comtrend para configurar el QoS debes ir a Advanced Setup => Quality of Service dentro de la configuración del router.

Con Mikrotik PCQ (Queues)

Con PfSense y su opción de Traffic Shape.

Con un router que acepte firmware dd-wrt

Programas para Windows como el NetPeeker que permite repartir el ancho de banda (tanto de subida como de bajada) para cada aplicación.

Más programas:

El NetLimiter o el DU Super Controler, o el WebScout, y el Bandwidth Speed Balancer, el Bandwidth ControllerWinTC,
DU MeterNet Peeker,

Para limitar el ancho de banda en Linux hace bastante tiempo que se puede usar:

- iproute2 (TC, traffic control)
- cbq.init

Y para controlar el ancho de banda no, pero para medirlo y controlar mucha más información está el ntop,

http://www.openxtra.com/products/ntop-xtra.htm

espero que puedan aplicar este concepto, lo cual mejoraría en sobremanera la velocidad de descarga y navegación.