Источник порта клиента NFS при повторном подключении

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

Я использую NFS-клиент для подключения к кластеру NFS. Я заметил, что стандартное поведение при недоступности сервера — это повторные попытки установить TCP-соединения с того же исходного TCP-порта, что я подтвердил с помощью tcpdump (множество пакетов SYN, разные номера последовательности, но тот же исходный порт). По умолчанию NFS использует привилегированные порты (<1024), в моем примере порт 940.

По какой-то причине это вызывает проблемы с балансировщиком нагрузки Azure (мой другой вопрос). Однако, когда я монтирую ресурс с опцией noresvport (и экспортирую с insecure), NFS-клиент использует порты >1024 и теперь при каждой попытке переподключения используемый TCP-порт будет отличаться.

NFS-клиент — это SLES12 SP4, такое же поведение наблюдается и на Oracle Linux 7.7.

NFS-сервер — это кластер HAE на базе SLES12 SP4.

Документировано ли где-то такое поведение? Почему он использует один и тот же порт каждый раз по умолчанию, но не при использовании noresvport?

Мы столкнулись с этим при наличии устройства L4 (f5, межсетевой экран, устройство безопасности) в середине, которое не разорвалось соединение, и оно все еще существует в таблице соединений, когда SYN приходит с того же исходного порта. Клиент никогда не рандомизирует исходный порт и держит запись таблицы соединений активной.

Обычно это происходит, когда сервер NFS падает и никаких RST не отправляется на хост. Наши специалисты используют жесткие ссылки для всего как rooteq и удивляются, почему они постоянно сталкиваются с проблемами.

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

Теория

Когда клиенты NFS (Network File System) подключаются к серверу, они обычно используют зарезервированные (привилегированные) порты, которые находятся в диапазоне от 1 до 1023. Это исторически сложившаяся практика обеспечивает определенный уровень безопасности, так как определенные сервисы ожидают подключения с доверенных диапазонов. Клиенты NFS, как правило, выбирают один и тот же исходный TCP-порт при повторных попытках подключения, если это соединение разрывается.

Такое поведение потенциально может вызывать проблемы в сценариях, где используется балансировка нагрузки или сетевые устройства, такие как Azure Load Balancer. Они могут интерпретировать повторное использование исходного порта как часть живого или подвисшего соединения, что может приводить к тому, что попытки нового подключения заблокируются.

Использование опции noresvport позволяет клиенту NFS использовать порты выше 1024, что динамически выбирается системой и отличается на каждую повторную попытку подключения. В результате, это позволяет избежать проблем, связанных с блокировкой соединения балансировщиком нагрузки.

Пример

В вашей ситуации клиент NFS, работающий на SLES12 SP4 или Oracle Linux 7.7, выполняет подключение к кластеру NFS на базе SLES12 SP4. Вы заметили, что если сервер недоступен, клиент предпринимает повторные попытки подключения, используя один и тот же исходный порт, например, порт 940. Это поведение подтверждено с помощью tcpdump, где видно отправку многих пакетов SYN с одним и тем же портом. Это вызывает проблемы при работе через балансировщик нагрузки Azure, который может не адекватно обрабатывать такие повторные попытки.

При использовании монтирования с опцией noresvport, источник TCP-портов становится непостоянным и случайным, когда каждый раз используется новый порт. Это позволяет избежать проблем блокировки соединения устройствами на уровне L4, такими как f5 или другие устройства безопасности, которые могут удерживать записи о соединении на основании статических исходных портов.

Применение

Данное поведение достаточно обосновано с точки зрения работы NFS и связано с историческими и сетевыми трендами безопасности. Важно понимать, что повторное использование одного и того же порта служит для минимизации потребления системных ресурсов и контроля потоков данных, однако имеет свои ограничения, особенно в сетях с высокой доступностью и отказоустойчивостью.

Для успешного решения проблем указанного типа следует:

  1. Используйте опцию noresvport в конфигурации клиента NFS, чтобы обеспечить выбор динамических портов выше 1024. Это убережет вас от проблем с устаревшими записями соединений на балансировщиках нагрузки.

  2. Через конфигурацию экспортируемых файлов на сервере NFS необходимо указать опцию insecure, чтобы разрешить доступ с непривилегированных портов, что требуется при использовании упомянутой выше клиентской опции.

  3. Рассмотрите вопрос настройки сетевых устройств на предмет управления устаревшими TCP-соединениями. Особо это касается безопасности и балансировки нагрузки, которые могут некорректно обрабатывать многократные запросы SYN с одной и той же информацией о портах.

  4. Проводите регулярный аудит и мониторинг сетевой деятельности с использованием инструментов вроде tcpdump, чтобы отслеживать каналы соединений и вовремя предотвращать подобные сетевые затыки.

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

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

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