Come unire più connessioni Internet in una?


23

Il mio PC dispone di un totale di 4 schede di rete, 2 schede di rete Gigabit Ethernet cablate e anche 2 schede di rete wireless. (Una Broadcom con driver proprietari e Ralink con software open source, che funziona molto meglio di Broadcom.)

Il mio cellulare può condividere la connessione wireless sul mio PC, ma ho anche una connessione Internet cablata. Quindi ho più connessioni Internet per accedere a Internet. Come posso unire 2 o più connessioni insieme e bilanciarle per godermi un'esperienza Internet unificata che è la somma di tutte le connessioni Internet ad essa collegate.

Ad esempio, se ho un modem con una connessione Internet di 1024 kB / se un altro che offre 512 kB / se uno piccolo che offre 128 kB / s, dopo il bilanciamento del carico e l'unione di tutte le connessioni (Bonding o Teaming), potrei scaricare da una velocità di 1664 kB / s utilizzando tutte e 3 le connessioni Internet come una, ad esempio.

Questa domanda mi ha sempre incuriosito.


5
Sembra piuttosto al di là dell'ambito di Ask Ubuntu :) Questa è roba di rete piuttosto complessa. Raramente ne vale la pena, quando si prendono in considerazione i pacchetti persi a causa di un collegamento inattivo (anche temporaneamente), il riordino dei pacchetti a causa di alcuni collegamenti più lenti di altri e cose simili. Non conosco una soluzione "scatola nera" che possa fare questo, potrebbe essere un progetto interessante.
Cesio,

9
Bene, la domanda è se questo può essere fatto in Ubuntu e se sì come.
Luis Alvarado,

Ho creato una risposta nelle 2 connessioni Internet su un singolo post del PC . Collegamento di documenti per il delimitazione in Ubuntu.
Lucio,

@Lucio Potrei contrassegnare la domanda come duplicata oppure puoi spostare la tua risposta qui e posso contrassegnarla come accettata. Dovresti anche essere pronto per quando uscirà il 13.04 poiché includerà in Network Manager le opzioni di bonding (Solo gli slave di bonding cablati in questo momento).
Luis Alvarado,

Risposte:


11

Faccio qualcosa del genere al lavoro usando Ubuntu 11.04. Eseguiamo lo strumento di configurazione del firewall Shorewall, che oltre ad essere eccellente nel suo lavoro, fornisce alcuni strumenti di routing ISP multipli rudimentali che potrebbero soddisfare le tue esigenze. Puoi trovare alcuni documenti a riguardo qui: http://www.shorewall.net/MultiISP.html

Tuttavia, non si possono usare più ISP per una singola connessione ... le cose non sono così semplici. Il meglio che puoi fare è provare a indirizzare le nuove connessioni in modo uniforme tra i diversi provider.

È un problema complesso. Probabilmente finirai per battere la testa contro il muro (certamente l'ho fatto) prima di aver eseguito il debug di ogni problema. Quindi, come hanno suggerito altri poster, potresti essere saggio a considerare attentamente quanto è forte il tuo desiderio.


Bel link. Tutorial molto bello.
Luis Alvarado,


8

È possibile farlo utilizzando il pacchetto ifenslaveche collega e scollega le interfacce di rete slave a un dispositivo di collegamento.

  1. Installare:

    sudo apt-get install ifenslave
    
  2. Carica il modulo del kernel bonding

    sudo modprobe bondingle
    
  3. Configura le tue interfacce:

    sudo vi /etc/network/interfaces
    

    Esempio di configurazione, per combinare eth0 ed eth1 come slave nell'interfaccia di collegamento:

    #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. Riavvia rete:

    sudo restart networking
    
  5. Porta su / giù interfaccia limitata:

    ifup bond0
    ifdown bond0
    

    Ci sono diverse modalità di incollaggio come esempio che usiamo:

    bond-mode active-backup
    

    Descrizione della modalità di collegamento attivo-backup :

    Criterio di backup attivo: è attivo solo uno slave nel legame. Uno slave diverso diventa attivo se, e solo se, lo slave attivo fallisce. L'indirizzo MAC del legame è visibile esternamente su una sola porta (adattatore di rete) per evitare di confondere lo switch. Questa modalità fornisce tolleranza d'errore. L'opzione principale influenza il comportamento di questa modalità.

    Fonte e maggiori informazioni nella wiki della community di Ubuntu .

Per legame , si intende la combinazione di più interfacce di rete (NIC) in un singolo collegamento, fornendo alta disponibilità, bilanciamento del carico, throughput massimo o una combinazione di questi. fonte


+1 perché è uno dei motivi della mia domanda. Aspetterà ancora un modo per creare una connessione principale di rete virtuale che sia la somma di tutte le connessioni slave (reali). Qualcosa come il legame che arriva nell'ultima versione del kernel.
Luis Alvarado,

2
-1 - il legame funziona nelle LAN poiché funziona al livello 2. La domanda riguarda il bilanciamento del carico di due WAN indipendenti.
gertvdijk,

@gertvdijk Non sono d'accordo, controlla la mia risposta di aggiornamento per scoprire che anche il legame carica il bilanciamento del carico.
pl1nk

1
@ pl1nk Questo è il bilanciamento del carico di livello 2 per due schede NIC nella stessa rete L2. Questo non è lo stesso del bilanciamento del carico multi-ISP!
gertvdijk,

3
@ pl1nk Il mio commento finale. La domanda riguarda chiaramente più connessioni indipendenti a banda larga. Sebbene possano essere un ISP, ciò non modifica la disabilità nel gestirlo al livello 2.
gertvdijk

6

È una domanda un po 'vecchia, ma se vuoi ancora sapere ..

Esistono 2 scenari tipici, su cui gertvdijk e pl1nk stavano discutendo in una delle risposte:

Hai un computer con 2 IP pubblici (2 diversi ISP) e ti connetti a un altro host (ad esempio un server in un datacenter con un fat pipe che è più grande della larghezza di banda aggregata di entrambe le connessioni ISP del tuo computer). Quindi stabilisci una connessione di legame con l'host tramite le tue 2 connessioni e quindi l'host (server) serve il tuo traffico tramite la propria connessione Internet. In questo scenario, è possibile ottenere quasi il 100% della larghezza di banda combinata in entrambe le direzioni per una singola connessione.

Questo è un caso particolare di aggregazione bonding / teaming / ling in cui più interfacce layer 2 (stessa rete) sono unite insieme. Si potrebbe ottenere stabilendo connessioni VPN di livello 2 (tocco) su ciascuna interfaccia ISP dal computer all'host e collegandole insieme (modalità round robin) per avere un'unica interfaccia. Il fattore limitante in questo scenario è quanto diversi sono i ritardi (ping) su ogni connessione ISP all'host. Più sono simili e stabili, meglio è. Lo usiamo in una delle nostre installazioni, funziona bene. Se desideri conoscere i dettagli su come implementarlo, fammelo sapere.

Quindi un altro scenario sarebbe senza un host intermedio, ovvero una connessione diretta dalle interfacce del tuo ISP a vari server web in tutto il mondo. In questo caso, la cosa migliore che puoi ottenere è distribuire uniformemente le connessioni in uscita tra le interfacce, ovvero una sessione TCP passa interamente tramite un ISP, una seconda sessione tramite un'altra e così via. È così perché quando si stabilisce una connessione TCP, ha gli indirizzi IP di origine e destinazione per ciascun pacchetto e quando un server riceve un pacchetto da un altro IP per il quale non è stata eseguita una stretta di mano TCP, considera il pacchetto errato e lo rilascia. Poiché ogni connessione ISP ha il proprio IP pubblico, per la stessa sessione TCP non è possibile inviare un pacchetto tramite una connessione da un IP e un altro tramite un'altra connessione con un altro IP.

Non otterrai un elevato utilizzo aggregato della larghezza di banda per un singolo computer come con il primo scenario, ma per un piccolo ufficio potrebbe essere una buona soluzione. Quello che puoi fare per estenderlo un po 'è implementare soluzioni personalizzate per protocolli specifici. Ad esempio, potresti avere una sorta di proxy sul gateway (che potrebbe essere lo stesso computer) per i download http e richiedere parti diverse di un enorme file che stabilisce sessioni TCP diverse tramite interfacce ISP diverse. In questo caso la velocità di download risultante sarebbe vicina al 100% della larghezza di banda combinata. È come scaricare sul gateway ciò che fanno ReGet, GetRight e downloader simili. "Contenuto parziale HTTP 206" di Google. Non conosco soluzioni open source pronte per questo scenario, ma ci sono dispositivi hardware che fanno esattamente questo: google '


Wow! La prima parte della tua risposta è esattamente quello che sto cercando. Ho un server nel cloud con Ubuntu e una connessione molto veloce. E l'unica connessione Internet che posso avere qui è 300kbps con 3G limitato. Puoi fornire maggiori informazioni su come ottenere la prima parte della tua risposta, in modo che io possa acquistare molti dongle 3G e piani per migliorare la velocità della mia connessione?
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
E riduci in schiavitù tutti gli iface del tap a questo legame: echo "+tapX " >> /sys/class/net/bond0/bonding/slaves controlla il suo stato con: cat /proc/net/bonding/bond0 In questa fase tutto il traffico Internet dovrebbe fluire tramite bond0 al server nel data center. Lì dovresti impostare il routing: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (eth0 dovrebbe essere il iface di Internet)
Anatoli

1
Questa configurazione del legame (mode = 2 xmit_hash_policy = layer3 + 4) farà passare ogni nuova connessione tramite iface VPN sottostante diverso in base al numero di iface mod hash (calcolato dagli IP e dalle porte coinvolte nella connessione). Ulteriori informazioni: kernel.org/doc/Documentation/networking/bonding.txt . Questa in realtà è più simile alla seconda soluzione dalla mia risposta, è perché hai bisogno di connessioni molto simili (jitter molto basso e stessa larghezza di banda) per il corretto funzionamento del bonding round-robin (altrimenti ottieni un sacco di riordino dei pacchetti) e dici che le tue connessioni sono 3G.
Anatoli,

1
@Huafu, per avere la prima soluzione devi solo cambiare le opzioni di bonding invece di mode=2 xmit_hash_policy=layer3+4y specificare mode=0(vedi il link @ kernel.org), ma prima controlla quanto sono simili i link via 3G. Se i loro tempi di ping differiscono più di 2-3ms o il jitter è superiore a 1ms avrai un sacco di riordino dei pacchetti che riduce efficacemente la velocità del collegamento aggregato. Dovrai controllare le statistiche aggregate dei link con netstat -s(cerca ritrasmissioni) e iperf -s/ iperf -c <server_ip> -d. 1 ° controlla le prestazioni di ogni link, quindi possiamo continuare con una soluzione
Anatoli il

0

ho affrontato un problema simile .. ed ero molto interessato all'approccio alla soluzione secondo il primo scenario del sig. GTH e Anatoli, ti chiedo molto di presentare le configurazioni e gli script di base, se possibile, per testare la configurazione descritta nel primo scenario.

ora ho configurato le connessioni VPN attraverso diversi provider ISP, usando interfacce tun / tap combinate (non è bonding, cosa è spiegato nella risposta # 8) con questa utility:

Net-ISP-Balance di Lincoln D. Stein

Bilancia il carico della tua connessione Internet su due o più ISP per migliorare la larghezza di banda e l'affidabilità

Home del progetto: https://lstein.github.io/Net-ISP-Balance/

Questo pacchetto consente di bilanciare il carico di una connessione Internet domestica o per piccole imprese attraverso due o più ISP. È possibile utilizzarlo con un singolo host collegato a due ISP o su una macchina router / firewall per bilanciare il carico dell'intera LAN. Il traffico di rete viene bilanciato su entrambe le connessioni ISP per aumentare la capacità di upload e download e se un ISP fallisce, gli altri ISP subentreranno automaticamente.

La larghezza di banda è distribuita a livello di connessione. Ciò significa che non vedrai la larghezza di banda aggregata su alcun particolare download o benchmark di velocità, ma vedrai i vantaggi quando si verificano simultaneamente più trasferimenti di dati, ad esempio, quando diverse persone nella tua famiglia trasmettono film in streaming. Inoltre, i protocolli di trasferimento file multi-connessione come BitTorrent vedranno i vantaggi del bilanciamento del carico.

si tratta di un'utility basata su Perl per la gestione di routing e iptables in Linux perfetta per i nostri scopi, infatti prima crea una tabella di routing per tutti i provider, quindi distribuisce uniformemente tutto il traffico LAN tra i provider, per capire come funziona l'utilità, suggerisci di considerare un piccolo esempio (configurazione di prova) per 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 ##

Ti preghiamo di considerare di eliminare questa risposta e di aggiungere un commento che richiede più spiegazioni alla risposta corrispondente. Questa non è una risposta Grazie.
Raffa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.