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

Почти всегда это MTU.

Что такое MTU и почему он ломается именно в туннеле

MTU — максимальный размер пакета, который сеть согласна передать целиком. В обычном Ethernet это 1500 байт.

Туннель добавляет к каждому пакету собственные заголовки. У WireGuard поверх IPv4 накладные расходы составляют 60 байт: 20 на внешний IP-заголовок, 8 на UDP и 32 на служебные данные самого протокола. Значит, полезной нагрузки внутри туннеля остаётся 1440 байт, и обычно ставят 1420 — с небольшим запасом.

Если внутри туннеля оставить 1500, каждый крупный пакет после упаковки превысит предел канала. Дальше возможны два исхода, и оба плохие.

Почему это «чёрная дыра», а не ошибка

В теории существует механизм обнаружения MTU по пути: узел, которому пакет великоват, отправляет отправителю служебное сообщение ICMP «нужна фрагментация», и тот уменьшает размер.

На практике эти сообщения часто теряются. Многие сети режут ICMP целиком — из соображений безопасности или просто по недосмотру в правилах файрвола. Отправитель не получает ответа и продолжает слать пакеты прежнего размера, которые молча пропадают.

Получается характерная картина:

  • короткие запросы проходят — они помещаются в лимит;
  • рукопожатие TLS проходит — оно тоже небольшое;
  • а первый крупный ответ исчезает, и соединение висит до тайм-аута.

Отсюда и ощущение, что «интернет работает, но сайт не открывается».

Как подобрать значение за пять минут

Способ первый, точный. Отправляем пакеты фиксированного размера с запретом фрагментации и ищем предел:

# Linux и macOS
ping -M do -s 1372 -c 3 1.1.1.1

# Windows
ping -f -l 1372 1.1.1.1

Размер в команде указывается без 28 байт заголовков, поэтому к найденному значению их нужно прибавить: прошло -s 1372 — значит, путь держит 1400. Уменьшайте число, пока ответы не пойдут, и прибавьте 28.

Способ второй, быстрый. Поставить 1280 и не искать. Это минимальный MTU, обязательный для IPv6, и его пропускает любой маршрут в интернете. Потеря пропускной способности от такого запаса — несколько процентов, зато зависших запросов не остаётся.

Куда вписывать

В WireGuard — в секцию интерфейса:

[Interface]
PrivateKey = ...
Address = 10.0.0.2/32
MTU = 1280

В OpenVPN размер задаётся директивой tun-mtu, а при работе поверх UDP помогает ещё и mssfix, который подрезает размер сегментов TCP на входе в туннель. Это лечит основную часть симптомов даже там, где MTU подобран неидеально.

Когда запас нужен больше обычного

PPPoE у провайдера. Такое подключение само по себе съедает 8 байт, и канал начинается не с 1500, а с 1492. Все расчёты сдвигаются вниз.

IPv6 снаружи. Внешний заголовок IPv6 занимает 40 байт против 20 у IPv4 — накладные расходы туннеля вырастают на те же 20.

Обфускация. AmneziaWG добавляет к пакетам мусорные данные переменной длины: в этом и смысл маскировки. Верхняя граница становится плавающей, и запас нужен ощутимо больший.

Двойной туннель. Если трафик идёт через два туннеля подряд, заголовки складываются.

Как отличить MTU от других причин

Признак MTU Другое
Мелкие запросы проходят, крупные виснут да нет
Рукопожатие есть, счётчики растут да при обрыве — нет
Проблема на конкретных сайтах, не на всех да при проблемах с DNS — на всех
Помогает уменьшение MTU да

Если же не работает вообще ничего, дело не в размере пакета — смотрите маршрутизацию и DNS. Если ответ обрывается на середине после долгой паузы — это скорее тайм-аут NAT в длинном соединении.

Чем платим за низкий MTU

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

Поэтому выбор простой: гоняться за последними процентами имеет смысл на стабильном канале, а если что-то не открывается — ставьте 1280 и возвращайтесь к тонкой настройке позже.

Коротко

MTU ломается тихо: ошибок нет, скорость нормальная, а часть запросов пропадает. Причина в том, что туннель добавляет заголовки, а служебные ICMP-сообщения о превышении размера по дороге теряются. Лечится одной строкой в конфигурации. Значение 1280 работает всегда, 1420 — оптимально для большинства каналов, а точное подбирается командой ping за пять минут.