راهاندازی NFS Server برای اشتراکگذاری فایل بین چند سرور مجازی و اختصاصی
وقتی چند سرور - چه مجازی و چه اختصاصی - با هم کار میکنند، دیر یا زود به یک فضای فایل مشترک نیاز پیدا میکنید: آپلودهای کاربران که باید روی همهٔ نودهای یک اپلیکیشن (مثلاً پشت یک کلاستر Docker Swarm) در دسترس باشد، فایلهای لاگ متمرکز، یا یک دایرکتوری backup که چند سرور باید بتوانند به آن بنویسند. راهاندازی NFS سرور در لینوکس دقیقاً همین مشکل را حل میکند و یکی از قدیمیترین و پایدارترین روشهای اشتراکگذاری فایل در شبکه است.
در این مقاله مراحل نصب و پیکربندی NFS Server و NFS Client را روی توزیعهای مبتنی بر لینوکس قدمبهقدم بررسی میکنیم و در انتها به نکات امنیتی فایل exports و تنظیم فایروال هم میپردازیم.
NFS چیست و چه زمانی به آن نیاز دارید؟
NFS (Network File System) یک پروتکل شبکه است که به یک یا چند سرور اجازه میدهد دایرکتوریهای خودش را از طریق شبکه به سرورهای دیگر «اکسپورت» کند. سرورهای دیگر این دایرکتوری را mount میکنند و از نگاه برنامهها و کاربران، دقیقاً مثل یک پوشهٔ محلی روی دیسک رفتار میکند.

این پروتکل برای شرایطی مناسب است که:
- چند سرور اپلیکیشن باید به یک مجموعه فایل مشترک (مثلاً media یا uploads) دسترسی داشته باشند.
- یک سرور اختصاصی با فضای ذخیرهسازی زیاد قرار است بهعنوان storage backend برای چند سرور مجازی عمل کند.
- نیاز به backup متمرکز یا اشتراکگذاری فایلهای پیکربندی بین نودهای یک کلاستر دارید.
NFS برای ترافیک داخلی بین سرورها طراحی شده، نه برای دسترسی مستقیم از اینترنت باز - این نکته در بخش امنیت دوباره تأکید میشود.
پیشنیازها
برای این آموزش به موارد زیر نیاز دارید:
- حداقل دو سرور لینوکسی (مجازی یا اختصاصی) که در یک شبکه داخلی یا VPC با هم ارتباط دارند.
- دسترسی root یا sudo روی هر دو سرور، از طریق یک اتصال SSH امنسازیشده.
- یک پورت باز بین سرورها برای ترافیک NFS (معمولاً 2049، جزئیات در بخش فایروال).
در این راهنما سرور اول را «NFS Server» (کسی که فایل را اشتراک میگذارد) و سرور دوم را «NFS Client» (کسی که آن را mount میکند) مینامیم. دستورها برای توزیعهای خانوادهٔ Debian/Ubuntu آمده؛ روی CentOS/RHEL بهجای apt باید dnf یا yum استفاده کنید.
راهاندازی NFS Server
نصب پکیجها
روی سروری که قرار است فایلها را به اشتراک بگذارد:
sudo apt update
sudo apt install -y nfs-kernel-server
ساخت دایرکتوری مشترک
sudo mkdir -p /srv/shared-data
sudo chown nobody:nogroup /srv/shared-data
sudo chmod 755 /srv/shared-data
مالکیت nobody:nogroup برای این است که با تنظیمات پیشفرض squash در بخش بعد هماهنگ باشد.
پیکربندی فایل exports
فایل /etc/exports مشخص میکند کدام دایرکتوری، به کدام سرورها، با چه سطح دسترسی اکسپورت شود:
/srv/shared-data 10.0.0.0/24(rw,sync,no_subtree_check,root_squash)
بهجای رنج 10.0.0.0/24 حتماً رنج واقعی شبکهٔ داخلی خودتان را بگذارید، نه * - این نکته در بخش امنیتی توضیح داده میشود.
اعمال تغییرات و استارت سرویس
sudo exportfs -ra
sudo systemctl enable --now nfs-kernel-server
sudo exportfs -v
خروجی exportfs -v باید دایرکتوری و گزینههایی که در /etc/exports نوشتید را نشان بدهد.
راهاندازی NFS Client
نصب پکیج کلاینت
روی هر سروری که قرار است دایرکتوری را mount کند:
sudo apt update
sudo apt install -y nfs-common
mount کردن دستی
sudo mkdir -p /mnt/shared-data
sudo mount -t nfs 10.0.0.5:/srv/shared-data /mnt/shared-data
df -h | grep shared-data
آدرس 10.0.0.5 را با آیپی داخلی سرور NFS خودتان جایگزین کنید.
mount خودکار در زمان بوت
برای اینکه mount بعد از ریبوت سرور از بین نرود، یک خط به /etc/fstab اضافه کنید:
10.0.0.5:/srv/shared-data /mnt/shared-data nfs defaults,_netdev 0 0
گزینهٔ _netdev مهم است: به سیستم میگوید قبل از تلاش برای mount، منتظر بماند تا شبکه بالا بیاید؛ بدون آن ممکن است روی سرورهایی که شبکه کمی دیرتر آماده میشود، boot گیر کند.
برای تست بدون ریبوت کردن سرور:
sudo mount -a
نکات امنیتی فایل exports
گزینههایی که در /etc/exports مینویسید مستقیماً روی امنیت و رفتار اشتراکگذاری اثر میگذارند:
| گزینه | معنی | توصیه |
|---|---|---|
rw / ro | اجازهٔ خواندن و نوشتن یا فقط خواندن | فقط به کلاینتهایی که واقعاً نیاز به نوشتن دارند rw بدهید |
sync / async | نوشتن همزمان با دیسک یا بافر شده | sync کندتر ولی امنتر در برابر از دست رفتن داده هنگام کرش |
root_squash | کاربر root کلاینت را به nobody تبدیل میکند | همیشه فعال بماند، مگر دلیل مشخصی برای غیرفعال کردنش دارید |
no_root_squash | به root کلاینت اجازهٔ دسترسی root روی سرور را میدهد | از این گزینه پرهیز کنید؛ یک کلاینت compromise شده میتواند روی سرور هم root شود |
subtree_check / no_subtree_check | بررسی اضافی هنگام اکسپورت زیرپوشه | برای اکسپورت کل دیسک یا پارتیشن، no_subtree_check سادهتر و قابلاعتمادتر است |
دو نکتهٔ امنیتی مهم دیگر:
- هیچوقت در
/etc/exportsرنج را*نگذارید - یعنی هر آیپی روی اینترنت بتواند mount را امتحان کند. همیشه رنج شبکهٔ داخلی یا VPC مشخص را بنویسید. - NFS نسخههای ۳ و پایینتر رمزنگاری ندارد؛ اگر سرورها روی یک شبکهٔ داخلی قابل اعتماد (مثل یک VPC) نیستند، یا NFSv4 با Kerberos استفاده کنید یا ترافیک را از طریق VPN/تونل SSH عبور بدهید.
تنظیم فایروال برای NFS
NFS برای مونت اولیه روی پورت 2049 کار میکند، اما سرویسهای کمکی آن (rpcbind, mountd, statd) معمولاً پورتهای رندوم میگیرند، مگر اینکه ثابتشان کنید. روی Ubuntu با ufw:
sudo ufw allow from 10.0.0.0/24 to any port 2049 proto tcp
sudo ufw allow from 10.0.0.0/24 to any port 111 proto tcp
باز هم بهجای 10.0.0.0/24 رنج واقعی شبکهٔ داخلی خودتان را بگذارید - هیچوقت این پورتها را روی کل اینترنت (0.0.0.0/0) باز نکنید. اگر از firewalld استفاده میکنید:
sudo firewall-cmd --permanent --zone=internal --add-service=nfs
sudo firewall-cmd --permanent --zone=internal --add-service=rpc-bind
sudo firewall-cmd --reload
اگر چند سرور مجازی و یک سرور اختصاصی را در یک شبکهٔ داخلی مشترک قرار میدهید، همین از اول بار امنیت و سادگی پیکربندی NFS را بهتر میکند - جایی که انتخاب درست پلن سرور هم اهمیت دارد؛ برای سرورهای اپلیکیشن که دایرکتوری اشتراکی را mount میکنند میتوانید از سرورهای مجازی آریانت استفاده کنید، و برای نود NFS سرور که نیاز به دیسک و IO بیشتری دارد، سرورهای اختصاصی آریانت گزینهٔ مناسبتری است.
مقایسهٔ NFS با روشهای دیگر اشتراک فایل
قبل از قطعی کردن تصمیم، خوب است NFS را با دو گزینهٔ رایج دیگر مقایسه کنید:
| ویژگی | NFS | Samba (SMB/CIFS) | SSHFS |
|---|---|---|---|
| مناسب برای | سرور به سرور، لینوکس به لینوکس | شبکهٔ مختلط لینوکس/ویندوز | mount موقت یا دسترسی سریع بدون سرویس جدا |
| سرعت | بالا، سربار کم روی شبکهٔ داخلی | متوسط، سربار پروتکل بیشتر | پایینتر، به دلیل رمزنگاری SSH |
| پیچیدگی راهاندازی | کم | متوسط | بسیار کم |
| رمزنگاری پیشفرض | ندارد (NFSv3) | دارد (SMB3) | دارد (روی SSH) |
اگر همهٔ سرورها لینوکس هستند و روی یک شبکهٔ داخلی قرار دارند، NFS معمولاً انتخاب سادهتر و سریعتر است. Samba را وقتی در نظر بگیرید که سرورهای ویندوزی هم در میان باشند، و SSHFS بیشتر برای mount موقت یا تست مناسب است، نه برای یک workload دائمی و پرترافیک.
رفع چند مشکل رایج
اگر mount با خطا مواجه شد:
mount.nfs: access denied by server while mounting ...
معمولاً یعنی آیپی کلاینت در رنج تعریفشده در /etc/exports نیست یا بعد از تغییر فایل exports فراموش کردهاید exportfs -ra را اجرا کنید.
اگر mount بسیار کند است یا timeout میدهد، ابتدا بررسی کنید پورتهای لازم (2049 و 111) واقعاً در فایروال باز باشند - اکثر مشکلات کارایی NFS در عمل، مشکل شبکه یا فایروال است، نه خود پروتکل.
جمعبندی
راهاندازی NFS سرور در لینوکس برای اشتراکگذاری فایل بین چند سرور مجازی و اختصاصی کار پیچیدهای نیست: نصب پکیجها، تعریف دقیق دایرکتوری در /etc/exports، mount کردن از سمت کلاینت، و محدود کردن دسترسی به رنج شبکهٔ داخلی در فایروال. نکتهٔ اصلی که نباید فراموش شود، همان بخش امنیتی است - رنج exports را هیچوقت باز نگذارید و root_squash را فعال نگه دارید.
اگر هنوز زیرساخت چند سروریتان را راهاندازی نکردهاید، میتوانید از سرورهای مجازی آریانت برای نودهای اپلیکیشن و سرورهای اختصاصی آریانت برای نود ذخیرهسازی NFS استفاده کنید و همین امروز یک محیط تست راه بیندازید.




