В WireGuard нет переговоров о MTU. Он шифрует всё, что передаёт ему интерфейс, и отправляет результат, а если инкапсулированный пакет превышает путь, он где-то отбрасывается или фрагментируется, где вы этого не видите. Кто-то должен выбрать MTU интерфейса, и этот кто-то — инструмент, который поднял интерфейс.

Есть три кандидата, и их легко перепутать.

Три места, откуда может взяться значение

Значение можно задать явно в конфигурации интерфейса, его может вычислить инструмент настройки по информации о маршруте, или его задаст любой сетевой менеджер, которому принадлежит интерфейс. Обычный вызов wg не делает ничего из этого, потому что wg управляет только ключами и пирами. MTU живёт на сетевом интерфейсе, поэтому ip link show wg0 — это место, где вы его читаете.

Если вы не уверены, какой случай применим, сначала прочитайте MTU, а затем выясните, кто запустил интерфейс.

Решайте по тому, кто управляет интерфейсом

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

Решение не в том, какое число лучше в абстракции. А в том, какой компонент вы действительно можете настроить.

Что делает расчёт по умолчанию

wg-quick ищет маршрут до конечной точки пира, берёт MTU этого исходящего интерфейса и вычитает накладные расходы инкапсуляции. С внешним заголовком IPv4 это около 60 байт, с IPv6 — около 80. Результат ограничивается, чтобы путь в 1500 байт давал 1420, а не значение, работающее только в одном семействе адресов. Это разумное значение по умолчанию, а не измерение вашего пути.

Он не может знать о более позднем туннеле, мобильном канале или отфильтрованном пути ICMP.

Ограничение скрывает настоящий вопрос. Если ваш путь действительно 9000 байт от края до края, 1420 оставляет производительность на столе, а если путь 1400, то 1420 уже слишком велик. Значение по умолчанию — компромисс, и так к нему и нужно относиться.

Когда путь меняется под вами

Ноутбук, который переходит с Ethernet на Wi-Fi, а затем на точку доступа телефона, сохраняет MTU интерфейса, с которым стартовал. Внешний путь теперь может быть меньше, и ничего заново не согласуется. Вложенные туннели ухудшают дело, потому что каждый слой вычитает свои накладные расходы из одного и того же бюджета. Значение, работавшее в офисе, — не то значение, которое работает в аэропорту.

Недавнее рукопожатие доказывает, что ключи работают. Оно ничего не доказывает о том, помещаются ли крупные пакеты.

Проверяйте по одному числу за раз

Сохраняйте то же приложение и назначение, измените одно значение и измерьте. ping -M do -s 1372 проверяет пакет в 1400 байт с установленным битом DF, и это именно та форма проверки, которая вам нужна. Если малые запросы проходят, а большие застревают, у вас проблема размера, а не маршрутизации.

Меняйте только MTU. Настройка нескольких параметров пакета сразу ничего не говорит о том, какой из них был важен.

И не ждите, что изменение MTU исправит отсутствующий обратный маршрут, правило пересылки или сбой DNS. Они тоже дают симптомы отсутствия трафика, и для них есть свои проверки. Руководство wg-quick описывает автоматический выбор.

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