Como eu aumento o PPPoE MTU?

0

Eu tenho uma instalação do Ubuntu Server 14.04 que está conectada à internet usando o PPPoE. No momento, minha interface ppp0 tem uma MTU de 1492 que funciona principalmente.

Gostaria de aumentar o MTU para 1500, que é suportado pelo meu ISP.

Até agora, aumentei o MTU da interface Ethernet subjacente para 1508 e tentei adicionar as seguintes linhas em /etc/ppp/peers/dsl-provider

mtu 1500
mru 1500

Mas minha interface ppp0 ainda tem um MTU de 1492. Acredito que a sintaxe de minhas linhas adicionadas esteja correta, pois o uso de valores inferiores a 1492 funciona como esperado.

Alterar manualmente o MTU da interface ppp0 para 1500 depois de ter sido criado funciona, mas afeta somente os pacotes em uma direção. Fazendo isso eu sou capaz de enviar pacotes de 1500 bytes pela internet e eles chegarão ao seu destino sem fragmentação. Mas o tráfego de entrada para mim ainda é enviado em 1492 fragmentos de bytes.

Ao capturar o tráfego na interface Ethernet quando a conexão PPPoE é ativada, vejo que na solicitação de configuração que minha máquina Ubuntu Server 14.04 envia ao provedor, o MRU é especificado como 1492. Então, sei que o problema é no meu fim da conexão.

Por que o Ubuntu Server 14.04 usa 1492 como MRU na solicitação de configuração, quando o arquivo de configuração diz 1500? E como posso alterá-lo para 1500?

    
por kasperd 18.09.2016 / 14:45

2 respostas

0

Eu fiz o download do código-fonte ppp digitando estes dois comandos:

sudo apt-get build-dep ppp
apt-get source ppp

No arquivo de cabeçalho pppd/plugins/rp-pppoe/pppoe.h , encontrei isto:

/* Header size of a PPPoE packet */
#define PPPOE_OVERHEAD 6  /* type, code, session, length */
#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD)
#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD)
#define MAX_PPPOE_MTU (MAX_PPPOE_PAYLOAD - 2)

ETH_DATA_LEN é definido em /usr/include/linux/if_ether.h

#define ETH_DATA_LEN      1500            /* Max. octets in payload        */

E em pppd/plugins/rp-pppoe/plugin.c , encontrei isto:

    if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
        lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
    if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
        lcp_wantoptions[0].mru = MAX_PPPOE_MTU;

O que tudo isso significa é que o plug-in rp-pppoe tem um limite codificado de 1492 bytes. E a única maneira de aumentá-lo é modificando a origem e reconstruindo o plug-in com um limite maior.

Ao remover as quatro linhas acima de plugin.c e reconstruir o módulo, consegui aumentar o MTU de 1492 para 1500. Isso só funciona enquanto a linha subjacente é conhecida por suportar o tamanho maior, o que acontece com ser o caso da minha conexão.

Para detectar a capacidade da linha subjacente, seria necessário usar uma versão mais recente do pppd com suporte a RFC 4638. O Ubuntu 16.04 tem uma versão mais recente do pppd e, portanto, deve ser capaz de usar tamanhos maiores de MTU para PPPoE sem precisar recompilar qualquer código.

    
por kasperd 18.09.2016 / 16:59
-1

você pode executar o pppd via strace e filtrar para exibir solicitações 'abertas' para ver de quais arquivos a sua abertura para obter sua configuração.

sudo strace -f -e open pppd

Na minha experiência (de banda larga do Reino Unido) todas as conexões foram 1492 se elas ultrapassarem a BT, existe uma razão específica pela qual você precisa de outros 8 octetos?

Meu entendimento é que, se você não coincidir com o MRU corretamente, você pode acabar tendo seus pacotes se tornando múltiplos pacotes, especialmente se você não permitir coisas como uma sobrecarga de 8 octetos para o encapsulamento.

    
por Amias 18.09.2016 / 14:55