
Eu tenho uma instalação do Ubuntu Server 14.04 que está conectada à internet usando PPPoE. No momento minha ppp0
interface tem um MTU de 1492 que funciona principalmente.
Gostaria de aumentar o MTU para 1.500, 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 ppp0
interface ainda possui um MTU de 1492. Acredito que a sintaxe das minhas linhas adicionadas esteja correta, pois usar valores inferiores a 1492 funciona conforme o esperado.
Alterar manualmente o MTU da ppp0
interface para 1500 depois que ela for ativada funciona, mas afeta apenas os pacotes em uma direção. Fazendo isso consigo enviar pacotes de 1.500 bytes pela internet e eles chegarão ao destino sem fragmentação. Mas o tráfego de entrada para mim ainda é enviado em fragmentos de 1.492 bytes.
Ao capturar o tráfego na interface Ethernet conforme a conexão PPPoE é ativada, posso ver que na solicitação de configuração que minha máquina Ubuntu Server 14.04 envia ao provedor, o MRU é especificado como 1492. Portanto, sei que o problema está 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 mudar para 1500?
Responder1
Baixei o ppp
código-fonte 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
eu encontrei isso:
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 rp-pppoe
plugin tem um limite codificado de 1492 bytes. E a única maneira de aumentá-lo é modificando a fonte e reconstruindo o plugin com um limite maior.
Ao remover as quatro linhas acima plugin.c
e reconstruir o módulo, consegui aumentar o MTU de 1492 para 1500. Isso só funciona enquanto a linha subjacente suporta o tamanho maior, o que é 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 RFC 4638. O Ubuntu 16.04 possui uma versão mais recente do pppd e, portanto, deve ser capaz de usar tamanhos maiores de MTU para PPPoE sem a necessidade de recompilar qualquer código.
Responder2
você poderia executar o pppd via strace e filter para exibir solicitações 'abertas' para ver de quais arquivos ele está abrindo para obter sua configuração.
sudo strace -f -e open pppd
Na minha experiência (de banda larga no Reino Unido), todas as conexões foram 1492 se passarem por BT. Existe um motivo específico para você precisar de mais 8 octetos?
Meu entendimento é que, se você não combinar o MRU corretamente, poderá acabar fazendo com que seus pacotes se tornem vários pacotes, especialmente se você não permitir coisas como uma sobrecarga de 8 octetos para encapsulamento.