Wie erhöhe ich die PPPoE-MTU?

Wie erhöhe ich die PPPoE-MTU?

Ich habe eine Ubuntu Server 14.04-Installation, die über PPPoE mit dem Internet verbunden ist. Im Moment ppp0hat meine Schnittstelle eine MTU von 1492, was größtenteils funktioniert.

Ich möchte die MTU auf 1500 erhöhen, was von meinem ISP unterstützt wird.

Bisher habe ich die MTU der zugrunde liegenden Ethernet-Schnittstelle auf 1508 erhöht und versucht, die folgenden Zeilen hinzuzufügen/etc/ppp/peers/dsl-provider

mtu 1500
mru 1500

Aber meine ppp0Schnittstelle hat immer noch eine MTU von 1492. Ich gehe davon aus, dass die Syntax meiner hinzugefügten Zeilen korrekt ist, da die Verwendung von Werten unter 1492 wie erwartet funktioniert.

Das manuelle Ändern der MTU der ppp0Schnittstelle auf 1500 nach der Aktivierung funktioniert, wirkt sich jedoch nur auf Pakete in eine Richtung aus. Auf diese Weise kann ich 1500-Byte-Pakete über das Internet senden, die ohne Fragmentierung an ihrem Ziel ankommen. An mich eingehender Datenverkehr wird jedoch immer noch in 1492-Byte-Fragmenten gesendet.

Indem ich den Datenverkehr auf der Ethernet-Schnittstelle aufzeichne, während die PPPoE-Verbindung aufgebaut wird, kann ich sehen, dass in der Konfigurationsanfrage, die mein Ubuntu Server 14.04-Rechner an den Provider sendet, die MRU als 1492 angegeben ist. Ich weiß also, dass das Problem auf meiner Seite der Verbindung liegt.

Warum verwendet Ubuntu Server 14.04 in der Konfigurationsanfrage 1492 als MRU, wenn in der Konfigurationsdatei 1500 steht? Und wie kann ich es auf 1500 ändern?

Antwort1

Ich habe den pppQuellcode heruntergeladen, indem ich diese beiden Befehle eingegeben habe:

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

In der Headerdatei pppd/plugins/rp-pppoe/pppoe.hhabe ich Folgendes gefunden:

/* 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_LENist definiert in/usr/include/linux/if_ether.h

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

Und darin pppd/plugins/rp-pppoe/plugin.chabe ich Folgendes gefunden:

    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;

Das alles bedeutet, dass das rp-pppoePlugin ein fest codiertes Limit von 1492 Bytes hat. Und die einzige Möglichkeit, dieses Limit zu erhöhen, besteht darin, die Quelle zu ändern und das Plugin mit einem höheren Limit neu zu erstellen.

Durch Entfernen der obigen vier Zeilen plugin.cund Neuaufbau des Moduls konnte ich die MTU von 1492 auf 1500 erhöhen. Dies funktioniert nur, solange bekannt ist, dass die zugrunde liegende Zeile die größere Größe unterstützt, was bei meiner Verbindung der Fall ist.

Um die Fähigkeit der zugrunde liegenden Leitung zu erkennen, müsste eine neuere pppd-Version mit RFC 4638-Unterstützung verwendet werden. Ubuntu 16.04 hat eine neuere pppd-Version und sollte daher in der Lage sein, größere MTU-Größen für PPPoE zu verwenden, ohne dass Code neu kompiliert werden muss.

Antwort2

Sie könnten pppd über strace ausführen und filtern, um „offene“ Anfragen anzuzeigen und zu sehen, welche Dateien geöffnet werden, um die Konfiguration daraus zu beziehen.

sudo strace -f -e open pppd

Meiner Erfahrung (mit Breitband in Großbritannien) zufolge waren alle Verbindungen 1492, wenn sie über BT liefen. Gibt es einen bestimmten Grund, warum Sie weitere 8 Oktette benötigen?

Meines Wissens kann es passieren, dass Ihre Pakete zu mehreren Paketen werden, wenn Sie die MRU nicht richtig anpassen, insbesondere, wenn Sie beispielsweise einen 8-Oktett-Overhead für die Kapselung nicht zulassen.

verwandte Informationen