Добавить в корзинуПозвонить
Найти в Дзене

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

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

Проблема

В разнородной среде, где одновременно работают Linux клиенты и иногда UNIX подобные системы, возникает потребность в организации сетевых папок с контролем доступа, прозрачной работой с файлами и поддержкой прав доступа (владельцы, группы, разрешения). 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. NFSv4 предпочтительнее, так как он работает через единый порт TCP 2049 (упрощает настройку брандмауэра), поддерживает аутентификацию Kerberos и псевдо-файловую систему для экспорта.

Для синхронизации пользователей используем LDAP или хотя бы согласованное управление UID и GID на всех машинах (ручное или через скрипты). В качестве дополнительного уровня безопасности настроим экспорт только для нужных подсетей, применим параметры root_squash, no_subtree_check и, при необходимости, шифрование через Kerberos.

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

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

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

Debian, Ubuntu.

text

sudo apt update
sudo apt install nfs-kernel-server

RHEL, CentOS, Rocky Linux.

text

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

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

text

sudo systemctl status nfs-server

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

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

text

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

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

text

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

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

Редактируем /etc/exports. Формат записи описан в man exports(5). Пример для NFSv4 с ограничением по подсети.

text

/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 применяют только при доверии к клиентам.

Рекомендуемый современный подход (NFSv4 с bind mounts). Создадим структуру /export и привяжем реальные каталоги.

text

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

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

text

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

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

text

/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)

Параметр fsid=0 для NFSv4 корневой псевдо-ФС (обязательно для единой точки монтирования).

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

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

text

sudo exportfs -ra

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

text

sudo exportfs -v

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

text

sudo systemctl restart nfs-server

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

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

Ubuntu (ufw).

text

sudo ufw allow from 192.168.10.0/24 to any port nfs

RHEL (firewalld).

text

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.

text

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

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

text

sudo mkdir /mnt/nfs_share

Смонтируем вручную (NFSv4). Обратите внимание, что после двоеточия указывается путь относительно корня экспорта.

text

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

Если нужно смонтировать конкретный подкаталог.

Проверим.

text

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

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

text

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.

Для NFSv4 с Kerberos необходимо установить пакеты krb5-user, nfs4-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. Описанная конфигурация легко масштабируется и подходит как для небольших офисов, так и для крупных инфраструктур.

Настройка NFS сервера в Linux | Андрей Коровин | Сисадмин | IT-инженер