Защо 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. Прочетете ръководството за използваната версия и променяйте по една опция наведнъж.
Променете една поддържана настройка и повторете и двата опита
Запазете оригиналния профил, променете една поддържана стойност и повторете както малката заявка, която работеше, така и голямото прехвърляне, което се провали. Ако се промени само голямото, сте гонили размера. Ако се променят и двете, нещо друго се е преместило заедно с него.
По-ниска стойност може да намали симптома, като добавя разходи, така че най-малкото възможно число не е целта. Целта е размер, който пътят носи надеждно с най-малко разхищение. Запишете стойността, пътя и версията на клиента в заявката, защото същото число, приложено другаде, е догадка.
Ако същият профил работи от друга доверена мрежа, запазете тази разлика в диагнозата, вместо да обявите клиента за поправен. Променливата, която се промени, е пътят, и точно пътя е измерила пробата.