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

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

Проблема

В разнородной среде, где одновременно работают Linux-клиенты, а иногда и UNIX подобные системы, возникает потребность в организации сетевых папок с контролем доступа, прозрачной работой с файлами и поддержкой прав доступа (владельцы, группы, permissions). Samba хороший выбор для взаимодействия с Windows, но для сетей, где доминируют Linux/Unix, она избыточна и не всегда оптимальна по производительности. NFS (Network File System) классический протокол, описанный в RFC 7530 (NFSv4), который позволяет экспортировать каталоги с сервера и монтировать их на клиентах так, как если бы они были локальными. Однако неправильная настройка NFS может привести к проблемам с безопасностью, конфликтам идентификаторов пользователей и снижению производительности. Нужно настроить NFS-сервер грамотно с ограничением доступа, синхронизацией UID/GID и обеспечением отказоустойчивости.

Решение

Для построения NFS-сервера в Linux будем использовать:

  • nfs-kernel-server (в Debian/Ubuntu) или nfs-utils (в RHEL/CentOS/Fedora) — реализация NFS версии 3 и 4. Подробности установки описаны в официальной документации Ubuntu и Red Hat.
  • NFSv4 предпочтительнее, так как он работает через единый порт TCP 2049 (упрощает firewall), поддерживает аутентификацию Kerberos и псевдо-файловую систему для экспорта.
  • Для синхронизации пользователей используем LDAP или хотя бы согласованное управление UID/GID на всех машинах (ручное или через скрипты).
  • В качестве дополнительного уровня безопасности настроим экспорт только для нужных подсетей, применим параметры root_squashno_subtree_check и, при необходимости, шифрование через Kerberos (опционально). Рекомендации по безопасности можно найти в Debian Wiki (NFS).

Пошаговая инструкция

Все действия выполняются на сервере с Ubuntu 22.04 LTS (пример). Для других дистрибутивов команды установки пакетов и пути к конфигурациям могут отличаться.

1. Установка NFS-сервера

Debian / Ubuntu:

sudo apt update
sudo apt install nfs-kernel-server

RHEL / CentOS / Rocky Linux:

sudo dnf install nfs-utils
sudo systemctl enable --now nfs-server

После установки проверяем статус:

sudo systemctl status nfs-server

2. Создание экспортируемой директории

Допустим, мы хотим расшарить /srv/nfs/share для клиентов подсети 192.168.10.0/24.

sudo mkdir -p /srv/nfs/share
sudo chown nobody:nogroup /srv/nfs/share   # для анонимного доступа, если squash активен
sudo chmod 755 /srv/nfs/share

Создадим тестовый файл:

echo "Test file from NFS server" | sudo tee /srv/nfs/share/test.txt

3. Настройка экспорта (NFSv4)

Редактируем /etc/exports. Формат записи описан в man exports(5):

<директория> <клиент>(<опции>) [<клиент>(<опции>)...]

Пример для NFSv4 с ограничением по подсети:

/srv/nfs/share 192.168.10.0/24(rw,sync,no_subtree_check,no_root_squash)

Опции:

  • rw — чтение и запись.
  • sync — синхронная запись (рекомендуется для надёжности).
  • no_subtree_check — улучшает производительность, отключает проверки поддеревьев (безопасно для простых экспортов).
  • no_root_squash — разрешает пользователю root на клиенте иметь права root на сервере. По соображениям безопасности обычно используют root_squash (преобразует root в nobody). no_root_squash применяют только при доверии к клиентам.
  • fsid=0 — для NFSv4 корневой псевдо-ФС (обязательно для единой точки монтирования). В NFSv4 принято экспортировать корневой каталог с fsid=0, а внутри него делать bind-монты других каталогов.

Рекомендуемый современный подход (NFSv4 с bind-mounts):

Создадим структуру /export и привяжем реальные каталоги:

sudo mkdir -p /export/share
sudo mount --bind /srv/nfs/share /export/share

Добавим в /etc/fstab для постоянства:

/srv/nfs/share /export/share none bind 0 0

Теперь в /etc/exports пишем:

/export 192.168.10.0/24(rw,sync,no_subtree_check,fsid=0,no_root_squash)
/export/share 192.168.10.0/24(rw,sync,no_subtree_check)

4. Применение конфигурации

После редактирования /etc/exports выполняем:

sudo exportfs -ra

Проверяем, что экспорты видны:

sudo exportfs -v

Если используется NFSv4, перезапускаем сервис:

sudo systemctl restart nfs-server

5. Настройка брандмауэра

Для NFSv4 достаточно открыть TCP-порт 2049.

ufw (Ubuntu):

sudo ufw allow from 192.168.10.0/24 to any port nfs

firewalld (RHEL):

sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload

6. Настройка клиента

На клиенте (Linux) установим пакет nfs-common:

sudo apt install nfs-common    # Debian/Ubuntu
sudo dnf install nfs-utils     # RHEL

Создадим точку монтирования:

sudo mkdir /mnt/nfs_share

Смонтируем вручную (NFSv4):

sudo mount -t nfs4 192.168.10.10:/ /mnt/nfs_share

Обратите внимание: после двоеточия указываем корень экспорта (в нашем случае /export), но мы привязали /export/share; чтобы получить доступ к /export/share, используем путь :/share или монтируем непосредственно экспорт /export/share как NFSv3.

Лучше использовать NFSv4 и монтировать корневой экспорт, а внутри уже переходить в нужные каталоги. Если нужно смонтировать конкретный подкаталог:

sudo mount -t nfs4 192.168.10.10:/share /mnt/nfs_share

Проверим:

df -h | grep nfs
ls -l /mnt/nfs_share

Для автоматического монтирования добавляем запись в /etc/fstab:

192.168.10.10:/share /mnt/nfs_share nfs4 defaults,_netdev 0 0

Параметр _netdev гарантирует, что монтирование будет выполнено после поднятия сети.

7. Синхронизация пользователей (UID/GID)

Чтобы файлы на клиенте отображались с правильными владельцами, необходимо, чтобы UID/GID пользователей совпадали на сервере и клиентах. Проще всего использовать централизованную систему (LDAP, FreeIPA) или вручную синхронизировать /etc/passwd и /etc/group. Альтернатива — включить аутентификацию Kerberos (sec=krb5) и использовать idmapd для NFSv4. Подробная инструкция по настройке Kerberos для NFS есть в руководстве Ubuntu.

Для NFSv4 с Kerberos необходимо установить пакеты krb5-usernfs4-acl-tools и настроить /etc/idmapd.conf.

Устранение распространённых проблем

ПроблемаВероятная причинаРешение
mount.nfs: access deniedНеверные опции в /etc/exports или не применены (exportfs -ra).Проверить синтаксис exports, убедиться, что клиентская подсеть разрешена. Перезапустить nfs-server.
Permission denied при записиОпция ro или root_squash мешает.Изменить на rw и при необходимости no_root_squash. Проверить права на директорию на сервере.
Очень медленная работаsync опция, плохая сетевая карта, большие задержки.Использовать async для производительности (но с риском потери данных при сбое). Увеличить параметры rsize/wsize.
Stale file handleЭкспортируемая директория была удалена или пересоздана на сервере.На клиенте выполнить umount -l и смонтировать заново. На сервере проверить экспорты.
Не работает NFSv4, работает NFSv3Порт 2049 заблокирован или fsid=0 не задан.Открыть порт, добавить fsid=0 в экспорт корня.

Мы настроили NFS сервер в Linux с использованием современных подходов NFSv4 и bind-mounts, обеспечили контролируемый доступ для клиентов из локальной сети. Такой сервер позволяет организовать общие сетевые папки с производительностью, близкой к локальной, и прозрачной работой с правами доступа. Для повышения безопасности рекомендуется использовать Kerberos, а для масштабирования связку с LDAP. Описанная конфигурация легко масштабируется и подходит как для небольших офисов, так и для крупных инфраструктур.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu