SSH подключается, появляется приглашение, и сеанс умирает, как только команда возвращает что-то объёмное. Эхо ещё немного работает, затем соединение истекает, а клиент по-прежнему показывает туннель поднятым. Сеанс, здоровый до прихода данных, обычно упирается в ограничение размера, а не в дефект SSH. Проверки ниже упорядочены так, чтобы самое дешёвое объяснение исключалось первым.

Прочитайте форму сбоя, прежде чем трогать профиль

Мелкие пакеты проходят, полные нет. Приглашение, баннер или одно нажатие клавиши помещаются легко; список каталога, загрузка или вставленный блок нет. Размер, при котором меняется поведение, и есть подсказка, а не факт участия SSH.

Механизм таков: обнаружение MTU пути, которое зависит от обратной связи. TCP выбирает размер сегмента, и когда маршрутизатор на пути не может переслать получившийся пакет, он должен сообщить об этом сообщением ICMP. Инкапсуляция делает внешний пакет больше внутреннего, поэтому полезный размер внутри туннеля всегда ниже физического канала. Отфильтруйте эти сообщения ICMP где угодно, и отправитель никогда не получит поправку, продолжит слать полные сегменты, а внешний пакет будет отброшен без уведомления.

Измерьте потолок с обеих сторон

Сравните MTU туннеля с физическим каналом, прежде чем менять что-либо из этого. Туннель, скопировавший физическое значение, уже сказал, где расхождение.

Проверьте изнутри туннеля запросом с запретом фрагментации, снижая полезную нагрузку, пока не вернутся ответы. Аргумент размера считает только нагрузку, поэтому рабочее число всегда ниже MTU интерфейса. Прибавьте обратно размеры заголовков, если нужен номер интерфейса.

ip link show tun0
ping -M do -s 1380 10.9.0.1

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

mssfix и fragment делают разную работу

mssfix ограничивает размер сегмента, который TCP-соединения внутри туннеля объявляют при рукопожатии. Это правильный рычаг для SSH, HTTPS и копирования файлов, поэтому зависание часто исчезает сразу после настройки. UDP-нагрузки он вообще не трогает.

Туннель, несущий и службу UDP, может продолжать сбоить после исправления SSH, и этот результат сбивает с толку всякого, кто полагает, что одна опция покрывает всё.

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

Снижение MTU интерфейса — грубый вариант

Уменьшение MTU интерфейса на обоих концах — грубый инструмент. Он сообщает каждому внутреннему отправителю меньшее число, что работает, и перекладывает эту цену на весь трафик, а не на TCP-потоки, которым она нужна.

Выбирайте его, когда туннель несёт трафик, который вы не можете ограничить, или когда клиент — устройство, профилем которого вы не управляете. Применяйте симметрично и записывайте значение рядом с профилем. Наполовину применённое изменение хуже, чем никакое, потому что выглядит как исправление.

Перепроверьте той передачей, которая зависла

Переподключитесь, чтобы настройки загрузились, откройте новое соединение и повторите команду, которая замерла. Размер сегмента согласуется при рукопожатии, поэтому сеанс, переживший переподключение, всё ещё несёт старое значение. Ping здесь плохая проверка, потому что весь сбой в том, что мелкие пакеты проходят. Используйте тот список, загрузку или вставку, которые сломались.

Если зависание сохраняется при меньшем размере, смотрите в другом месте: межсетевой экран с состоянием, который истекает поток, дублированный адрес или маршрут, смещающийся при переподключении. Запишите размер неудачной проверки и изменённую настройку, потому что именно эта пара делает следующий отчёт полезным.

Похожие статьи