¿Cómo fusionar múltiples conexiones de Internet en una?

23

Mi PC tiene un total de 4 NIC, 2 tarjetas de red Gigabit Ethernet con cable y también 2 tarjetas de red inalámbricas. (One Broadcom con controladores propietarios y Ralink con software de código abierto, que funciona mucho mejor que Broadcom).

Mi teléfono celular puede compartir su conexión de forma inalámbrica con mi PC, pero también tengo una conexión a Internet por cable. Entonces tengo múltiples conexiones a Internet para acceder a Internet. ¿Cómo puedo fusionar 2 o más conexiones y equilibrarlas para disfrutar de una experiencia de Internet unificada que es la suma de todas las conexiones de Internet conectadas a ella?

Por ejemplo, si tengo un módem con una conexión a Internet de 1024kB / sy otro que ofrece 512kB / sy uno pequeño que ofrece 128kB / s, después de equilibrar la carga y fusionar todas las conexiones (Bonding o Teaming), podría descargar en una velocidad de 1664kB / s usando las 3 conexiones a Internet como una, por ejemplo.

Esta pregunta siempre me ha intrigado.

Luis Alvarado
fuente
55
Parece bastante más allá del alcance de Ask Ubuntu :) Esto es algo de redes bastante complejo. OMI rara vez vale la pena, para el momento en que tiene en cuenta los paquetes perdidos debido a que un enlace está inactivo (incluso temporalmente), reordenando paquetes debido a que algunos enlaces son más lentos que otros, y esas cosas. No conozco una solución de "caja negra" que haga esto, podría ser un proyecto interesante.
Cesio
99
Bueno, la pregunta es si esto se puede hacer en ubuntu y si es así, cómo.
Luis Alvarado
Creé una respuesta en las 2 conexiones a Internet en una sola publicación de PC . Vinculación de documentos para acotar en Ubuntu.
Lucio
@Lucio Podría marcar la pregunta como duplicada o puede mover su respuesta aquí y puedo marcarla como aceptada. También debería estar preparado para cuando salga 13.04, ya que incluirá en Network Manager las opciones de enlace (solo esclavos de enlace por cable en este momento).
Luis Alvarado

Respuestas:

11

Hago algo así en el trabajo usando Ubuntu 11.04. Ejecutamos la herramienta de configuración de firewall de Shorewall, que además de ser excelente en su trabajo, proporciona algunas herramientas de enrutamiento ISP múltiples rudimentarias que pueden satisfacer sus necesidades. Puede encontrar algunos documentos al respecto aquí: http://www.shorewall.net/MultiISP.html

Sin embargo, todo se reduce a que no puedes usar múltiples ISP para una sola conexión ... las cosas no son tan simples. Lo mejor que puede hacer es tratar de dirigir nuevas conexiones de manera uniforme entre los diferentes proveedores.

Es un problema complejo. Probablemente terminarás golpeándote la cabeza contra la pared (ciertamente lo hice) antes de que hayas terminado de depurar cada problema. Entonces, como lo han sugerido otros carteles, puede ser prudente considerar cuidadosamente cuán fuerte es su deseo.

trognanders
fuente
Buen enlace Muy buen tutorial.
Luis Alvarado
Veamos también esto: debuntu.org/2006/02/23/…
Postadelmaga
8

Puede hacerlo utilizando el paquete ifenslaveque conecta y desconecta las interfaces de red esclavas a un dispositivo de enlace.

  1. Instalar:

    sudo apt-get install ifenslave
    
  2. Módulo de kernel de unión de carga

    sudo modprobe bondingle
    
  3. Configure sus interfaces:

    sudo vi /etc/network/interfaces
    

    Ejemplo de configuración, para combinar eth0 y eth1 como esclavos de su interfaz de enlace:

    #eth0 is manually configured, and slave to the "bond0" bonded NIC
    auto eth0
    iface eth0 inet manual
    bond-master bond0
    
    #eth1 ditto, thus creating a 2-link bond.
    auto eth1
    iface eth1 inet manual
    bond-master bond0
    
    # bond0 is the bonded NIC and can be used like any other normal NIC.
    # bond0 is configured using static network information.
    auto bond0
    iface bond0 inet static
    address 192.168.1.10
    gateway 192.168.1.1
    netmask 255.255.255.0
    # bond0 uses standard IEEE 802.3ad LACP bonding protocol 
    bond-mode 802.3ad
    bond-miimon 100
    bond-lacp-rate 1
    bond-slaves none
    
  4. Reiniciar red:

    sudo restart networking
    
  5. Traer arriba / abajo interfaz limitada:

    ifup bond0
    ifdown bond0
    

    Hay varios modos de enlace como ejemplo que usamos:

    bond-mode active-backup
    

    Descripción del modo de enlace de respaldo activo :

    Política de copia de seguridad activa: solo un esclavo en el enlace está activo. Un esclavo diferente se activa si, y solo si, el esclavo activo falla. La dirección MAC del enlace es visible externamente en un solo puerto (adaptador de red) para evitar confundir al conmutador. Este modo proporciona tolerancia a fallas. La opción principal afecta el comportamiento de este modo.

    Fuente y más información en la wiki de ayuda de la comunidad de Ubuntu .

La vinculación significa combinar varias interfaces de red (NIC) en un solo enlace, proporcionando alta disponibilidad, equilibrio de carga, rendimiento máximo o una combinación de estos. Fuente

pl1nk
fuente
+1 porque es una de las razones de mi pregunta. Seguirá esperando una forma de crear una conexión maestra de red virtual que sea la suma de todas las conexiones esclavas (reales). Algo así como la vinculación que viene en la última versión del kernel.
Luis Alvarado
2
-1: la vinculación funciona en las LAN, ya que funciona en la capa 2. La pregunta es sobre el equilibrio de carga de dos WAN independientes.
gertvdijk
@gertvdijk No estoy de acuerdo revise mi respuesta de actualización para descubrir que la vinculación también equilibra la carga.
pl1nk
1
@ pl1nk Este es el equilibrio de carga de Capa 2 para dos NIC en la misma red L2. ¡Esto no es lo mismo que el equilibrio de carga de múltiples ISP!
gertvdijk
3
@ pl1nk Mi comentario final. La pregunta es sobre múltiples conexiones de banda ancha independientes, claramente. Si bien pueden ser un ISP, esto no cambia la discapacidad para manejar esto en la capa 2.
gertvdijk
6

Es una pregunta un poco vieja, pero si aún quieres saber ...

Hay 2 escenarios típicos, lo que gertvdijk y pl1nk estaban discutiendo en una de las respuestas:

Tiene una computadora con 2 IP públicas (2 ISP diferentes) y se conecta a otro host (p. Ej., Un servidor en un centro de datos con una tubería gruesa que es más grande que el ancho de banda agregado de ambas conexiones ISP de su computadora). Entonces establece una conexión de enlace con el host a través de sus 2 conexiones y luego el host (servidor) sirve su tráfico a través de su propia conexión a Internet. En este escenario, puede obtener casi el 100% del ancho de banda combinado en ambas direcciones para una sola conexión.

Este es un caso particular de enlace / equipo / agregación ling donde múltiples interfaces de capa 2 (misma red) se unen. Se podría lograr estableciendo conexiones VPN de capa 2 (tap) en cada interfaz ISP desde la computadora al host y uniéndolas (modo round-robin) para tener una sola interfaz. El factor limitante en este escenario es cuán diferentes son los retrasos (ping) en cada conexión de ISP al host. Cuanto más similares y estables sean, mejor. Lo usamos en una de nuestras instalaciones, funciona bien. Si desea conocer los detalles sobre cómo implementarlo, hágamelo saber.

Luego, otro escenario sería sin un host intermedio, es decir, una conexión directa desde las interfaces de su ISP a varios servidores web de todo el mundo. En este caso, lo mejor que puede obtener es distribuir uniformemente las conexiones salientes entre las interfaces, es decir, una sesión TCP se realiza completamente a través de un ISP, una segunda sesión a través de otra, etc. Esto es así porque cuando establece una conexión TCP, tiene direcciones IP de origen y destino para cada paquete y cuando un servidor recibe un paquete de otra IP para la cual no se realizó un protocolo de enlace TCP, considera que el paquete es erróneo y lo descarta. Como cada conexión ISP tiene su propia IP pública, para la misma sesión TCP no puede enviar un paquete a través de una conexión desde una IP y otro a través de otra conexión con otra IP.

No logrará una utilización de ancho de banda agregado tan alta para una sola computadora como en el primer escenario, pero para una oficina pequeña podría ser una buena solución. Lo que puede hacer para extenderlo un poco es implementar soluciones personalizadas para protocolos específicos. Por ejemplo, podría tener algún tipo de proxy en la puerta de enlace (que podría ser la misma computadora) para descargas http y solicitar diferentes partes de un archivo enorme que establezca diferentes sesiones TCP a través de diferentes interfaces ISP. En este caso, la velocidad de descarga resultante sería cercana al 100% del ancho de banda combinado. Es como descargar en la puerta de enlace lo que hacen ReGet, GetRight y descargadores similares. Google 'HTTP 206 Contenido parcial'. No conozco ninguna solución de código abierto lista para usar para este escenario, pero hay dispositivos de hardware que hacen exactamente esto: google '

Anatoli
fuente
¡Guauu! La primera parte de su respuesta es exactamente lo que estoy buscando. Tengo un servidor en la nube con Ubuntu y una conexión muy rápida. Y la única conexión a Internet que puedo tener aquí es de 300 kbps con 3G limitado. ¿Puede dar más información sobre cómo lograr la primera parte de su respuesta, de modo que pueda comprar muchos dongles 3G y planes para mejorar la velocidad de mi conexión?
Huafu
2
echo "bonding" >> /etc/modules echo -e "alias bond* bonding\noptions bonding max_bonds=10 mode=2 xmit_hash_policy=layer3+4 arp_interval=100 arp_ip_target=10.0.0.1" > /etc/modprobe.d/bonding.conf
Anatoli
1
Y esclavice todos los ifaces de tap a este enlace: echo "+tapX " >> /sys/class/net/bond0/bonding/slaves Verifique su estado con: cat /proc/net/bonding/bond0 En esta etapa, todo el tráfico de Internet debe fluir a través de bond0 al servidor en el centro de datos. Allí debe configurar el enrutamiento: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (se supone que eth0 es el iface de Internet)
Anatoli
1
Esta configuración de enlace (modo = 2 xmit_hash_policy = layer3 + 4) hará que cada nueva conexión vaya a través de un iface VPN subyacente diferente basado en el número hash (calculado a partir de las IP y los puertos involucrados en la conexión) mod. Más información: kernel.org/doc/Documentation/networking/bonding.txt . Esto en realidad es más como la segunda solución de mi respuesta, es porque necesita conexiones subyacentes muy similares (muy bajo jitter y el mismo ancho de banda) para que el enlace round-robin funcione correctamente (de lo contrario, obtendrá una gran cantidad de reordenamiento de paquetes) y usted dice que tus conexiones son 3G.
Anatoli
1
@Huafu, para tener la primera solución, solo tiene que cambiar las opciones de enlace en lugar de mode=2 xmit_hash_policy=layer3+4especificar mode=0(vea el enlace @ kernel.org), pero primero verifique qué tan similares son los enlaces a través de 3G. Si sus tiempos de ping difieren más de 2-3 ms o la fluctuación de fase es más de 1 ms, tendrá una gran cantidad de reordenamiento de paquetes que reducirá efectivamente la velocidad del enlace agregado. Tendrá que verificar las estadísticas de enlaces agregados con netstat -s(buscar retransmisiones) y iperf -s/ iperf -c <server_ip> -d. Primero verifique el rendimiento de cada enlace, luego podemos continuar con una solución
Anatoli
0

Me enfrenté a un problema similar ... y estaba muy interesado en el enfoque de la solución de acuerdo con el primer escenario del Sr. GTH y Anatoli, le pido que presente las configuraciones básicas y los scripts, si es posible, para probar la configuración descrita en el primer escenario.

ahora configuré conexiones vpn a través de diferentes proveedores de ISP, usando interfaces combinadas tun / tap (no está vinculada, lo que se explica en la respuesta # 8) con esta utilidad:

Net-ISP-Balance por Lincoln D. Stein

Equilibre la carga de su conexión a Internet a través de dos o más ISP para mejorar el ancho de banda y la confiabilidad

Página principal del proyecto: https://lstein.github.io/Net-ISP-Balance/

Este paquete le permite equilibrar la carga de una conexión a Internet doméstica o de pequeña empresa a través de dos o más ISP. Puede usarlo con un único host conectado a dos ISP, o en un equipo enrutador / firewall para equilibrar la carga de toda su LAN. El tráfico de red se equilibra en ambas conexiones de ISP para aumentar la capacidad de carga y descarga, y si un ISP falla, los otros ISP se harán cargo automáticamente.

El ancho de banda se distribuye en un nivel por conexión. Esto significa que no verá el ancho de banda agregado en ninguna referencia de descarga o velocidad en particular, pero verá los beneficios cuando se realizan múltiples transferencias de datos simultáneamente, por ejemplo, cuando varias personas en su hogar transmiten películas. Además, los protocolos de transferencia de archivos con varias conexiones, como BitTorrent, verán los beneficios del equilibrio de carga.

Esta es una utilidad basada en Perl para administrar enrutamiento e iptables en Linux, perfecta para nuestros propósitos, de hecho, primero crea una tabla de enrutamiento para todos los proveedores, y luego distribuye todo el tráfico LAN de manera uniforme entre proveedores, para comprender cómo funciona la utilidad, sugiera considerar un pequeño ejemplo (configuración de prueba) para 3 isp + 1 lan

 #cat /etc/network/balance.conf
 ##service    device   role     ping-ip           
 CABLE3       enp0s3   isp      10.0.2.2
 CABLE8       enp0s8   isp      10.0.3.2
 CABLE9       enp0s9   isp      10.0.4.2
 LAN          enp0s10  lan                        

 #cat /etc/network/interfaces
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp

auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet dhcp

auto enp0s9
allow-hotplug enp0s9
iface enp0s9 inet dhcp

auto enp0s10
allow-hotplug enp0s10
iface enp0s10 inet static
    address 192.168.1.1/24

#Now work Net-ISP-Balance utility:

## Including rules from /etc/network/balance/pre-run/pre-run-script.pl ##
## Finished /etc/network/balance/pre-run/pre-run-script.pl ##
echo 0 > /proc/sys/net/ipv4/ip_forward
ip route flush all
ip rule flush
ip rule add from all lookup main pref 32766
ip rule add from all lookup default pref 32767
ip route flush table  2
ip route flush table  1
ip route flush table  3
ip route add  10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add  10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add  10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add  0.0.0.0/0 dev enp0s10 src 
ip route add default scope global nexthop via 10.0.4.2 dev enp0s9 weight 1 nexthop via 10.0.3.2 dev enp0s8 weight 1 nexthop via 10.0.2.2 dev enp0s3 weight 1
ip route add table 2 default dev enp0s3 via 10.0.2.2
ip route add table 2 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 2 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 2 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 2 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.2.15 table 2
ip rule add fwmark 2 table 2
ip route add table 1 default dev enp0s8 via 10.0.3.2
ip route add table 1 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 1 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 1 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 1 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.3.15 table 1
ip rule add fwmark 1 table 1
ip route add table 3 default dev enp0s9 via 10.0.4.2
ip route add table 3 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 3 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 3 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 3 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.4.15 table 3
ip rule add fwmark 3 table 3
## Including rules from /etc/network/balance/routes/01.local_routes ##
# enter any routing commands you might want to go in
# for example:
# ip route add 192.168.100.1 dev eth0 src 198.162.1.14

## Finished /etc/network/balance/routes/01.local_routes ##
## Including rules from /etc/network/balance/routes/02.local_routes.pl ##
## Finished /etc/network/balance/routes/02.local_routes.pl ##
iptables -F
iptables -t nat    -F
iptables -t mangle -F
iptables -X
iptables -P INPUT    DROP
iptables -P OUTPUT   DROP
iptables -P FORWARD  DROP

iptables -N DROPGEN
iptables -A DROPGEN -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "GENERAL: "
iptables -A DROPGEN -j DROP

iptables -N DROPINVAL
iptables -A DROPINVAL -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "INVALID: "
iptables -A DROPINVAL -j DROP

iptables -N DROPPERM
iptables -A DROPPERM -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "ACCESS-DENIED: "
iptables -A DROPPERM -j DROP

iptables -N DROPSPOOF
iptables -A DROPSPOOF -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "DROP-SPOOF: "
iptables -A DROPSPOOF -j DROP

iptables -N DROPFLOOD
iptables -A DROPFLOOD -m limit --limit 1/minute  -j LOG --log-level 4 --log-prefix "DROP-FLOOD: "
iptables -A DROPFLOOD -j DROP

iptables -N DEBUG
iptables -A DEBUG  -j LOG --log-level 3 --log-prefix "DEBUG: "
iptables -t mangle -N MARK-CABLE3
iptables -t mangle -A MARK-CABLE3 -j MARK     --set-mark 2
iptables -t mangle -A MARK-CABLE3 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE8
iptables -t mangle -A MARK-CABLE8 -j MARK     --set-mark 1
iptables -t mangle -A MARK-CABLE8 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE9
iptables -t mangle -A MARK-CABLE9 -j MARK     --set-mark 3
iptables -t mangle -A MARK-CABLE9 -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 1 -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.333333333333333 -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate NEW -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate NEW -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate NEW -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -d 127.0.0.0/8 -j DROPPERM
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROPFLOOD
iptables -A INPUT   -i enp0s10 -s 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 0.0.0.0/0  -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 255.255.255.255/32  -j ACCEPT
iptables -A OUTPUT  -p udp -s 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s3 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s3                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s8 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s8                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s9 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s9                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -j DROPSPOOF
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
## Including rules from /etc/network/balance/firewall/01.accept ##
## This file contains iptables statements that add additional firewall rules

# allow incoming domain packets -- needed for DNS resolution
iptables -A INPUT   -p udp --source-port domain -j ACCEPT
# allow incoming NTP packets -- needed for net time protocol
iptables -A INPUT   -p udp --source-port ntp -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept ##
## Including rules from /etc/network/balance/firewall/01.accept.pl ##
iptables -A INPUT -p tcp -s 0.0.0.0/0 --syn --dport ssh -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept.pl ##
## Including rules from /etc/network/balance/firewall/02.forward.pl ##
iptables -A FORWARD -p udp --source-port domain -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD -p udp --source-port ntp    -d 0.0.0.0/0 -j ACCEPT
## Finished /etc/network/balance/firewall/02.forward.pl ##
echo 1 > /proc/sys/net/ipv4/ip_forward
## Including rules from /etc/network/balance/post-run/post-run-script.pl ##
## Finished /etc/network/balance/post-run/post-run-script.pl ##
ITz
fuente
Por favor, considere eliminar esta respuesta y agregar un comentario solicitando más explicaciones a la respuesta correspondiente. Esta no es una respuesta. Gracias.
Raffa