Настройка NFS в Ubuntu 22.04
Install
На хосте (сервер)
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.
Пример 1: Экспорт ресурса общего назначения
В этом примере будет создан ресурс 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
Теперь каталог готов к экспорту.
Пример 2: Экспорт домашней директории
Во втором примере, цель состоит в том, чтобы сделать домашние каталоги пользователей, хранящиеся на сервере, доступными на клиентских хостах, при этом предоставляя доверенным администраторам этих клиентских серверов доступ, необходимый для удобного управления пользователями.
Для этого экспортируем каталог /home
. Поскольку он уже существует, его создавать не нужно. Также не будем менять разрешения, так как это могло бы привести к ряду проблем для всех, у кого есть домашний каталог на хост-машине.
Настройка экспорта NFS на хост-сервере
Редактируем файл /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
Тестирование доступа NFS
Пример 1: ресурс общего назначения
Запишем тестовый файл в общий ресурс /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 ресурсе.
Пример 2: Общий домашний каталог
Чтобы сравнить разрешения для директорий общего назначения и домашней директории, создадим файл в каталоге /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 при загрузке
Общие ресурсы 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
Демонтирование ресурса NFS
Если, больше нет надобности использовать удаленный каталог в системе, его можно демонтировать:
cd ~ sudo umount /nfs/home sudo umount /nfs/general
Также, для предотвращения их повторному монтированию при следующей перезагрузке, изменим в /etc/fstab
строку (закомментируем или удалим). Также можете отключить автоматическое монтирование, удалив опцию auto
. При этом у вас сохранится возможность монтирования вручную.
Настройка клиента Windows
NFS клиент без проблем можно запустить на всех серверных Windows. Из стандартных он присутствует на:
- Windows 7 Pro/Enterprise
- Windows 8/8.1 Pro/Enterprise
- Windows 10 Pro/Enterprise
Чтобы подключить NFS, делаем следующее:
- Открываем меню Программы и компоненты.
- Жмём Добавление компонентов.
- Находим там 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