настройка_nfs_в_ubuntu_22.04

Настройка NFS в Ubuntu 22.04

sudo apt update
sudo apt install nfs-kernel-server -y

Теперь проверим, правильно ли установился сервер. Сервис NFS слушает соединения как для TCP, так и для UDP на порту 2049. Посмотреть действительно ли сейчас используются эти порты можно командой:

rpcinfo -p | grep nfs
 
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs

Также стоит проверить, поддерживается ли NFS на уровне ядра:

cat /proc/filesystems | grep nfs
 
nodev   nfsd

Видим, что работает, но если нет, нужно вручную загрузить модуль ядра nfs:

modprobe nfs

На клиенте необходимо установить пакет nfs-common, обеспечивающий функции NFS без добавления каких-либо серверных компонентов.

sudo apt update
sudo apt install nfs-common -y

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

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

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

Для начала создаем общею директорию:

sudo mkdir /var/nfs/general -p

Поскольку директория создается ес правами sudo, владельцем пользователь root:

ls -l /var/nfs/
 
drwxr-xr-x 2 root root 4096 May  4 07:44 general

В качестве меры безопасности, NFS будет переводить любые операции с пользователем root на клиенте, на учетные данные nobody:nogroup. Поэтому нужно изменить владельца каталога, чтобы он соответствовал этим учетным данным:

sudo chown nobody:nogroup /var/nfs/general

Теперь каталог готов к экспорту.

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

Для этого экспортируем каталог /home. Поскольку он уже существует, его создавать не нужно. Также не будем менять разрешения, так как это могло бы привести к ряду проблем для всех, у кого есть домашний каталог на хост-машине.

Редактируем файл /etc/exports. Нужно создать строку для каждой директории, к которым планируем предоставить общий доступ. Обязательно заменяем сокращение client_ip своим реальным IP-адресом:

/var/nfs/general    client_ip(rw,sync,no_subtree_check)
/home               client_ip(rw,sync,no_root_squash,no_subtree_check)

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

  • rw – эта опция дает клиенту доступ к чтению и записи на соответствующем томе.
  • ro – разрешает только чтение директории.
  • sync – параметр обеспечивает надёжность передачи. Если включен он, то нельзя будет одновременно передавать несколько файлов или на разные компьютеры. Эта настройка не даст отвечать на другие запросы. Предотвращает утерю данных, но передача может идти медленнее.
  • async – обратный предыдущему параметру. Передача идёт быстрее, но возникает риск потери информации.
  • no_subtree_check – функция отключает контроль поддерева. Дело в том, что без неё NFS дополнительно проверяет, что пользователи обращаются только в нужные разделы каталога. Это замедляет работу. Проверку вложенного дерева в большинстве случаев лучше отключить.
  • no_root_squash – По умолчанию NFS преобразует запросы удаленного пользователя root в запросы непривилегированного пользователя на сервере. Это сделано для безопасности, чтобы пользователь root на клиентской системе не мог использовать файловую систему хоста с привилегиями root. Опция no_root_squash отключает это поведение для определенных общих ресурсов.
  • secure – опция разрешает использовать только порты, номер которых ниже 1024. Включена по умолчанию.
  • insecure – разрешает использование любых портов.
  • nohide – если монтируются несколько директорий, среди которых есть вложенные, то вложенные в отличие от родительской будут отображаться как пустые. Данный параметр поможет это исправить.
  • anonuid – указывает uid для анонимов. Это специальный идентификатор пользователя.
  • anongid – указывает gid для анонимов. GID (Group ID) – ещё один идентификатор пользователя.

Чтобы сделать общие ресурсы доступными для клиентов, перезапустим NFS сервер:

sudo systemctl restart nfs-kernel-server

В последующем, можно обновлять таблицу экспорта NFS вот таким образом:

sudo exportfs -a

Однако, прежде чем использовать новые общие ресурсы, нужно убедиться, что трафик к ним разрешен правилами брандмауэра.

Находим порт, который использует NFS

rpcinfo -p
   program vers proto   port  service
    ...
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    ...

Речь пойдет об ufw. Многие приложения можно активировать по имени через список sudo ufw app list, но nfs не входит в их число.

Однако, поскольку ufw также проверяет /etc/services на наличие порта и протокола службы, все-таки можно добавить NFS по имени. Согласно Best Practices, рекомендуется включать наиболее ограничительное правило, которое разрешит только необходимый трафик.

Открываем 2049 порт на сервере, с указанием client_ip

sudo ufw allow from client_ip to any port nfs
 
# не забываем проверять
sudo ufw status

Также, следует открыть порт 111

С клиента должно проходить:

nc -v -u host_ip 111
Connection to host_ip 111 port [udp/sunrpc] succeeded!
 
nc -v -u host_ip 2049
Connection to host_ip 2049 port [udp/sunrpc] succeeded!
 
nc -v host_ip 2049
Connection to host_ip 2049 port [tcp/nfs] succeeded!
 
nc -v host_ip 111
Connection to host_ip 111 port [tcp/sunrpc] succeeded!

На клиенте можем посмотреть список доступных NFS ресурсов

sudo showmount -e host_ip

Чтобы сделать удаленные общие ресурсы доступными на клиенте, нужно смонтировать каталоги хоста, к которым хотим предоставить доступ, в пустые каталоги клиента. Создадим два каталога для монтируемых ресурсов:

sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home

Теперь когда есть место для размещения удаленных общих ресурсов, и открыт брандмауэр, настало самое время монтировать общие ресурсы, используя IP-адрес сервера хоста:

sudo mount host_ip:/var/nfs/general /nfs/general
sudo mount host_ip:/home /nfs/home

Эти команды монтируют общие ресурсы с хоста на клиентскую систему. Существует несколько способов проверки успешного монтирования ресурсов. Можете использовать для проверки команды mount или findmnt, но для получения понятных результатов лучше использовать df -h

Оба смонтированных ресурса будут показаны снизу. Поскольку они были смонтированы с одной файловой системы, они показывают одинаковое использование диска. Чтобы увидеть, сколько места используется в каждой точке монтирования, используйте команду du и укажите путь к точке монтирования. Флаг -s предоставляет сводную информацию об использовании, а не просто отображает данные об использовании каждого файла. Опция -h активирует вывод в удобной для чтения человеком форме.

du -sh /nfs/home

Запишем тестовый файл в общий ресурс /var/nfs/general

sudo touch /nfs/general/general.test

Проверим его права и владельца:

ls -l /nfs/general/general.test
 
-rw-r--r-- 1 nobody nogroup 0 May  4 10:09 /nfs/general/general.test

Поскольку, этот том был смонтирован без изменения поведения NFS по умолчанию, а также создан файл от имени пользователя root клиентской машины с помощью команды sudo, право собственности на файл по умолчанию принадлежит nobody:nogroup. Суперпользователи клиента не смогут выполнить типичные административные действия, такие как изменение владельца файла или создание нового каталога для группы пользователей, на этом NFS ресурсе.

Чтобы сравнить разрешения для директорий общего назначения и домашней директории, создадим файл в каталоге /nfs/home аналогичным образом:

sudo touch /nfs/home/home.test

Проверяем:

ls -l /nfs/home/home.test
 
-rw-r--r-- 1 root root 0 May  4 10:15 /nfs/home/home.test

Точно так же, как создавали файл general.test, был создан файл home.test от имени root с помощью команды sudo. Однако в данном случае он принадлежит root, потому что было отменено поведение по умолчанию, когда указали опцию no_root_squash для этого монтирования. Это позволяет привилегированным пользователям на клиентской машине действовать как root. В то же время это означает, что нет необходимости предоставлять этим пользователям доступ root на хосте.

Общие ресурсы NFS можно автоматически монтировать при загрузке, для чего их нужно добавить в файл /etc/fstab на клиентской системе.

Добавим в конец файла строки для каждого из общих ресурсов. Это выглядит примерно так:

. . .
host_ip:/var/nfs/general    /nfs/general   nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home               /nfs/home      nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Если, больше нет надобности использовать удаленный каталог в системе, его можно демонтировать:

cd ~
sudo umount /nfs/home
sudo umount /nfs/general

Также, для предотвращения их повторному монтированию при следующей перезагрузке, изменим в /etc/fstab строку (закомментируем или удалим). Также можете отключить автоматическое монтирование, удалив опцию auto. При этом у вас сохранится возможность монтирования вручную.

NFS клиент без проблем можно запустить на всех серверных Windows. Из стандартных он присутствует на:

  • Windows 7 Pro/Enterprise
  • Windows 8/8.1 Pro/Enterprise
  • Windows 10 Pro/Enterprise

Чтобы подключить NFS, делаем следующее:

  1. Открываем меню Программы и компоненты.
  2. Жмём Добавление компонентов.
  3. Находим там NFS и ставим только Клиент для NFS, другой компонент не нужен.

Смотрим доступные ресурсы:

showmount.exe -e host_ip

Монтируем ресурс:

mount -o anon \\host_ip\nfs\storage J:
J: успешно подключен к \\host_ip\nfs\storage
 
Команда успешно выполнена.

где:

  • -o anon – подключаться с правами анонимного пользователя;
  • host_ip – имя NFS-сервера;
  • \nfs\storage – локальный путь к каталогу на NFS-сервере;
  • J – буква диска Windows

Посмотреть примонтированный ресурс можно таким образом:

mount
 
Локальный    Удаленный                                 Свойства
-------------------------------------------------------------------------------
J:       \\host_ip\nfs\storage                  UID=1000, GID=1000
                                                rsize=262144, wsize=262144
                                                mount=soft, timeout=0.8
                                                retry=1, locking=yes
                                                fileaccess=755, lang=ANSI
                                                casesensitive=yes
                                                сек.=sys

Также, нужно, чтобы были сопоставлены UID и GID, как на сервере, так и на клиенте. Для этого на клиенте, идем в реестр в ветку

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default

И создаем две записи DWORD (32-bit):

  • AnonymousGid
  • AnonymousUid

оба должны иметь десятичное значение (в данном случае это 1000), соответствующее GID и UID пользователя на сервере. Если значения не известны выполним на сервере:

id -u
id -g

После того как прописали ключи в реестре, перезапустим клиент nfs

nfsadmin client %computername% stop
nfsadmin client %computername% start
  • настройка_nfs_в_ubuntu_22.04.txt
  • Последнее изменение: 2022/05/05 09:04
  • admin