Как увеличить PPPoE MTU?

Как увеличить PPPoE MTU?

У меня установлен Ubuntu Server 14.04, который подключен к интернету с помощью PPPoE. На данный момент мой ppp0интерфейс имеет MTU 1492, что в основном работает.

Я хотел бы увеличить MTU до 1500, что поддерживается моим интернет-провайдером.

На данный момент я увеличил MTU базового интерфейса Ethernet до 1508 и попробовал добавить следующие строки в/etc/ppp/peers/dsl-provider

mtu 1500
mru 1500

Но мой ppp0интерфейс по-прежнему имеет MTU 1492. Я считаю, что синтаксис добавленных мной строк правильный, поскольку использование значений ниже 1492 работает так, как и ожидалось.

Ручное изменение MTU интерфейса ppp0на 1500 после его запуска работает, но это влияет только на пакеты в одном направлении. Сделав это, я могу отправлять пакеты по 1500 байт через Интернет, и они будут доходить до места назначения без фрагментации. Но входящий трафик ко мне по-прежнему отправляется фрагментами по 1492 байта.

Перехватывая трафик на интерфейсе Ethernet при установке соединения PPPoE, я вижу, что в запросе конфигурации, который мой компьютер с Ubuntu Server 14.04 отправляет провайдеру, MRU указан как 1492. Поэтому я знаю, что проблема на моем конце соединения.

Почему Ubuntu Server 14.04 использует 1492 в качестве MRU в запросе конфигурации, когда в файле конфигурации указано 1500? И как мне изменить его на 1500?

решение1

Я загрузил pppисходный код, введя эти две команды:

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

В заголовочном файле pppd/plugins/rp-pppoe/pppoe.hя нашел следующее:

/* 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определено в/usr/include/linux/if_ether.h

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

И вот pppd/plugins/rp-pppoe/plugin.cчто я нашел:

    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;

Все это означает, что rp-pppoeплагин имеет жестко закодированный лимит в 1492 байта. И единственный способ увеличить его — это изменить исходный код и пересобрать плагин с более высоким лимитом.

Удалив четыре приведенные выше строки plugin.cи перестроив модуль, мне удалось увеличить MTU с 1492 до 1500. Это работает только в том случае, если известно, что базовая строка поддерживает больший размер, что и произошло в моем соединении.

Чтобы определить возможности базовой линии, необходимо использовать более новую версию pppd с поддержкой RFC 4638. Ubuntu 16.04 имеет более новую версию pppd и, таким образом, должна иметь возможность использовать большие размеры MTU для PPPoE без необходимости перекомпиляции какого-либо кода.

решение2

Вы можете запустить pppd через strace и отфильтровать его для отображения запросов «open», чтобы увидеть, какие файлы он открывает, чтобы получить его конфигурацию.

sudo strace -f -e open pppd

По моему опыту (широкополосного доступа в Интернет в Великобритании) все соединения были на частоте 1492, если они проходили через BT. Есть ли конкретная причина, по которой вам нужны еще 8 октетов?

Насколько я понимаю, если вы не сопоставите MRU должным образом, то ваши пакеты могут превратиться в несколько пакетов, особенно если вы не допускаете таких вещей, как 8-октетные накладные расходы для инкапсуляции.

Связанный контент