
У меня установлен 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-октетные накладные расходы для инкапсуляции.