Вопрос или проблема
- С текущей версией 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.
Опция 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.
Применение
Для решения проблем, связанных с конфигурацией, учтите следующие моменты:
-
Понимание порта NFS4: Порт 2049, используемый NFSv4, не противоречит концепции "безопасных" портов. Он используется для всех соединений NFS, и его отдельное применение от параметра
secure/insecure
в файле/etc/exports
. Параметрsecure
влияет только на клиентскую сторону. -
Использование RDMA: Убедитесь в корректной загрузке модуля ядра
rpcrdma
на обоих серверах: клиенте и сервере. Это включает добавление его в конфигурационный файл модулей системы и корректную настройку RDMA в файле/etc/nfs.conf
. Рекомендуется использование известного порта, например, 2049, чтобы избежать потенциальных проблем с настройками фаервола. -
Настройка
/proc/fs/nfsd/portlist
: Необходимо убедиться, что нужные порты добавлены в список, с настройкой через скрипты, автоматически запускаемые при старте системы. Это может быть достигнуто путем добавления необходимой конфигурации в файлы, такие как/etc/default/nfs-kernel-server
, что позволит системе всегда использовать нужные порты при запуске. -
Подбор порта: Чтобы выбрать порт ниже 1024 в целях безопасности, обратитесь к реестру IANA для проверки доступности порта. Это поможет избежать использования уже назначенного сервиса и предотвратит возможные конфликты.
Помните, что любые изменения можно протестировать в изолированной среде прежде, чем внедрять их на рабочие сервера. Эти рекомендации помогут не только в решении текущих проблем, но и в понимании работы NFS и RDMA в целом, улучшив конфигурацию и безопасность системы.