AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 820269
Accepted
bao7uo
bao7uo
Asked: 2016-12-13 09:15:13 +0800 CST2016-12-13 09:15:13 +0800 CST 2016-12-13 09:15:13 +0800 CST

Como obter o roteamento de caminhos múltiplos por pacote no Linux?

  • 772

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.

linux routing linux-kernel iproute2
  • 1 1 respostas
  • 4327 Views

1 respostas

  • Voted
  1. Best Answer
    bao7uo
    2016-12-14T08:29:19+08:002016-12-14T08:29:19+08:00

    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.

    modprobe sch_teql
    

    Os comandos a seguir também devem ser executados na inicialização, assumindo que você deseja NAT de uma rede local em eth0.

    sysctl -w net.ipv4.ip_forward=1
    iptables -A INPUT -i ppp+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -i ppp+ -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A POSTROUTING -t nat -o teql+ -j MASQUERADE
    

    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.

    sysctl -w net.ipv4.conf.ppp1.rp_filter=2
    sysctl -w net.ipv4.conf.ppp2.rp_filter=2
    tc qdisc add dev ppp1 root teql0
    tc qdisc add dev ppp2 root teql0
    ip address add 1.1.1.1/32 dev teql0
    # you can add additional public IP addresses teql0 if you need to
    ip link set teql0 up
    ip route replace default scope global dev teql0
    

    Onde 1.1.1.1está 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 como 2(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

    • 4

relate perguntas

  • Protegendo um novo servidor Ubuntu [fechado]

  • (Soft) RAID 6 no Ubuntu 7.10, devo migrar para 8.10?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve