Skip to content
VDS · Мережа, IP-адреса та домени

MTU 1420: чому деякі сайти можуть зависати і як це виправити

Що таке MTU, звідки береться 1420, як виглядає проблема «сторінка зависає на половині» і як це перевірити та виправити.

Оновлено 23 серпня 2026 р.

MTU — це максимальний розмір пакета, який можна надіслати мережею без фрагментації. Звичне значення в Ethernet — 1500 байтів. Коли трафік іде через тунель, його власні заголовки займають частину простору, залишаючи менше корисного навантаження: типове значення — 1420.

Саме собою це не проблема. Проблеми починаються, коли одна сторона вважає, що може надіслати 1500, але на шляху є ділянка з 1420, і повідомлення про це губиться.

Як виглядає симптом

  • SSH підключається, вітання надходить, але ls у великому каталозі підвішує сесію.
  • Сторінка починає завантажуватися й завмирає на середині.
  • curl -I (лише заголовки) працює, а повний curl зависає.
  • apt update проходить успішно, apt upgrade застрягає під час завантаження.
  • Малі запити пролітають, великі відповіді не надходять ніколи.

Спільна ознака однакова: малі пакети проходять, великі зникають без помилки. З'єднання не розривається; воно просто замовкає.

Причина в тому, що механізм узгодження розміру пакета покладається на службові повідомлення ICMP. Якщо щось фільтрує їх на шляху, відправник так і не дізнається, що пакет завеликий, і надсилає його знову й знову.

Перевірка

Надішліть пакет із встановленим бітом «не фрагментувати» і зменшуйте розмір, доки він не пройде:

ping -M do -s 1472 -c 2 1.1.1.1
ping -M do -s 1392 -c 2 1.1.1.1

До розміру -s додаються 28 байтів заголовків: 1472 відповідає MTU 1500, а 1392 — MTU 1420. Якщо перший варіант не проходить, а другий вдається, ви знайшли межу.

Поточне значення інтерфейсу:

ip link show
ip route get 1.1.1.1

Як це виправити

Одноразова перевірка:

ip link set dev eth0 mtu 1420

Назавжди, через systemd-networkd — файл /etc/systemd/network/10-eth0.network:

[Match]
Name=eth0

[Link]
MTUBytes=1420
systemctl restart systemd-networkd

Якщо мережею керує NetworkManager:

nmcli connection modify "System eth0" 802-3-ethernet.mtu 1420
nmcli connection up "System eth0"

Другий прийом, корисний, коли ви не можете чіпати MTU, — затискати розмір TCP-сегмента на межі. У nftables:

tcp flags syn tcp option maxseg size set rt mtu

Коли це вас стосується

На самій машині Millida VDS мережу налаштовано правильно, і зазвичай вам не потрібно чіпати MTU вручну. Мати справу з цим доводиться, коли ви самі налаштовуєте тунель: WireGuard, OpenVPN, GRE, VPN до офісу або зв'язок між машинами. Усередині тунелю MTU завжди менший, і його потрібно задати явно.

Для WireGuard у секції [Interface]:

MTU = 1420

Поширені помилки

ПомилкаНаслідок
Повністю блокувати ICMP у фаєрволіВи ламаєте узгодження розміру пакета для себе
Задавати MTU лише з одного боку тунелюТрафік зависає в одному напрямку
Змінювати MTU навманняВи приховуєте справжню причину: втрату пакетів або помилку сервісу

Не чіпайте MTU, доки не відтворите симптом командою ping -M do. Без цієї перевірки ви змінюєте робочу конфігурацію на основі здогаду — і отримуєте нову проблему замість старої. Не блокуйте ICMP повністю; дивіться nftables.