Протокол NFS
Протокол NFS (Network File System, сетевая файловая система) — это протокол распределённой файловой системы, разработанный компанией Sun Microsystems (ныне подразделение Oracle Corporation) в 1984 году. NFS позволяет пользователю или клиентской операционной системе монтировать удалённые файловые системы через сеть и работать с ними так, как если бы они были локальными. Протокол обеспечивает прозрачный доступ к файлам, поддерживает механизмы блокировок, аутентификации и кэширования, и является одним из стандартов де-факто для организации сетевого хранения данных в Unix-подобных системах.
История
Разработка и ранние версии
NFS был создан инженерами Sun Microsystems под руководством Билла Джоя и Расти Сэндберга. Первая реализация была представлена в 1984 году как часть операционной системы SunOS 2.0. Протокол изначально проектировался как открытый стандарт, что позволило другим производителям (IBM, HP, DEC) внедрить его поддержку в свои системы. В 1989 году спецификация NFS версии 2 (RFC 1094) была опубликована как стандарт Интернета.
NFSv3
В 1995 году вышла версия 3 (RFC 1813), которая стала значительным шагом вперёд. Ключевые улучшения включали:
- Поддержку 64-битных размеров файлов и смещений (снятие ограничения в 2 ГБ).
- Асинхронные операции записи, повышающие производительность.
- Улучшенную обработку ошибок и механизмы повторных передач.
- Дополнительные атрибуты файлов (например, время изменения).
NFSv3 получил широкое распространение и до сих пор используется во многих корпоративных и домашних средах.
NFSv4
В 2000 году была представлена версия 4 (RFC 3010, обновлён в 2003 году — RFC 3530). NFSv4 кардинально переработал архитектуру протокола:
- Интеграция с безопасностью: обязательная поддержка Kerberos, LIPKEY и SPKM-3 для аутентификации и шифрования.
- Состояние на сервере: в отличие от NFSv3, сервер теперь хранит информацию о клиентах (открытые файлы, блокировки), что упрощает реализацию и повышает надёжность.
- Единый протокол: объединение операций с файлами, блокировками и монтированием в один протокол на порту TCP 2049.
- Поддержка ACL (Access Control Lists): более гибкое управление правами доступа.
- Псевдофайловая система: возможность монтировать корень сервера NFS без необходимости отдельных точек монтирования.
В 2010 году вышла версия NFSv4.1 (RFC 5661), которая добавила поддержку параллельного доступа (pNFS) для масштабирования на кластеры, а также улучшения для работы с миграцией данных и репликацией. NFSv4.2 (RFC 7862, 2016 год) ввёл такие возможности, как разреженные файлы, клонирование, сжатие и квоты на уровне протокола.
Архитектура и принцип работы
Модель клиент-сервер
NFS работает по классической модели «клиент-сервер»:
- Сервер NFS — это компьютер или устройство хранения, которое экспортирует (делает доступными) одну или несколько локальных файловых систем. Сервер управляет доступом, аутентификацией и целостностью данных.
- Клиент NFS — это компьютер, который монтирует удалённую файловую систему. После монтирования клиент может выполнять стандартные файловые операции (чтение, запись, создание, удаление, переименование) через системные вызовы, которые прозрачно транслируются в запросы по сети.
Протоколы и порты
Традиционно NFS использует протоколы UDP и TCP. В NFSv2 и v3 по умолчанию использовался UDP, но начиная с NFSv4 предпочтительным является TCP, так как он обеспечивает надёжную доставку и контроль перегрузок. Для NFSv3 и более ранних версий используется несколько портов:
- Порт 111 — RPC-регистратор (portmapper).
- Порт 2049 — NFS-демон (nfsd).
- Порты для mountd, lockd, statd, nfsd — динамически назначаются, но могут быть фиксированы.
В NFSv4 все операции выполняются через один порт (TCP 2049), что упрощает настройку брандмауэров.
Процедура монтирования
- Клиент отправляет запрос к portmapper сервера (порт 111) для получения порта демона mountd.
- Клиент вызывает mountd, передавая путь к экспортируемой файловой системе и параметры доступа.
- Сервер проверяет права клиента (по IP-адресу, имени хоста или аутентификационным данным) и, в случае успеха, возвращает дескриптор файловой системы (filehandle).
- Клиент использует этот дескриптор для всех последующих операций с файлами.
Версии и совместимость
| Версия | Год | RFC | Ключевые особенности |
|---|---|---|---|
| NFSv2 | 1989 | RFC 1094 | 32-битные размеры файлов, UDP, простая модель |
| NFSv3 | 1995 | RFC 1813 | 64-битные файлы, асинхронная запись, улучшенная обработка ошибок |
| NFSv4 | 2000 | RFC 3010/3530 | Интеграция с безопасностью, состояние на сервере, единый порт, ACL |
| NFSv4.1 | 2010 | RFC 5661 | pNFS, миграция, репликация |
| NFSv4.2 | 2016 | RFC 7862 | Разреженные файлы, клонирование, сжатие, квоты |
Все версии NFS обратно совместимы: сервер NFSv4 может обслуживать клиентов NFSv3 (через эмуляцию), но не наоборот. На практике NFSv3 и NFSv4 являются наиболее распространёнными.
Реализации
В Unix-подобных системах
NFS является встроенной функцией большинства дистрибутивов Linux и BSD. В Linux используется реализация от проекта Linux NFS, которая поддерживает все версии, включая pNFS. Для настройки используются утилиты exportfs, mount, nfsstat, а также файлы конфигурации /etc/exports (на сервере) и /etc/fstab (на клиенте).
В Windows
Microsoft Windows поддерживает NFS начиная с Windows Server 2008 и Windows 7 (в редакциях Enterprise и Ultimate). Реализация включает клиент NFSv3 и сервер NFSv4.1. Для активации требуется установка компонента «Службы для NFS».
В macOS
macOS (начиная с OS X) включает встроенный клиент NFSv3 и NFSv4. Серверная часть доступна в macOS Server (до версии 10.15 Catalina) или через настройку вручную.
Сторонние реализации
Существуют коммерческие и открытые реализации NFS для различных платформ, например:
- NFS-Ganesha — серверная реализация NFSv3, v4, pNFS для Linux, поддерживающая различные бэкенды (Lustre, Ceph, GPFS).
- UNFS3 — легковесная реализация NFSv3 для Unix.
- Samba — хотя в первую очередь является реализацией SMB/CIFS, может работать как NFS-шлюз.
Безопасность
Аутентификация и шифрование
В NFSv2 и v3 аутентификация основана на IP-адресе клиента (слабая модель). Для повышения безопасности используется Kerberos (через RPCSEC_GSS), который обеспечивает:
- Аутентификацию пользователей и серверов.
- Целостность данных (проверка, что данные не были изменены).
- Шифрование трафика (конфиденциальность).
NFSv4 требует обязательной поддержки Kerberos (или альтернативных механизмов, таких как LIPKEY), что делает его более безопасным по сравнению с предыдущими версиями.
Экспорт и права доступа
На сервере администратор задаёт список экспортируемых файловых систем в файле /etc/exports. Для каждой записи можно указать:
- IP-адреса или подсети клиентов.
- Режим доступа (чтение/запись или только чтение).
- Опции отображения пользователей (root squash — отображение root в анонимного пользователя).
- Использование Kerberos.
Уязвимости
Исторически NFSv2 и v3 не имеют встроенного шифрования, что делает их уязвимыми для перехвата трафика и атак типа «человек посередине». Рекомендуется использовать NFSv4 с Kerberos или туннелирование через VPN/SSH. В 2021 году были обнаружены уязвимости в реализации NFS в ядре Linux (CVE-2021-20322, CVE-2021-20323), позволяющие повышение привилегий или отказ в обслуживании.
Применение
Корпоративные и научные среды
NFS широко используется в:
- Кластерных вычислениях: для общего доступа к данным на вычислительных узлах (например, в суперкомпьютерах).
- Виртуализации: для хранения образов виртуальных машин (например, в VMware ESXi, KVM).
- Домашних и офисных сетях: для централизованного хранения файлов (документы, медиа) на сервере NAS.
- Разработке ПО: для совместного доступа к исходным кодам и инструментам сборки.
Альтернативы
Основными конкурентами NFS являются:
- SMB/CIFS — протокол Microsoft, более распространён в средах Windows, но менее производительный в Unix-средах.
- AFS (Andrew File System) — распределённая файловая система с кэшированием, разработанная в Университете Карнеги-Меллон.
- CephFS — распределённая файловая система с поддержкой параллельного доступа, часто используется в облачных средах.
- GlusterFS — масштабируемая распределённая файловая система.
Интересные факты
- NFS был одним из первых протоколов, реализованных поверх протокола RPC (Remote Procedure Call), который также был разработан в Sun Microsystems.
- В 1990-х годах NFS был основным протоколом для организации бесшовного доступа к файлам в гетерогенных сетях Unix-систем.
- Несмотря на появление более современных протоколов (SMBv3, CephFS), NFS остаётся стандартом для высокопроизводительных вычислений и корпоративных хранилищ благодаря своей простоте, зрелости и широкой поддержке.
Источники
- RFC 1094 — NFS: Network File System Protocol Specification (Version 2)
- RFC 1813 — NFS Version 3 Protocol Specification
- RFC 3530 — Network File System (NFS) Version 4 Protocol
- RFC 5661 — Network File System (NFS) Version 4 Minor Version 1 Protocol
- RFC 7862 — Network File System (NFS) Version 4 Minor Version 2 Protocol
- Linux NFS Project — документация и исходные коды
- Oracle Corporation — техническая документация по NFS
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →