NFS4, небезопасный, номер порта, помощь с противоречием RDMA

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

  • С текущей версией RHEL 8.8 и RHEL 9.x последняя версия NFS — 4.2.
  • Когда была введена версия NFS 4, она убрала некоторые моменты в NFS3, одним из которых было использование нескольких номеров портов:
    • NFS4 предписывает весь трафик теперь исключительно через TCP использовать единственный хорошо известный порт 2049.
    • https://www.snia.org/sites/default/files/SNIA_An_Overview_of_NFSv4-3_0.pdf
    • можно найти больше в основном заслуживающих доверия статей, утверждающих то же самое.
    • Я подтвердил это, открыв только TCP 2049 в firewalld для NFS 4.1 в RHEL 7.9; он не использует порт 111 или какой-либо другой, если вы не измените настройки по умолчанию в /etc/nfs.conf или /etc/sysconfig/nfs. И на самом деле, когда мне удалось заставить rdma работать (через порт 20049), было обнаружено, что протокол rdma специально обходит firewalld, что, видимо, и является одной из причин, почему rdma экономит процессорные циклы и работает быстрее.

Опция NFS insecure в /etc/exports устанавливает сервер на прослушивание запросов с любого порта на клиенте. Изменение её на ‘secure’ (по умолчанию) гарантирует, что сервер будет слушать только запросы, исходящие с портов 1-1024 на клиенте. Тем самым неавторизованный пользователь на клиенте удерживается от начала диалога с NFS. Для справки: https://security.stackexchange.com/questions/246527/what-is-insecure-about-the-insecure-option-of-nfs-exports

По умолчанию используется secure в отличие от insecure при экспорте NFS4, если ни один из них не указан в /etc/exports.

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

Во-первых, с опцией secure в /etc/exports, по умолчанию, система будет работать только на безопасных портах, меньше чем 1024`, кажется, это полностью неверно, так как NFS4 работает на порту 2049. Число 2049 больше, чем 1024… что я упускаю?

Что касается RDMA, которое по соглашению происходит на порту 20049, кажется, что есть незначительный упуск, что нужно явно указать опцию insecure в /etc/exports, если будет использоваться mount -o rdma, иначе монтирование всегда происходит с proto=tcp, а не с proto=rdma без объяснения причин.

Я проверил это, используя MLNX_OFED_LINUX-23.04-1.1.3.0-rhel8.8-x86_64.iso, установленный вместо пакетов Redhat InfiniBand Support, что mount -o rdma,port=1023 работает с монтированием на стороне клиента, показывая proto=rdma.

Однако нужно также выполнить (только с MLNX?) echo rdma 20049 > /proc/sys/nfsd/portlist. Или в случае с безопасным экспортом — echo rdma 1023. Кто-нибудь знает, почему эти значения изначально не находятся в /proc/sys/nfsd/portlist и почему я должен делать это вручную? И тогда какой правильный способ поставить эти числа туда, чтобы после загрузки мое /etc/fstab монтирование папки данных как rdma происходило успешно? Инструкционный pdf от MLNX оказывается недостаточным.

Я ломал голову над тем, чтобы заставить RDMA работать, кажется, есть много недостатков в NFS в целом, и у меня есть платное кластерное программное обеспечение, в котором есть места под RDMA для конфигурации, но все монтирования всегда с proto=tcp. Поэтому, если кто-то может предоставить любую информацию по описанному, это будет полезно, я поставлю плюс за любой ответ.

Также: в итоге я сделаю /etc/exports с secure и выберу какой-то номер порта 1023 и ниже, чтобы удовлетворить правила безопасности. Как выбрать подходящий номер в этом диапазоне? Поскольку я — никто, мое понимание заключалось в том, что я никогда не должен использовать номера портов ниже 1000 или 1024 для всего, что я настраиваю?

Обновление: оказывается, что параметр secure или insecure в /etc/exports не имеет значения. Важно, чтобы rdma 20049 было в /proc/fs/nfsd/portlist на nfs-сервере. С этим, или любым другим числом, похоже, это работает с secure exportfs.

У вас есть несколько вопросов и обеспокоенностей, касающихся NFS (Network File System) версии 4, её параметров безопасности, номеров портов и использования RDMA (Remote Direct Memory Access).

Версия NFS 4 устранила необходимость использования нескольких номеров портов, которые использовались в версии NFS 3. Поэтому для NFSv4 весь трафик обрабатывается через TCP на порте 2049.

Безопасность и NFS

Опция insecure в /etc/exports не относится к номеру порта. Она определяет, будет ли NFS-сервер принимать запросы с любого порта на клиенте (insecure) или только с портов 1-1024 (secure). Эта опция не связана с известным портом 2049, используемым NFSv4.

Что небезопасного в параметре “insecure” в экспортах NFS?

Утверждение о том, что сервер будет “работать только на безопасных портах менее 1024” неверно в контексте NFSv4, так как он работает на порте 2049, который больше 1024.

При использовании RDMA с NFS вам нужно указать опцию insecure в /etc/exports, чтобы разрешить монтирование RDMA. Без этой опции NFS будет по умолчанию использовать TCP (proto=tcp) вместо RDMA (proto=rdma).

Для выбора номера порта ниже 1024 выберите порт в диапазоне 1-1023, который уже не назначен какой-либо известной службе.

Вы можете обратиться к реестру номеров портов и имен служб IANA (Internet Assigned Numbers Authority), чтобы убедиться, что вы не выбрали порт, который уже используется.

Реестр имен служб и номеров портов транспортных протоколов

Проверьте, что ваш /etc/services содержит сопоставление имен служб с номерами портов:

cat /etc/services

Если вам нужен огромный список используемых номеров, пожалуйста, установите пакет nmap.

Относительно /proc/fs/nfsd/portlist, который в значительной степени является проблемой

https://patchwork.kernel.org/project/linux-nfs/patch/[email protected]/

файл /etc/nfs.conf в RHEL 8, интерпретируемый как шаблон, имеет #rdma=n в нем. Поэтому логично подумать, что надо просто раскомментировать и сделать rdma=y… где y равно да. Это не работает полностью.

Вместо этого нужно сделать rdma=nfsrdma вместо rdma=y. Тогда rdma 20049 появится в /proc/fs/nfsd/portlist. Или я предполагаю, какой бы rdma-port ни был указан в /etc/nfs.conf. Затем NFS RDMA работает; это с установленным MLNX. Для наблюдения изменения в proc после выполнения service nfs-server restart требуется время.

На современных системах Linux есть 2 проблемы, которые нужно адресовать:

  • Модуль ядра rpcrdma должен быть загружен на сервере и клиенте
  • rdma, связанный с каким-либо портом (неважно, каким), должен появиться в /proc/fs/nfsd/portlist

Чтобы выполнить первое из них, просто добавьте rpcrdma в /etc/modules-load.d/modules.conf

Чтобы выполнить второе, этот аргумент нужно указать в командной строке /usr/sbin/rpc.nfsd: --rdma=2049. На Ubuntu это проще всего сделать, добавив следующую строку в /etc/default/nfs-kernel-server:

RPCNFSDOPTS="--rdma=2049"

(Я просто использую обычный порт NFSv4 вместо 20049, чтобы избежать потенциальных проблем с брандмауэром в будущем.)

Я должен добавить, для полноты, что вся оставшаяся конфигурация — это просто стандартные шаги, которые делают для настройки NFS сервера.

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

Это относится к опции insecure_locks в exports(5), которая является алиасом для опции no_auth_nlm. Это обходное решение для старых клиентов NFS и не должно быть нужно с современными клиентами.

Опция insecure делает что-то другое (заставляет сервер отклонять пакеты от клиентов с исходным портом меньше чем IPPORT_RESERVED (1024).

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

Конечно, давайте подробно рассмотрим проблемы и вопросы, связанные с использованием NFS4, RDMA и параметрами безопасности, опираясь на предоставленные данные.

Теория

NFS (Network File System) — это протокол, который позволяет файловым системам, расположенным на одном компьютере, быть доступными для других компьютеров сети, как если бы они были установлены локально. Развитие NFS привело к изменениям в версии 4, которая отличается различными улучшениями по сравнению с предыдущими версиями, включая использование единственного порта для всех данных, передачу исключительно по протоколу TCP и другие изменения безопасности. В NFSv4 предусмотрено использование порта 2049 как единственного известного порта для всех данных, что упрощает настройку и управление безопасностью.

Что касается параметров безопасности NFS, опция secure устанавливает сервер для прослушивания запросов только с клиентских портов 1-1024, которые в UNIX-системах считаются "безопасными" и зарезервированными для системных процессов. Опция insecure, напротив, позволяет использовать любые порты клиента. Она часто используется для совместимости с более старыми клиентами, но может повышать риск несанкционированного доступа.

RDMA (Remote Direct Memory Access) — это технология, позволяющая обмениваться данными между системами с минимальной загрузкой CPU и меньшими задержками, за счет прямого доступа к памяти удаленной машины. В контексте NFS, RDMA может использовать порт 20049, но его использование может потребовать дополнительных настроек.

Пример

Из вашего описания следует, что вы испробовали различные комбинации настроек для конфигурационного файла /etc/exports, включая secure и insecure, но столкнулись с ситуацией, где использование RDMA требует дополнительных манипуляций с /proc/sys/nfsd/portlist и конфигурацией NFS. Вы попытались указать RDMA порт в конфигурации и сделать его доступным для системы, что частично привело к успешному функционированию RDMA. Данное поведение подтверждает, что без явной настройки порта RDMA в системе происходит возврат к TCP.

Применение

Для решения проблем, связанных с конфигурацией, учтите следующие моменты:

  1. Понимание порта NFS4: Порт 2049, используемый NFSv4, не противоречит концепции "безопасных" портов. Он используется для всех соединений NFS, и его отдельное применение от параметра secure/insecure в файле /etc/exports. Параметр secure влияет только на клиентскую сторону.

  2. Использование RDMA: Убедитесь в корректной загрузке модуля ядра rpcrdma на обоих серверах: клиенте и сервере. Это включает добавление его в конфигурационный файл модулей системы и корректную настройку RDMA в файле /etc/nfs.conf. Рекомендуется использование известного порта, например, 2049, чтобы избежать потенциальных проблем с настройками фаервола.

  3. Настройка /proc/fs/nfsd/portlist: Необходимо убедиться, что нужные порты добавлены в список, с настройкой через скрипты, автоматически запускаемые при старте системы. Это может быть достигнуто путем добавления необходимой конфигурации в файлы, такие как /etc/default/nfs-kernel-server, что позволит системе всегда использовать нужные порты при запуске.

  4. Подбор порта: Чтобы выбрать порт ниже 1024 в целях безопасности, обратитесь к реестру IANA для проверки доступности порта. Это поможет избежать использования уже назначенного сервиса и предотвратит возможные конфликты.

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

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

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