Монтирование NFS на сервере Ubuntu 18.04 LTS

03.03.2020

Теги: CLILinuxUbuntuКонфигурацияЛокальнаяСетьНастройкаСерверУстановкаФайл

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

Нам потребуются две виртуальные машины:

  • nfs-client, ip-адрес 192.168.30.20 — которая будет клиентом
  • nfs-server, ip-адрес 192.168.30.21 — которая будет сервером

Установка компонентов

На виртуальную машину nfs-server устанавливаем пакет nfs-kernel-server:

$ sudo apt install nfs-kernel-server

На виртуальную машину nfs-client устанавливаем пакет nfs-common:

$ sudo apt install nfs-common

Создание каталога на сервере

На виртуальной машине nfs-server создаем каталог:

$ sudo mkdir -p /srv/nfs/common

Поскольку каталог создан с помощью команды sudo, он принадлежит пользователю root. Но NFS переведёт все операции root клиента в nobody:nogroup в целях безопасности. Во избежание конфликта нужно изменить права на каталог:

$ sudo chown nobody:nogroup /srv/nfs/common

Предоставим всем право записи в этот каталог:

$ sudo chmod a+w /srv/nfs/common
Суперпользователи могут выполнять в системе любые задачи. Однако каталоги, смонтированные через NFS, технически не являются частью системы, так что по умолчанию сервер NFS не будет выполнять операции, требующие привилегий суперпользователя. Это ограничение по умолчанию означает, что суперпользователь клиента не может записывать файлы в корневом каталоге, изменять привилегии и выполнять любые другие задачи суперпользователя в NFS.

Экспорт каталога на сервере

Каталог готов, теперь можно его экспортировать

$ sudo nano /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/srv/nfs/common  192.168.30.20(rw,sync,no_subtree_check)
/home            192.168.30.20(rw,sync,no_root_squash,no_subtree_check)
$ sudo systemctl restart nfs-kernel-server

Параметры обоих каталогов почти одинаковы, за исключением no_root_squash, который присутствует только в настройках домашнего каталога. Домашний каталог добавлен с целью посмотреть, как доверенные пользователи nfs-client могут получить права суперпользователя.

  • Параметр rw устанавливает права клиента на чтение и изменение каталога.
  • Параметр sync синхронизирует каталоги по NFS, что обеспечивает согласовние содержимого, но замедляет скорость выполнения операций.
  • Параметр no_subtree_check предотвращает проверку поддерева, это рекомендуется сделать в большинстве случаев.
  • Параметр no_root_squash — по умолчанию NFS транслирует запросы от пользователя root клиента пользователю noboby сервера, благодаря чему пользователь root клиента не может использовать файловую систему хоста с теми же привилегиями. Данная директива блокирует эту функцию безопасности.

Правила для файервола на сервере

Теперь проверим состояние файервола:

$ sudo ufw status
Status: active

Разрешим соединения с хоста 192.168.30.20 на порту 2049:

$ sudo ufw allow in from 192.168.30.20 to any port nfs
$ sudo ufw status
Status: active

To                         Action      From
----------------------------------------------------
2049                       ALLOW       192.168.30.20

Создание точек монтирования на клиенте

Итак, сервер настроен и подготовлен к совместному использованию каталогов с клиентом. Теперь нужно создать несколько точек монтирования и смонтировать удалённые каталоги.

Создаем каталоги, куда будем монтировать:

$ sudo mkdir /mnt/nfs
$ sudo mkdir /mnt/nfs/common
$ sudo mkdir /mnt/nfs/home

Монтирование удаленных каталогов на клиенте

Монтируем удаленные каталоги:

$ sudo mount 192.168.30.21:/srv/nfs/common /mnt/nfs/common
$ sudo mount 192.168.30.21:/home /mnt/nfs/home

Доступ к каталогу common

Давайте на клиенте от имени root создадим файл test.txt в директории /mnt/nfs/common:

$ sudo nano /mnt/nfs/common/test.txt
some content

И посмотрим права на этот файл:

$ ls -la /mnt/nfs/common
total 12
drwxrwxrwx 2 nobody nogroup 4096 мар  4 13:55 .
drwxr-xr-x 4 root   root    4096 мар  4 12:37 ..
-rw-r--r-- 1 nobody nogroup   13 мар  4 13:54 test.txt

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

Доступ к каталогу home

Теперь на клиенте от имени root создадим файл test.txt в директории /mnt/nfs/home:

$ sudo nano /mnt/nfs/home/test.txt
some content

И посмотрим права на этот файл:

$ ls -la /mnt/nfs/home
total 16
drwxr-xr-x 3 root    root    4096 мар  4 14:01 .
drwxr-xr-x 4 root    root    4096 мар  4 12:37 ..
drwxr-xr-x 9 evgeniy evgeniy 4096 мар  2 10:59 evgeniy
-rw-r--r-- 1 root    root      13 мар  4 14:01 test.txt

При монтировании этого каталога поведение NFS по умолчанию было изменено с помощью параметра no_root_squash. Благодаря этому суперпользователь клиента сохраняет свои привилегии.

Размонтирование удаленных каталогов на клиенте

Для этого достаточно выполнить команды:

$ cd ~
$ sudo umount /mnt/nfs/common
$ sudo umount /mnt/nfs/home

Монтирование NFS при загрузке клиента

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

$ sudo nano /etc/fstab
192.168.30.21:/srv/nfs/common /mnt/nfs/common nfs auto,nofail,noatime,intr,tcp,actimeo=3600 0 0
192.168.30.21:/home /mnt/nfs/home nfs auto,nofail,noatime,intr,tcp,actimeo=3600 0 0

Опции монтирования:

  • auto — файловая система будет смонтирована автоматически при загрузке
  • nofail — предотвращает появление ошибок, если NFS-сервер недоступен
  • noatime — не обновлять информацию о времени доступа к файловой системе
  • intr — прерывать файловые операции, если NFS-сервер долго не отвечает
  • tcp — для монтирования использовать протокол TCP, а не стандартный UDP
  • actimeo — время кэширования атрибутов файлов и каталогов в секундах

Доступ к NFS-серверу за NAT

Наш NFS-сервер расположен во внутренней сети 192.168.30.0/24 и имеет ip-адрес 192.168.30.21. Выход в интернет для компьютеров сети 192.168.30.0/24 обеспечивает маршрутизатор с двумя сетевыми интерфейсами. Интерфейс enp0s3 смотрит во внешнюю сеть и имеет ip-адрес 192.168.110.8. Интерфейс enp0s8 смотрит во внутреннюю сеть и имеет ip-адрес 192.168.30.3. Выглядит это примерно так (все компьютеры, кроме одного, виртуальные)

Чтобы обеспечить доступ к NFS-серверу из сети 192.168.110.0/24, выполняем на маршрутизаторе команды:

$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 2049 -j DNAT --to-destination 192.168.30.21
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 2049 -j DNAT --to-destination 192.168.30.21
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 111 -j DNAT --to-destination 192.168.30.21
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 111 -j DNAT --to-destination 192.168.30.21

И сохраняем эти правила, чтобы они применились после перезагрузки (должен быть установлен пакет iptables-persistent):

$ sudo iptables-save > /etc/iptables/rules.v4

На виртуальной машине nfs-server редактируем файл /etc/exports:

$ sudo nano /etc/exports
/srv/nfs/common  192.168.30.0/24(rw,sync,no_subtree_check) 192.168.110.12(rw,sync,no_subtree_check)
/home            192.168.30.0/24(rw,sync,no_subtree_check) 192.168.110.12(rw,sync,no_subtree_check)
$ sudo systemctl restart nfs-kernel-server

А на виртуальной машине nfs-server изменяем настройки файервола:

$ sudo ufw delete allow in from 192.168.30.20 to any port nfs
$ sudo ufw allow in from 192.168.30.0/24 to any port nfs
$ sudo ufw allow in from 192.168.110.12 to any port nfs
$ sudo ufw status
Status: active

To                         Action      From
------------------------------------------------------
2049                       ALLOW       192.168.30.0/24
2049                       ALLOW       192.168.110.12

Теперь монтировать удаленные каталоги может хост 192.168.110.12 и все хосты из сети 192.168.30.0/24.

Поиск: CLI • Linux • Ubuntu • Конфигурация • Локальная сеть • Настройка • Сервер • Установка • Файл • NFS • ufw • Файервол • NAT • iptables

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.