O Linux Kernel anterior à 3.6 usava o cache de rota para fazer o roteamento de caminhos múltiplos IPv4, o que significava que o roteamento entre duas linhas / ISPs separadas era bastante fácil. De 3.6, o algoritmo mudou para ser por pacote, o que significa que alguns truques de marcador de tabela de rotas / regra / iptables foram necessários para atingir as duas linhas / ISPs.
No entanto, se você tivesse duas linhas com o mesmo provedor de serviços de Internet que poderiam rotear um único IP nas duas linhas por pacote de maneira balanceada / failover, a partir da 3.6, seria possível obter facilmente ligação de linha (no nível IP) por causa de o roteamento por pacote nas duas direções.
Da 4.4, o kernel mudou novamente para o balanceamento de carga baseado em fluxo com base em um hash nos endereços de origem e destino.
Atualmente, estou executando o Kernel 4.4.36 e estou usando 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 nas duas linhas). Isso me dá uma velocidade de download mais rápida 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. tudo funciona muito bem.
Por ter uma experiência tão boa no downstream, quero experimentá-lo upstream, mas meu tráfego upstream é roteado de acordo com o algoritmo baseado em fluxo mais recente nos dois dispositivos ppp (que têm o mesmo endereço IP). Isso significa que não consigo atingir uma velocidade de upload superior à 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 de caminhos múltiplos por pacote? Eu precisaria reverter para um Kernel mais antigo (o que não quero fazer por vários outros motivos)?
Meu provedor de serviços de Internet não oferece suporte a ppp com vários links.
Caso seja relevante, atualmente estou executando o Arch Linux ARMv7 em um Raspberry Pi 3.
fonte
Respostas:
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 eu segui livremente, mas com alguns ajustes.
http://lartc.org/howto/lartc.loadshare.html
Foi assim que o fiz funcionar no Arch Linux ARMv7 (Raspberry Pi 3)
Na inicialização:
O comando a seguir deve ser executado na inicialização para carregar o módulo Kernel apropriado.
Os seguintes comandos também devem ser executados na inicialização, desde que você deseje NAT a partir de uma rede local em eth0.
O tráfego de retorno FORWARD está no ppp + e o POSTROUTING MASQUERADE no teql + porque o tráfego de saída sai no teql e o tráfego de retorno volta no ppp.
Quando os links ppp aparecerem:
Supondo que os links tenham balanceamento de carga são 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 pela pppoe etc.) O link teql é atribuído manualmente, como mostrado acima. O ISP precisa enviar o tráfego para o IP igualmente nos dois links.O caminho reverso (
rp_filter
) é definido como2
(solto), tanto no script acima, para que os pacotes de retorno não sejam descartados devido ao retorno das interfaces ppp ao invés de teql0.Eu configurei dessa maneira e funciona perfeitamente. Muito fácil! Quando os links falham, há failover contínuo. Quando eles aparecem, eles simplesmente começam a trabalhar novamente. Parece que não há perda ou atraso de pacote quando ocorre failover e nenhum quando ele retorna.
Além disso, um dos comentaristas sugeriu o link abaixo, que usa o roteamento de políticas, com o iptables para marcar todos os outros pacotes, etc.
http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing
fonte
sysctl -w net.ipv4.ip_forward
mas devo dizersysctl -w net.ipv4.ip_forward=1
que eu corrigi acima. Isso certamente impediria o tráfego da LAN descendo pelo link vinculado.