web-dev-qa-db-fra.com

Comment augmenter PPPoE MTU?

J'ai une installation Ubuntu Server 14.04 qui est connectée à Internet à l'aide de PPPoE. Pour le moment, mon interface ppp0 possède un MTU de 1492 qui fonctionne généralement.

Je voudrais augmenter le MTU à 1500, qui est pris en charge par mon fournisseur de services Internet.

Jusqu'ici, j'ai augmenté le MTU de l'interface Ethernet sous-jacente à 1508 et j'ai essayé d'ajouter les lignes suivantes dans /etc/ppp/peers/dsl-provider

mtu 1500
mru 1500

Mais mon interface ppp0 a toujours un MTU de 1492. Je pense que la syntaxe de mes lignes ajoutées est correcte, car l'utilisation de valeurs inférieures à 1492 fonctionne comme prévu.

Si vous modifiez manuellement le MTU de l'interface ppp0 en 1500 après son lancement, cela fonctionne, mais cela n'affecte les paquets que dans un sens. En faisant cela, je suis capable d’envoyer des paquets de 1 500 octets sur Internet et ils arriveront à destination sans aucune fragmentation. Mais le trafic entrant m'est envoyé en fragments de 1492 octets.

En capturant le trafic sur l'interface Ethernet lors de l'établissement de la connexion PPPoE, je peux voir que, dans la demande de configuration envoyée par mon ordinateur Ubuntu Server 14.04 au fournisseur, la MRU est spécifiée en tant que 1492. Je sais donc le problème est de mon côté de la connexion.

Pourquoi Ubuntu Server 14.04 utilise-t-il 1492 comme MRU dans la demande de configuration, alors que le fichier de configuration indique 1500? Et comment puis-je le changer en 1500?

2
kasperd

J'ai téléchargé le code source ppp en tapant ces deux commandes:

Sudo apt-get build-dep ppp
apt-get source ppp

Dans le fichier d'en-tête pppd/plugins/rp-pppoe/pppoe.h j'ai trouvé ceci:

/* 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 est défini dans /usr/include/linux/if_ether.h

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

Et dans pppd/plugins/rp-pppoe/plugin.c j'ai trouvé ceci:

    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;

Cela signifie que le plug-in rp-pppoe a une limite codée en dur de 1492 octets. Et le seul moyen de l'augmenter est de modifier la source et de reconstruire le plugin avec une limite supérieure.

En supprimant les quatre lignes ci-dessus de plugin.c et en reconstruisant le module, j'ai pu augmenter le MTU de 1492 à 1500. Cela ne fonctionne que tant que la ligne sous-jacente est connue pour prendre en charge la taille plus grande, qui se trouve être le cas sur ma connexion.

Afin de détecter la capacité de la ligne sous-jacente, il serait nécessaire d’utiliser une version plus récente de pppd avec prise en charge de la norme RFC 4638. Ubuntu 16.04 a une version plus récente de pppd et devrait donc pouvoir utiliser des tailles de MTU plus importantes pour PPPoE sans avoir à recompiler le code.

2
kasperd