O Kernel do Linux antes do 3.6 usava o cache de rota para fazer o roteamento multipath IPv4, o que significava que o roteamento entre duas linhas/ISPs separados era bastante fácil. A partir da versão 3.6, o algoritmo mudou para ser por pacote, o que significa que alguns truques de marcador de tabela de rota/regra/iptables eram necessários para atingir as duas linhas/ISPs.
No entanto, se você tivesse duas linhas com o mesmo ISP que pudesse rotear um único IP para ambas as linhas por pacote de maneira balanceada/failover, a partir da versão 3.6 você poderia facilmente obter a ligação de linha (no nível do IP) por causa de o roteamento por pacote em ambas as direções.
A partir da versão 4.4, o kernel mudou novamente para balanceamento de carga baseado em fluxo baseado em um hash sobre os endereços de origem e destino.
Atualmente, estou executando o Kernel 4.4.36 e estou usando o roteamento de caminhos múltiplos em conexões PPPoE. Meu tráfego downstream do ISP é roteado pelas duas linhas separadas por pacote (um IP roteado para ambas as linhas). Isso me dá uma velocidade de download mais rápida do que a velocidade de uma linha individual. Quase a velocidade de ambas as linhas somadas. Funciona muito bem, vídeo do Skype, VoIP (UDP), YouTube etc.
Por ter uma experiência downstream tão boa, quero tentar upstream, mas meu tráfego upstream é roteado de acordo com o novo algoritmo baseado em fluxo em ambos os dispositivos ppp (que têm o mesmo endereço IP). Isso significa que não consigo atingir uma velocidade de upload mais rápida que a velocidade de uma única linha.
Existe uma maneira de configurar o Kernel atual para usar o algoritmo por pacote? Ou algum outro método para obter o roteamento multipath por pacote? Eu precisaria reverter para um Kernel mais antigo (o que não quero fazer por vários outros motivos)?
Meu ISP não suporta multi-link ppp.
Caso seja relevante, atualmente estou executando o Arch Linux ARMv7 em um Raspberry Pi 3.
Ok, então depois de ter tido mais tempo para investigar isso, encontrei uma maneira de fazer isso usando o Linux TEQL (True Link Equalizer). Aqui está um link que segui vagamente, mas com alguns ajustes.
http://lartc.org/howto/lartc.loadshare.html
Foi assim que consegui trabalhar no Arch Linux ARMv7 (Raspberry Pi 3)
Na inicialização:
O seguinte comando deve ser executado na inicialização para carregar o módulo Kernel apropriado.
Os comandos a seguir também devem ser executados na inicialização, assumindo que você deseja NAT de uma rede local em eth0.
O tráfego de retorno FORWARD está em ppp+, e o POSTROUTING MASQUERADE em teql+ porque o tráfego de saída sai em teql e o tráfego de retorno volta em ppp.
Quando os links ppp aparecem:
Supondo que os links com balanceamento de carga sejam ppp, os seguintes comandos devem ser executados em um script em um
/etc/ppp/ip-up.d/
script.Onde
1.1.1.1
está o seu endereço IP público voltado para o ISP. IPs públicos adicionais podem ser atribuídos ao dispositivo teql0, mas não precisam ser atribuídos aos dispositivos ppp. Na minha configuração os dois links ppp compartilham o mesmo IP (negociado por pppoe etc.) O link teql ele atribuiu manualmente conforme mostrado acima. O ISP precisa enviar o tráfego para o IP igualmente em ambos os links.O caminho reverso (
rp_filter
) é definido como2
(loose) ambos no script acima para que os pacotes de retorno não sejam descartados devido a eles voltarem nas interfaces ppp em vez de teql0.Configurei assim e funcionou perfeitamente. Muito fácil! Quando os links falham, ocorre um failover contínuo. Quando eles surgem, eles simplesmente começam a trabalhar novamente. Parece que não há perda de pacotes ou atraso quando ele falha, e nenhum quando ele volta.
Além disso, um dos comentaristas sugeriu o link abaixo que usa roteamento de política, com iptables para marcar todos os outros pacotes, etc., mas tentarei em alguns dias ver se funciona melhor do que o acima e fornecer feedback aqui de acordo.
http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing