Почему один SSL рукопожатие не удается из-за большого MTU?

Вопрос или проблема

У меня есть единственное SSL-соединение на сервере (к owner-api.teslamotors.com), которое просто зависает. Независимо от того, использую ли я wget, curl или openssl s_client. Для простоты я показываю версию с curl, так как она дает больше всего отладочных сообщений:

# curl -iv https://owner-api.teslamotors.com 
*   Trying 18.203.70.200:443...
* Connected to owner-api.teslamotors.com (18.203.70.200) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs

Тут зависает. Зависает после ClientHello. Соединение TCP успешно устанавливается (также подтверждено с помощью telnet/nc). Любое другое сетевое соединение, включая любое SSL-соединение, которое я пробовал, работает. Кроме https://owner-api.teslamotors.com:443.

После долгих поисков я нашел это сообщение. Они говорили о MTU, и это звучало настолько неправдоподобно, что сначала я даже не стал пытаться. Но затем я уменьшил MTU на сервере, и это действительно сработало! Работает с любым MTU<=1420.

Сервер подключен через Ethernet (MTU 1500) к маршрутизатору Mikrotik, и оттуда соединение проходит через туннель wireguard (MTU 1420). Я хорошо понимаю, что это может быть не оптимально, так как любой IP-пакет с сервера >1420 должен будет фрагментироваться. Однако это не зависит от любого L4-протокола. SSL через TCP не должен вообще заботиться о фрагментации и MTU. Тем не менее, этот единственный хост делает.

Я запускал сниффер пакетов на Mikrotik, и трафик не показывает ничего ненормального для меня:

введите описание изображения здесь

Типичное рукопожатие TCP Ном 1-3, затем, вероятно, ClientHello (Ном 4-5) и ServerHello (Ном 6-7). Ни один размер пакета не приближается к MTU, и нет других ICMP-сообщений, которые указывали бы на проблемы с фрагментацией и т. д.

Я действительно потерян, что же здесь происходит.

Почему это одно SSL-соединение не удается?

Ответ или решение

Проблема, описанная в вашем вопросе, связана с неожиданным поведением SSL-соединения, когда оно использует более крупный размер MTU (Maximum Transmission Unit), что приводит к неуспешному SSL рукопожатию. Давайте разберёмся, почему это происходит.

Теория:

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

SSL-процесс подключения включает в себя несколько важных этапов, одним из которых является отправка и получение "ClientHello" и "ServerHello". Если в сети, по которой проходят данные, имеются ограничения по максимальному размеру пакетов и отсутствует поддержка фрагментации, это может привести к ситуации, когда сервер не может получить или обработать данные из-за превышения MTU.

Пример:

В вашем случае, сервер подключен через Ethernet с MTU 1500 к маршрутизатору Mikrotik, а затем соединение проходит через туннель WireGuard с MTU 1420. Разница в MTU может вызвать ситуацию, когда фрагменты пакетов теряются, если они больше, чем поддерживаемый размер в 1420 байт, что может объяснять зависание при получении "ServerHello", после отправки "ClientHello".

Практика показывает, что изменения MTU на клиенте до значения, равного или меньшего, чем MTU туннеля (в вашем случае 1420), может избежать этой проблемы. Это указывает на то, что фрагментация и взаимодействие с туннелем WireGuard нарушают целостность "ClientHello" пакетов.

Применение:

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

  2. Диагностика с помощью сниффера: Используйте инструменты для анализа сетевого трафика, чтобы наблюдать за процессом передачи пакетов. Убедитесь, что на этапе "ClientHello" пакеты не фрагментируются или не теряются.

  3. Коррекция настроек маршрутизатора: Убедитесь, что маршрутизатор и туннель настроены правильно для обработки MTU и фрагментации, если она необходима. Возможно, стоит рассмотреть настройку маршрутизатора для поддержки более крупных MTU или изменить политику управления фрагментацией.

Таким образом, взаимодействие настроек MTU и свойств сети может играть значительную роль в успешности SSL-соединений. В вашем случае настройка меньшего MTU решила проблему, что подчёркивает важность согласования сетевых параметров на всех участках пути передачи данных.

Оцените материал
Добавить комментарий

Капча загружается...