Чому VPN зависає на великих передаваннях, але не на малих
Малі запити отримують відповідь, а великі передавання завмирають. Порівняйте межу інтерфейсу, межу шляху й оголошене навантаження TCP, перш ніж копіювати фіксований MTU.
Сторінка завантажується, 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. Прочитайте посібник для використовуваної версії і змінюйте по одному параметру за раз.
Змініть одне підтримуване налаштування і повторіть обидва запуски
Збережіть початковий профіль, змініть одне підтримуване значення і повторіть як малий запит, що працював, так і велике передавання, що не вдалося. Якщо змінюється лише велике, ви гналися за розміром. Якщо змінюються обидва, разом із ним зрушилося щось інше.
Менше значення може послабити симптом, додаючи накладні витрати, тому найменше можливе число не є метою. Мета — розмір, який шлях надійно несе з найменшими втратами. Запишіть значення, шлях і версію клієнта в заявку, бо те саме число, застосоване в іншому місці, — здогад.
Якщо той самий профіль працює з іншої довіреної мережі, залиште цю різницю в діагнозі, а не оголошуйте клієнт виправленим. Змінна, що змінилася, — це шлях, і саме шлях виміряла проба.