بلاگ/راه‌اندازی NFS Server برای اشتراک‌گذاری فایل بین چند سرور مجازی و اختصاصی
به‌روز شده

راه‌اندازی NFS Server برای اشتراک‌گذاری فایل بین چند سرور مجازی و اختصاصی

1405/07/180 بازدید
راه‌اندازی NFS Server برای اشتراک‌گذاری فایل بین چند سرور مجازی و اختصاصی

راه‌اندازی NFS Server برای اشتراک‌گذاری فایل بین چند سرور مجازی و اختصاصی

وقتی چند سرور - چه مجازی و چه اختصاصی - با هم کار می‌کنند، دیر یا زود به یک فضای فایل مشترک نیاز پیدا می‌کنید: آپلودهای کاربران که باید روی همهٔ نودهای یک اپلیکیشن (مثلاً پشت یک کلاستر Docker Swarm) در دسترس باشد، فایل‌های لاگ متمرکز، یا یک دایرکتوری backup که چند سرور باید بتوانند به آن بنویسند. راه‌اندازی NFS سرور در لینوکس دقیقاً همین مشکل را حل می‌کند و یکی از قدیمی‌ترین و پایدارترین روش‌های اشتراک‌گذاری فایل در شبکه است.

در این مقاله مراحل نصب و پیکربندی NFS Server و NFS Client را روی توزیع‌های مبتنی بر لینوکس قدم‌به‌قدم بررسی می‌کنیم و در انتها به نکات امنیتی فایل exports و تنظیم فایروال هم می‌پردازیم.

NFS چیست و چه زمانی به آن نیاز دارید؟

NFS (Network File System) یک پروتکل شبکه است که به یک یا چند سرور اجازه می‌دهد دایرکتوری‌های خودش را از طریق شبکه به سرورهای دیگر «اکسپورت» کند. سرورهای دیگر این دایرکتوری را mount می‌کنند و از نگاه برنامه‌ها و کاربران، دقیقاً مثل یک پوشهٔ محلی روی دیسک رفتار می‌کند.

نمودار اتصال چند سرور کلاینت به یک NFS Server مشترک از طریق شبکه داخلی برای اشتراک‌گذاری فایل

این پروتکل برای شرایطی مناسب است که:

  • چند سرور اپلیکیشن باید به یک مجموعه فایل مشترک (مثلاً 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 را با دو گزینهٔ رایج دیگر مقایسه کنید:

ویژگیNFSSamba (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 استفاده کنید و همین امروز یک محیط تست راه بیندازید.