Проблема
В разнородной среде, где одновременно работают 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. Описанная конфигурация легко масштабируется и подходит как для небольших офисов, так и для крупных инфраструктур.