Como mesclar várias conexões à Internet em uma?


23

Meu PC possui um total de 4 NICs, 2 placas de rede Gigabit Ethernet com fio e também 2 placas de rede sem fio. (Um Broadcom com drivers proprietários e Ralink com software de código aberto, que funciona muito melhor que o Broadcom.)

Meu celular pode compartilhar sua conexão sem fio com o meu PC, mas também tenho uma conexão com a Internet com fio. Então, eu tenho várias conexões com a Internet para acessar a Internet. Como posso mesclar 2 ou mais conexões e equilibrá- las para aproveitar uma experiência unificada da Internet, que é a soma de todas as conexões à Internet conectadas a ela.

Por exemplo, se eu tiver um modem com uma conexão à Internet de 1024kB / s e outro que ofereça 512kB / se um pequeno que ofereça 128kB / s, após balancear a carga e mesclar todas as conexões (Bonding ou Teaming), eu poderia fazer o download em uma velocidade de 1664kB / s usando todas as três conexões à Internet como uma, por exemplo.

Esta pergunta sempre me intrigou.


5
Parece um pouco além do escopo do Ask Ubuntu :) Esse é um material de rede bastante complexo. OMI raramente vale a pena, quando você leva em conta os pacotes perdidos devido a um link estar inoperante (mesmo que temporariamente), reordenando pacotes devido a alguns links serem mais lentos que outros e coisas assim. Não conheço uma solução de "caixa preta" que faça isso, poderia ser um projeto interessante.
Cesium 27/11

9
Bem, a questão é se isso pode ser feito no ubuntu e, se sim, como.
Luis Alvarado

Eu criei uma resposta nas 2 conexões de Internet em uma única postagem no PC . Vinculando documentos para delimitar no Ubuntu.
Lucio

@ Lucio Eu poderia marcar a pergunta como duplicada ou você pode mover sua resposta aqui e eu posso marcá-la como aceita. Você também precisa estar pronto para quando o 13.04 for lançado, pois incluirá no Network Manager as opções de ligação (Somente escravos de ligação com fio no momento).
Luis Alvarado

Respostas:


11

Eu faço algo assim no trabalho usando o Ubuntu 11.04. Executamos a ferramenta de configuração de firewall Shorewall, que além de excelente em seu trabalho, fornece algumas ferramentas rudimentares de roteamento de vários ISPs que podem atender às suas necessidades. Você pode encontrar alguns documentos sobre isso aqui: http://www.shorewall.net/MultiISP.html

No entanto, o que se resume é que você não pode usar vários ISPs para uma única conexão ... as coisas não são tão simples. O melhor que você pode fazer é tentar direcionar novas conexões igualmente entre os diferentes provedores.

É um problema complexo. Você provavelmente acabará batendo a cabeça contra a parede (eu certamente o fiz) antes de terminar de depurar todos os problemas. Portanto, como outros pôsteres sugeriram, talvez seja prudente considerar cuidadosamente o quão forte é o seu desejo.


Belo link. Muito bom tutorial.
Luis Alvarado


8

Você pode fazer isso usando o pacote ifenslaveque conecta e desconecta interfaces de rede escrava a um dispositivo de ligação.

  1. Instalar:

    sudo apt-get install ifenslave
    
  2. Módulo de kernel de ligação de carga

    sudo modprobe bondingle
    
  3. Configure suas interfaces:

    sudo vi /etc/network/interfaces
    

    Exemplo de configuração, para combinar eth0 e eth1 como escravos da sua interface de ligação:

    #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. Reinicie a rede:

    sudo restart networking
    
  5. Trazendo para cima / para baixo interface limitada:

    ifup bond0
    ifdown bond0
    

    Existem vários modos de ligação como exemplo que usamos:

    bond-mode active-backup
    

    Descrição do modo de ligação de backup ativo :

    Política de backup ativo: Apenas um escravo no vínculo está ativo. Um escravo diferente se torna ativo se, e somente se, o escravo ativo falhar. O endereço MAC do vínculo é visível externamente em apenas uma porta (adaptador de rede) para evitar confundir o comutador. Este modo fornece tolerância a falhas. A opção principal afeta o comportamento deste modo.

    Fonte e mais informações no wiki de ajuda da comunidade Ubuntu .

Ligação , significa combinar várias interfaces de rede (NICs) em um único link, fornecendo alta disponibilidade, balanceamento de carga, taxa de transferência máxima ou uma combinação delas. Fonte


+1 porque é uma das razões da minha pergunta. Ainda aguardará uma maneira de criar uma conexão principal de rede virtual que seja a soma de todas as conexões escravas (reais). Algo como ligação que vem na versão mais recente do kernel.
22612 Luis Alvarado

2
-1 - a ligação funciona nas LANs, pois está operando na camada 2. A questão é sobre o balanceamento de carga de duas WANs independentes.
Gdvdijk

@gertvdijk Não concordo, verifique minha resposta de atualização para descobrir que a ligação também carrega balanceamento.
311:

1
@ pl1nk Este é o balanceamento de carga da Camada 2 para duas NICs na mesma rede L2. Isso não é o mesmo que balanceamento de carga multi-ISP!
gertvdijk

3
@ pl1nk Meu comentário final. A questão está relacionada a várias conexões de banda larga independentes, claramente. Enquanto eles podem ser um ISP, isso não muda a incapacidade de lidar com isso na camada 2.
gertvdijk

6

É uma pergunta um pouco antiga, mas se você ainda quer saber ..

Existem 2 cenários típicos, o que gertvdijk e pl1nk estavam discutindo em uma das respostas:

Você possui um computador com 2 IPs públicos (2 ISPs diferentes) e se conecta a outro host (por exemplo, um servidor em um datacenter com um tubo de gordura maior que a largura de banda agregada das duas conexões ISP do seu computador). Assim, você estabelece uma conexão de ligação ao host por meio de suas 2 conexões e, em seguida, o host (servidor) atende seu tráfego por meio de sua própria conexão com a Internet. Nesse cenário, você pode obter quase 100% da largura de banda combinada nas duas direções para uma única conexão.

Este é um caso particular de agregação de vínculo / formação de equipes / ling em que várias interfaces da camada 2 (mesma rede) são unidas. Isso poderia ser alcançado estabelecendo conexões VPN da camada 2 (toque) em cada interface do ISP do computador para o host e unindo-as (modo round-robin) para ter uma única interface. O fator limitante nesse cenário é o quão diferentes são os atrasos (ping) em cada conexão do provedor de serviços de Internet ao host. Quanto mais semelhantes e estáveis, melhor. Nós o usamos em uma de nossas instalações, funciona bem. Se você quiser saber os detalhes sobre como implementá-lo, entre em contato.

Então outro cenário seria sem um host intermediário, ou seja, uma conexão direta das interfaces do seu provedor de serviços de Internet a vários servidores da Web em todo o mundo. Nesse caso, o melhor que você pode obter é distribuir uniformemente as conexões de saída entre as interfaces - ou seja, uma sessão TCP passa inteiramente por um ISP, uma segunda sessão por outra e assim por diante. Isso ocorre porque, quando você estabelece uma conexão TCP, ela possui endereços IP de origem e destino para cada pacote e quando um servidor recebe um pacote de outro IP para o qual um handshake TCP não foi executado, ele considera o pacote incorreto e o elimina. Como cada conexão ISP possui seu próprio IP público, para a mesma sessão TCP, você não pode enviar um pacote por uma conexão de um IP e outro por outra conexão com outro IP.

Você não obterá uma utilização de largura de banda agregada tão alta para um único computador quanto no primeiro cenário, mas para um pequeno escritório, pode ser uma boa solução. O que você pode fazer para estender um pouco é implementar soluções personalizadas para protocolos específicos. Por exemplo, você pode ter algum tipo de proxy no gateway (que pode ser o mesmo computador) para downloads http e solicitar partes diferentes de um arquivo enorme, estabelecendo diferentes sessões TCP por meio de interfaces ISP diferentes. Nesse caso, a taxa de download resultante seria próxima a 100% da largura de banda combinada. É como transferir para o gateway o que o ReGet, GetRight e outros downloaders similares fazem. Conteúdo parcial do HTTP 206 do Google. Não conheço nenhuma solução de código aberto pronta para o uso para esse cenário, mas há dispositivos de hardware que fazem exatamente isso: google '


Uau! A primeira parte da sua resposta é exatamente o que estou procurando. Eu tenho um servidor na nuvem com o Ubuntu e uma conexão muito rápida. E a única conexão à Internet que posso ter aqui é de 300kbps com 3G limitado. Você pode fornecer mais informações sobre como obter a primeira parte da sua resposta, para que eu possa comprar muitos dongles 3G e planos para melhorar a velocidade da minha conexão?
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 escravize todos os toques para esse vínculo: echo "+tapX " >> /sys/class/net/bond0/bonding/slaves Verifique seu estado com: cat /proc/net/bonding/bond0 Nesse estágio, todo o tráfego da Internet deve fluir via bond0 para o servidor no datacenter. Lá você deve definir o encaminhamento: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (eth0 é suposto ser o iface internet)
Anatoli

1
Essa configuração de vínculo (mode = 2 xmit_hash_policy = layer3 + 4) fará com que cada nova conexão passe por iface VPN subjacente diferente, com base no número do iface do hash (calculado a partir dos IPs e portas envolvidos na conexão). Mais informações: kernel.org/doc/Documentation/networking/bonding.txt . Isso na verdade é mais parecido com a segunda solução da minha resposta, é porque você precisa de conexões subjacentes muito semelhantes (jitter muito baixo e mesma largura de banda) para que a ligação round-robin funcione corretamente (caso contrário, você recebe muitas reordenações de pacotes) e diz que suas conexões são 3G.
Anatoli

1
@ Huafu, para ter a primeira solução, basta alterar as opções de ligação em vez de mode=2 xmit_hash_policy=layer3+4especificar mode=0(consulte o link @ kernel.org), mas primeiro verifique quão semelhantes são os links via 3G. Se seus tempos de ping diferirem mais de 2 a 3ms ou o jitter for maior que 1ms, você terá muitos reordenamentos de pacotes, reduzindo efetivamente a velocidade do link agregado. Você precisará verificar as estatísticas agregadas do link com netstat -s(procure retransmissões) e iperf -s/ iperf -c <server_ip> -d. 1º verificar o desempenho de cada link, então podemos continuar com uma solução
Anatoli

0

enfrentei um problema semelhante .. e estava muito interessado na abordagem da solução de acordo com o primeiro cenário do sr. GTH e Anatoli, peço que você faça as configurações e scripts básicos, se possível, para testar a configuração descrita no primeiro cenário.

agora eu configurei as conexões VPN através de diferentes provedores de ISP, usando interfaces tun / tap combinadas (não está vinculado, o que é explicado na resposta # 8) com este utilitário:

Net-ISP-Balance por Lincoln D. Stein

Faça o balanceamento de carga da sua conexão à Internet em dois ou mais ISPs para melhorar a largura de banda e a confiabilidade

Página inicial do projeto: https://lstein.github.io/Net-ISP-Balance/

Este pacote permite balancear a carga de uma conexão à Internet doméstica ou de uma empresa de pequeno porte em dois ou mais ISPs. Você pode usá-lo com um único host conectado a dois ISPs ou em um roteador / firewall para equilibrar a carga em toda a LAN. O tráfego de rede é balanceado nas duas conexões ISP para aumentar a capacidade de upload e download e, se um ISP falhar, o outro ISP assumirá o controle automaticamente.

A largura de banda é distribuída em um nível por conexão. Isso significa que você não verá a largura de banda agregada em nenhum download ou benchmark de velocidade específico, mas verá os benefícios quando várias transferências de dados estiverem ocorrendo simultaneamente, por exemplo, quando várias pessoas em sua casa estiverem transmitindo filmes. Além disso, os protocolos de transferência de arquivos com várias conexões, como o BitTorrent, verão os benefícios do balanceamento de carga.

este é um utilitário baseado em Perl para gerenciamento de roteamento e iptables no Linux, perfeito para nossos propósitos; de fato, primeiro cria uma tabela de roteamento para todos os provedores e depois distribui todo o tráfego da LAN igualmente entre os provedores, para entender como o utilitário funciona, sugerir considerar um pequeno exemplo (configuração de teste) 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 ##

Considere excluir esta resposta e adicionar um comentário solicitando mais explicações à resposta correspondente. Esta não é uma resposta. Obrigado.
Raffa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.