Пинг через VPN работает, а сайт зависает: проверьте размер
Небольшой ответ эха не проверяет ни TCP-слушатель, ни большую передачу. Отделите политику доступа от размера пакета, прежде чем снижать MTU туннеля.
Ответы эха приходят, удалённый рабочий стол работает, а браузер остаётся на пустой странице, пока не сдастся. Этому шаблону соответствуют два объяснения, и они не варианты одной проблемы: политика, которая никогда не разрешала службу, или пакеты, которые перестают помещаться, когда передача растёт. Ответ эха не исключает ни одного из них.
Идите от самого маленького вопроса к самому большому и записывайте, что на самом деле доказал каждый шаг.
Ответ эха отвечает на гораздо меньший вопрос
Ответ эха говорит, что IP-стек назначения ответил на запрос ICMP из вашего источника. Он ничего не говорит о том, есть ли TCP-слушатель на нужном порту, разрешает ли политика этот порт или фильтрует ли хост назначения трафик независимо от шлюза. Шлюз, разрешающий одну службу, может отбросить другую, хотя обе цели отвечают на ping. Читайте ответ как один факт об одном пакете и одном направлении.
Подтвердите назначение и порт службы, прежде чем толковать что-либо ещё. Адрес, который вы проверяли, и адрес, который использует приложение, иногда являются разными записями, а имя, разрешающееся в два адреса, делает это вероятным.
Выясните, началось ли соединение
Соединение, отклонённое сразу, — это ответ слушателя или политики: что-то ответило и сказало нет. Соединение, которое открывается, а затем застревает, когда данные начинают двигаться, указывает на размер. Соединение, которое вообще не завершает рукопожатие, обычно связано с политикой или маршрутизацией и выглядит как тайм-аут, а не как отказ.
curl -v --max-time 10 https://internal.example/ -o /dev/null
ss -tn state established '( dport = :443 )'
Запишите, какой из этих трёх случаев вы наблюдали, прежде чем трогать настройки MTU. Изменение размера туннеля ради исправления отклонённого соединения тратит изменение впустую и на время скрывает настоящую причину.
Измерьте размер указанным числом
Когда застревание появляется под нагрузкой, проверьте один размер пакета с установленным битом запрета фрагментации и укажите арифметику, чтобы результат что-то значил. В Linux с iputils полезная нагрузка 1392 байта плюс заголовок ICMP 8 байтов и заголовок IPv4 20 байтов дают внутренний пакет ровно 1420 байтов. Укажите эту арифметику в заявке, потому что голый ping, доходящий до шлюза, ничего не доказывает о приложении.
ping -4 -M do -s 1392 10.44.0.10
ping -4 -M do -s 1372 10.44.0.10
Обе проверки — это точки измерения, а не рекомендации по размеру туннеля. Если ICMP фильтруется где-либо на пути, тайм-аут ничего не говорит о размере, потому что фильтрация и слишком большой пакет выглядят со стороны клиента одинаково. Успех тоже ничего не говорит об обратном направлении или о другом назначении.
Учтите внешний путь
Инкапсуляция добавляет свои заголовки, поэтому пакет на проводе больше пакета, измеренного внутри туннеля. Именно разница между ними делает возможными одновременно работающий маленький запрос и сбойный большой.
Обнаружение MTU пути в IPv4 зависит от обратной связи о пакетах, которые нельзя передать без фрагментации, а IPv6 использует сообщения Packet Too Big. Спецификация IPv4 описывает этот механизм. Фильтрация обратной связи ломает способность отправителя учиться и оставляет его повторно отправлять пакеты, которые никогда не поместятся. Поэтому работающий маленький запрос и сбойный большой так удобно сосуществуют.
Измените одно число и проверьте приложение снова
Снизьте MTU туннеля или ограничьте максимальный размер сегмента для TCP, затем повторите исходную проверку приложения, а не проверку-пробу. Проба, которая удаётся после изменения, и приложение, которое всё ещё висит, — это другая проблема похожей формы, и только проверка приложения различает их.
Храните арифметику в записи об изменении: измеренный размер, предполагаемые накладные расходы и заданное значение. Любой, кто будет это пересматривать позже, сможет проверить допущение вместо того, чтобы выводить его заново из снимка экрана с ping.
Если приложение работает при каждом испробованном размере, прекратите подгонять числа и посмотрите на политику, которая отделяет работающую службу от сбойной.