Раздел помощи SpaceWeb

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

16 фев, 2024

Что такое NFS? NFS (Network File System) – это протокол сетевой файловой системы, который позволяет удаленным компьютерам обмениваться файлами через сеть. 

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

Кроме того, он поддерживается множеством операционных систем, и он часто используется в распределенных сетях и серверных окружениях для обмена данными между компьютерами. Он является частью стандартного стека протоколов в UNIX-подобных операционных системах и поддерживается также в других средах.

Предварительные требования

  1. Вам понадобится два сервера. Один из них будет предоставлять доступ к части своей файловой системы другому. 
  2. На каждом из них должен быть создан не-root пользователь с правами sudo. 
  3. Также там должен быть настроен брандмауэр с использованием UFW.
  4. Желательно, чтобы на них было настроено закрытое сетевое соединение.
  5. Вам необходимо знать IP-адреса обоих серверов. 

Мы будем использовать два сервера с операционной системой Ubuntu 22.04. 

Важно! NFS на VPS/выделенном сервере SpaceWeb будет доступен только в рамках услуг SpaceWeb в одном дата-центре. Для безопасности, порты NFS заблокированы для внешнего доступа на вышестоящем оборудовании.

При заказе виртуального сервера VPS/VDS в Spaceweb вы можете сами выбирать дата-центр для размещения своего сервера. Все наши дата-центры отвечают международному стандарту Tier III, обеспечивая высокую доступность и надежность. Мы гарантируем комплексную защиту от DDoS-атак, чтобы ваши проекты работали без перебоев.  

Настройка каталогов на сервере с Ubuntu

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

Для обозначения IP-адресов будут использоваться вставки «host_ip» (IP-хоста) и «client_ip» (IP-клиента). Не забудьте заменять их на актуальные значения.

Инсталляция компонентов NFS

Для начала необходимо установить необходимые компоненты на каждом из серверов.

На сервере-хосте

Установите пакет «nfs-kernel-server» на сервере-хосте, который позволит вам предоставлять доступ к вашим каталогам. Поскольку это первая операция, которую вы выполняете в данном сеансе, лучше обновите пакеты перед установкой:

sudo apt update
sudo apt install nfs-kernel-server

Как только установка завершится, переключитесь на сервер-клиент.

На клиентском сервере

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

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

sudo apt update
sudo apt install nfs-common

Теперь, когда у обоих серверов есть необходимые пакеты, можно приступать к их настройке.

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

В следующих нескольких разделах мы расскажем, как провести настройку NFS на сервере с Ubuntu. 

Шаг 1. Создадим общие каталоги

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

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

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

Важно! Имейте в виду, что это довольно рискованное решение, так как такой пользователь может получить доступ к системе хоста с правами root. 

Способ 1. Экспортируйте ресурс общего назначения

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

Сначала создайте общий каталог. Поскольку вы создаете его с использованием sudo, каталог будет принадлежать root-пользователю хоста:

sudo mkdir /var/nfs/general -p
ls -dl /var/nfs/general

Вывод:

drwxr-xr-x 2 root root 4096 Dec 19 17:43 /var/nfs/general

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

sudo chown nobody:nogroup /var/nfs/general

В результате вы получите следующее сообщение:

drwxr-xr-x 2 nobody nogroup 4096 Dec 19 17:43 /var/nfs/general

Способ 2. Экспортируйте домашний каталог

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

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

Шаг 2. Настроим экспорт NFS на хосте

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

Откройте файл «/etc/exports» в текстовом редакторе на сервере-хосте:

sudo nano /etc/exports

Синтаксис будет следующим:

/etc/exports
directory_to_share    client(share_option1,...,share_optionN)

Необходимо создать строку для каждого каталога, который вы планируете предоставить в общий доступ. Обязательно измените «client_ip» на фактический IP-адрес вашего клиента:

/etc/exports
/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 предоставляет клиенту права на чтение-запись в заданном томе.
  • «sync» заставляет NFS записывать изменения на диск перед возвратом ответа. 
  • «no_subtree_check» отключает проверку поддерева, при которой сервер должен проверить, доступен ли файл в экспортируемом дереве для каждого запроса.
  • «no_root_squash» позволяет преобразовывать root-запросы в запросы без привилегий в определенных общих ресурсах.

Внеся необходимые изменения, сохраните и закройте файл. 

Затем перезапустите сервер NFS:

sudo systemctl restart nfs-kernel-server

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

Шаг 3. Настроим брандмауэр

Для начала проверьте текущий статус брандмауэра, чтобы убедиться, включен ли он, и, если это так, посмотрите, какие соединения в данный момент разрешены. Пропишите команду:

sudo ufw status

В выводе вы увидите сообщение об активности брандмауэра и список разрешенных соединений. 

Вероятно, в вашей системе разрешено только соединение по протоколу SSH. Чтобы добавить новое соединение – а точнее, порт 2049, используйте следующую команду:

sudo ufw allow from client_ip to any port nfs

Где замените «client_ip» на IP-адрес вашего клиента:

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

sudo ufw status

В выводе должно появиться разрешение трафика через порт 2049. 

Шаг 4. Создадим папки на клиенте как точки монтирования каталогов

Теперь, когда сервер-хост настроен, перейдем к настройке клиента.

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

Создайте два каталога для монтирования:

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

Проверьте, что процесс завершился успешно:

df -h

Вывод должен быть примерно следующим:

Два смонтированных ресурса отображаются в самом низу. Поскольку они были смонтированы из одной файловой системы, то показывают одинаковое использование диска. 

Чтобы узнать, сколько фактически используется места под каждой точкой монтирования, введите: 

du -sh /nfs/home

В выводе получите:

36K    /nfs/home

Таким образом, получается, что весь каталог home занимает всего 36 Кбайтов.

Шаг 5. Протестируем доступ

Теперь давайте проверим доступ к общим ресурсам, записав что-то в каждый из них.

Сначала создайте первый тестовый файл в разделе «/var/nfs/general»:

sudo touch /nfs/general/general.testfile

Затем проверьте его владельца:

ls -l /nfs/general/general.testfile

В выводе вы увидите примерно следующее:

-rw-r--r-- 1 nobody nogroup 0 Dec 19 18:33 /nfs/general/general.testfile

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

Далее аналогичным образом создайте второй файл в «/nfs/home»: 

sudo touch /nfs/home/home.testfile

Посмотрите, кто является владельцем файла:

ls -l /nfs/home/home.testfile

Вывод:

-rw-r--r-- 1 root root 0 Dec 19 18:34 /nfs/home/home.testfile

Итак, вы создали home.testfile от имени root, используя команду sudo точно так же, как и файл general.testfile. Однако в этом случае он принадлежит пользователю root, потому что ранее вы указали опцию «no_root_squash» для этого монтирования. 

Шаг 6. Монтируем удаленные каталоги NFS

Откройте этот файл с правами администратора в вашем текстовом редакторе:

sudo nano /etc/fstab

В конце файла добавьте строку для каждого из ваших ресурсов. Примеры записей:

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

man nfs

Клиент автоматически выполнит монтирование удаленных разделов при загрузке. Будьте готовы к тому, что это займет какое-то время.

Шаг 7. Отключим совместный доступ

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

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

Так вы удалите удаленные общие ресурсы, оставив только локальное хранилище. Проверьте, что все прошло успешно:

df -h

Вывод будет примерно следующим:

Пример в самой системе:

Если вы хотите предотвратить повторное подключение удаленных ресурсов при следующей перезагрузке, отредактируйте файл «/etc/fstab». Вам нужно удалить все внесенные изменения или закомментировать соответствующие строки с помощью символа «#». 

Заключение

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