Устранение неполадок · 1 мин чтения

MTU, фрагментация и почему ваш WireGuard тормозит

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

Что такое MTU и почему туннели его ломают

MTU (Maximum Transmission Unit) — это самый большой пакет в байтах, который канал связи пронесёт одним куском. Стандартный MTU для Ethernet — 1500. Если пакет слишком велик для канала, его либо фрагментируют на меньшие части, либо отбрасывают.

Туннель WireGuard заворачивает каждый ваш пакет в шифрованный UDP-пакет, и эта обёртка добавляет накладных байтов — примерно 60 для IPv4 и 80 для IPv6. Поэтому полноразмерный пакет на 1500 байт от вашего приложения после инкапсуляции в WireGuard становится больше 1500, и нижний канал уже не пронесёт его целиком. Именно поэтому WireGuard по умолчанию ставит MTU интерфейса 1420: этот запас уходит под накладные расходы шифрования, чтобы инкапсулированный пакет всё равно помещался в путь на 1500 байт.

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

При нормальном ходе дел, когда пакет слишком велик, чтобы переслать его без фрагментации, маршрутизатор отправляет назад сообщение ICMP «Fragmentation Needed», и отправитель уменьшает размер пакета — это и есть Path MTU Discovery (PMTUD). Беда в том, что многие сети и файрволы молча отбрасывают эти ICMP-сообщения. Тогда вы получаете чёрную дыру PMTU: малые пакеты (вроде начала страницы) проходят, а большие исчезают без единой ошибки. Симптом ни с чем не спутать: соединение устанавливается, а потом зависает; SSH пускает, но замирает на выводе; одни сайты открываются, другие стоят; большие загрузки застревают на 0%.

Если на вашем пути MTU ниже ожидаемого — типично для DSL/PPPoE (он добавляет 8 байт), некоторых мобильных сетей и дважды инкапсулированных каналов, — то даже 1420 от WireGuard может быть многовато, и вы влетаете в ту же чёрную дыру. Лечится это снижением MTU туннеля, чтобы инкапсулированные пакеты помещались в реальный путь.

Найдите и выставьте правильный MTU

Прощупайте самый большой пакет, который проходит вашим путём без фрагментации, и выставьте MTU интерфейса WireGuard ниже него. Значения здесь примерные — меряйте свои.

bash
# 1) Probe path MTU with don't-fragment pings (Linux/macOS).
#    Lower the size until it succeeds; that size + 28 = path MTU.
ping -M do -s 1472 8.8.8.8    # 1472 + 28 (ICMP/IP headers) = 1500
ping -M do -s 1392 8.8.8.8    # if 1472 fails, try smaller (=> 1420)
ping -M do -s 1252 8.8.8.8    # a safe fallback (=> 1280)

# 2) Set the tunnel MTU in your WireGuard config, under [Interface]:
#    [Interface]
#    MTU = 1280        # widely-compatible fallback; try 1412/1420 first

# 3) Apply and test a large transfer:
wg-quick down wg0 && wg-quick up wg0
curl -o /dev/null https://speed.example/largefile

# Rule of thumb: if small requests work but big ones hang, LOWER the MTU.
# 1420 -> 1412 -> 1280 are common steps. 1280 is the IPv6 minimum and
# almost always passes, at a small efficiency cost.
Поделиться страницей
FAQ

Ответы на вопросы

Какой MTU ставить для WireGuard?

Начните с дефолтных 1420. Если крупные передачи зависают, а мелкие запросы ходят, снижайте: типичные шаги — 1412, затем 1280. 1280 — это минимальный MTU для IPv6, он работает почти всегда, хоть и немного теряет в эффективности. Прощупайте путь пингами с флагом don't fragment, чтобы найти наибольшее значение, которое проходит.

Почему WireGuard подключается, а потом застревает на больших файлах?

Почти всегда это чёрная дыра PMTU. Ваши пакеты слишком велики для пути, а ICMP-сообщения, которые должны были бы об этом сказать, где-то отбрасываются, поэтому большие пакеты исчезают молча, а малые проходят. Снизьте MTU туннеля — пакеты начнут помещаться, и зависание уйдёт.

Почему в WireGuard MTU по умолчанию 1420, а не 1500?

Потому что WireGuard инкапсулирует каждый пакет в шифрованный UDP и добавляет около 60 байт накладных расходов (для IPv4). MTU интерфейса 1420 оставляет под них место, чтобы инкапсулированный пакет всё равно помещался в стандартный путь на 1500 байт без фрагментации.

Туннель, настроенный так, чтобы просто работать

s4m держит WireGuard и OpenVPN со здравыми настройками по умолчанию и архитектурой без логов, преимущественно в памяти. Если сети нужен более низкий MTU, вы правите одну строку — и всё. Анонимные аккаунты, принимаем крипту.

Эту страницу нашли по запросу

Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.