Страница загружается, ping проходит, а копирование файла каждый раз зависает в одном и том же месте. Эта картина указывает на размер пакета, а не на пропускную способность или учётные данные. Инкапсуляция добавляет байты к каждому пакету, поэтому полезная нагрузка, которая помещалась на исходном пути, может превысить предел после прохождения через туннель. В этих обсуждениях три разных числа называют MTU, и их путаница приводит к настройке, которая исправляет одно приложение и ломает другое.

Три числа, которые люди называют MTU

MTU интерфейса — это настроенный предел для пакета на этом канале. MTU пути — это наименьший предел вдоль маршрута, и он обнаруживается, а не настраивается. TCP MSS — это размер полезной нагрузки, который партнёр объявляет как принимаемый, и он выводится из двух других, а не является отдельным физическим пределом.

У туннеля есть внутренний и внешний вид. Внешний пакет несёт инкапсулированный пакет плюс заголовки, нужные протоколу, поэтому доступный внутренний размер меньше того, что допускает внешний путь. Путь до VPN-сервера тоже отличается от пути сервера до назначения.

Обнаружение MTU пути позволяет отправителю узнать работающий размер, но зависит от того, придёт ли обратная связь. Когда промежуточное устройство фильтрует соответствующие сообщения ICMP, отправитель продолжает передавать пакеты, которые никогда не завершаются, и это классическая чёрная дыра. Симптом узнаваем, если его знать: рукопожатие проходит, первая полезная нагрузка полного размера исчезает, а соединение в итоге сбрасывается или зависает. Ничто в журнале приложения не выглядит как сетевая проблема.

Проверьте путь нагрузкой, которой управляете вы

Проба — это доказательство об одном маршруте и одном размере, а не рекомендуемая настройка. Используйте отвечающий хост и меняйте только размер нагрузки.

ping -M do -s 1372 -c 2 203.0.113.20
ping -4 -f -l 1372 vpn.example

Первая команда отправляет проверку из Linux с отключённой фрагментацией и нагрузкой 1372 байта, а вторая делает то же самое в Windows, где нагрузка задаётся с помощью -l. Ответ означает, что этот размер прошёл путь. Сообщение о необходимости фрагментации информативно, а тайм-аут неоднозначен: хост или промежуточное устройство может просто отбросить ICMP.

Снижайте размер несколькими шагами, а не двоичным поиском до байта. Вы пытаетесь установить, существует ли потолок размера, а не опубликовать число для каждой сети. Найденное число относится к этому пути, этому протоколу и этому семейству адресов.

IPv4 и IPv6 фрагментируются по-разному, поэтому результат одной семьи ничего не говорит о другой. Проверяйте то семейство, которое приложение действительно использует.

Ограничение MSS помогает только TCP

В TCP эффективная нагрузка согласуется во время рукопожатия, и маршрутизатор на пути может переписать это значение вниз, чтобы обе стороны отправляли меньшие сегменты. Именно это делает ограничение MSS, и оно работает, вообще не касаясь клиента.

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
ip link show tun0

Первое правило ограничивает объявленный MSS значением MTU пути для пересылаемых рукопожатий TCP, а второе показывает собственный MTU интерфейса туннеля, чтобы вы могли сравнить его с тем, что допускает путь. Ограничение — наименее инвазивное исправление для приложения TCP, которое зависает после рукопожатия.

Для UDP оно не делает ничего. Голосовой или игровой клиент, отправляющий большие датаграммы, полностью проигнорирует настройку MSS, потому что здесь нет рукопожатия, которое можно переписать. Если сбойное приложение работает по UDP, посмотрите вместо этого на собственные параметры размера пакета клиента. Два протокола отказывают по-разному и чинятся разными инструментами, поэтому протокол должен быть в первом предложении заявки.

OpenVPN предоставляет параметры вроде tun-mtu, mssfix и настройки, связанные с фрагментацией, и их поведение зависит от версии и от того, является ли канал данных AEAD. Прочитайте руководство для используемой версии и меняйте по одному параметру за раз.

Измените одну поддерживаемую настройку и повторите оба прогона

Сохраните исходный профиль, измените одно поддерживаемое значение и повторите как маленький запрос, который работал, так и большую передачу, которая не удалась. Если меняется только большая, вы гнались за размером. Если меняются обе, вместе с ней сдвинулось что-то ещё.

Меньшее значение может ослабить симптом, добавляя накладные расходы, поэтому наименьшее возможное число не является целью. Цель — размер, который путь надёжно несёт с наименьшими потерями. Запишите значение, путь и версию клиента в заявку, потому что то же число, применённое в другом месте, — догадка.

Если тот же профиль работает из другой доверенной сети, оставьте это различие в диагнозе, а не объявляйте клиент исправленным. Переменная, которая изменилась, — это путь, и именно путь измерила проба.

Похожие статьи