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







