NFS یا Network File System یک پروتکل سیستم فایل توزیع شده است که به شما امکان می‌دهد، دایرکتوری‌ها را برروی یک شبکه به اشتراک بگذارید. با NFS، شما می‌توانید دایرکتوری‌های ریموت را بر روی سیستم خود mount کرده و با فایل‌های موجود برروی دستگاه ریموت کار کنید؛ به گونه‌ای که گویی فایل‌های محلی هستند.

به طور پیش فرض، پروتکل NFS رمزگذاری نشده و احراز هویت کاربر را ارائه نمی‌دهد. بنابراین، دسترسی به سرور به آدرس IP یا نام میزبان کلاینت محدود می‌شود.

این مقاله، نحوه راه‌اندازی سرور NFSv4 را در اوبونتو 20.04 توضیح می‌دهد. علاوه براین، نحوه نصب سیستم فایل NFS را بر روی دستگاه کلاینت شرح می‌دهد.

 

 

این مطلب نیز ممکن است برای شما مفید باشد: افزودن آدرس IP در فایروال ویندوز

 

در اینجا، از دو ماشین استفاده می‌کنیم: یک ماشین با سیستم عامل اوبونتو 20.04 که به عنوان یک سرور NFS عمل می‌کند و دیگری با هر توزیع لینوکس دیگر که در آن، فایل به اشتراک گذاشته شده را mount می‌کنیم. سرور و کلاینت باید بتوانند از طریق یک شبکه خصوصی با یکدیگر ارتباط برقرار کنند. شما می‌توانید از آدرس‌های IP عمومی استفاده کرده و فایروال سرور را به گونه‌ای پیکربندی نمایید که ترافیک را برروی پورت 2049 تنها از منابع معتبر اجازه عبور دهد.

ماشین‌های موجود در این مقاله دارای IP‌های زیر هستند:

NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range

 

راه‌اندازی سرور NFS

اولین قدم، راه‌اندازی سرور NFS است. در اینجا، بسته‌های لازم را نصب کرده، دایرکتوری‌های NFS را ایجاد و استخراج می‌نماییم و سپس فایروال را پیکربندی می‌کنیم.

 

نصب سرور NFS

بسته سرور NFS، پشتیبانی فضای کاربر (user-space) مورد نیاز برای اجرای سرور هسته NFS را فراهم می‌کند. به منظور نصب این بسته، دستور زیر را اجرا نمایید:

sudo apt update
sudo apt install nfs-kernel-server

پس از اتمام نصب، سرویس‌های NFS به طور خودکار راه‌اندازی می‌شوند.

NFS نسخه 2 در اوبونتو 20.04 غیرفعال است و نسخه‌های 3 و 4 فعال هستند. با اجرای دستور cat بصورت زیر می‌توانید، آن را تأیید کنید:

sudo cat /proc/fs/nfsd/versions
output:
-2 +3 +4 +4.1 +4.2

NFSv2، یک نسخه قدیمی است و دلیلی برای فعال کردن آن وجود ندارد.

پیکربندی سرور NFS در /etc/default/nfs-kernel-server و /etc/default/nfs-common files تعریف شده است. این تنظیمات پیش فرض برای اکثر شرایط کافی است.

 

ایجاد سیستم فایل

سرور NFSv4 از یک دایرکتوری root عمومی استفاده می‌کند و مسیر دایرکتوری‌های استخراج شده با این دایرکتوری مرتبط هستند. شما می‌توانید نقطه اتصال اشتراک را با استفاده از اتصال mount به دایرکتوری‌های مورد نظر پیوند دهید.

در این مثال، دایرکتوری /srv /nfs4 را به عنوان ریشه NFS تنظیم می‌کنیم. برای شرح بهتر نحوه پیکربندی mount در NFS، دو دایرکتوری /var/www و /opt/backups را با تنظیمات پیکربندی متفاوت به اشتراک می‌گذاریم. /var/www/ متعلق به کاربر www-data است و /opt/backups متعلق به کاربر root است.

ابتدا دایرکتوری root و نقاط mount مشترک را به صورت زیر ایجاد کنید:

sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www

سپس به صورت زیر دایرکتوری‌ها را به نقاط mount اشتراک متصل نمایید:

sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www

به منظور دائمی کردن این mount مشترک در راه‌اندازی مجدد، فایل /etc/fstab را باز کرده:

sudo nano /etc/fstab

و خطوط زیر را اضافه نمایید:

                 /etc/fstab

/opt/backups /srv/nfs4/backups  none   bind   0   0
/var/www     /srv/nfs4/www      none   bind   0   0

 

این مطلب نیز ممکن است برای شما مفید باشد: یافتن رابط های شبکه در دسترس در لینوکس

 

استخراج سیستم فایل

در مرحله بعدی باید سیستم فایل‌های استخراج شده و کلاینت‌های مجاز برای دسترسی به آن نقاط مشترک را به فایل /etc/export افزود.

برای هر سیستم فایل استخراج شده باید یک خط به فرم زیر نوشت:

export host(options)

که در آن، export، دایرکتوری استخراج شده است، host، نام میزبان یا آدرس/محدوده IP مورد نظر برای دسترسی به دایرکتوری استخراج شده است و options، گزینه‌های میزبان هستند.

بدین منظور، فایل /etc /export را باز کرده و خطوط زیر را اضافه نمایید:

sudo nano /etc/exports
                    /etc/exports

/srv/nfs4         192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)
/srv/nfs4/www     192.168.33.20(rw,sync,no_subtree_check)

 

خط اول شامل گزینه fsid = 0 است که دایرکتوری اصلی NFS (یعنی /srv/nfs4) را تعریف می‌کند. دسترسی به این NFS volume فقط برای کلاینت‌هایی از زیر شبکه 192.168.33.0/24 مجاز است. گزینه crossmnt برای به اشتراک گذاشتن دایرکتوری‌های داخل یک دایرکتوری استخراج شده مورد نیاز است.

خط دوم نحوه تعیین چندین قانون استخراج برای یک سیستم فایل را نشان می‌دهد. دسترسی خواندن به کل محدوده 192.168.33.0/24 مجاز است و هر دو دسترسی خواندن و نوشتن تنها برای آدرس 192.168.33.3 تعریف شده است. گزینه sync به NFS می‌گوید که قبل از پاسخ دادن، تغییرات را روی دیسک بنویسد.

خط آخر نیز که کاملاً قابل فهم است. به منظور کسب اطلاعات بیشتر در مورد همه گزینه‌های موجود، man exports را در ترمینال خود وارد کنید.

فایل را ذخیره کرده و نقطه اشتراک را به صورت زیر استخراج نمایید:

sudo exportfs -ar

شما باید هر بار که فایل /etc /export را تغییر می‌دهید، دستور بالا را اجرا کنید. در صورت وجود هرگونه خطا یا هشدار، در خروجی نشان داده می‌شوند.

 

به منظور مشاهده استخراج‌های فعال فعلی و وضعیت آن‌ها، از دستور زیر استفاده نمایید:

sudo exportfs -v

خروجی شامل همه نقاط مشترک با گزینه‌های آن‌ها است. همانطور که مشاهده می‌کنید، گزینه‌هایی نیز وجود دارد که ما در فایل /etc /export تعریف نکرده‌ایم. این‌ها، گزینه‌های پیش فرض هستند که اگر بخواهید تغییر دهید، باید صراحتاً آن گزینه‌ها را تنظیم نمایید.

ouput:
/srv/nfs4/backups
		192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 	192.168.33.20(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4     	192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
		192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

 

در اوبونتو، root_squash، به طور پیش فرض فعال است. این، یکی از مهم‌ترین گزینه‌ها در مورد امنیت NFS است. با نگاشت UID و GID به nobody / nogroup و UID / GID، از اتصال کلاینت‌ها به عنوان کاربران root و دسترسی به مجوزهای root به نقاط مشترک mount شده جلوگیری می‌کند.

به منظور دسترسی کاربران در ماشین‌های کلاینت، NFS انتظار دارد کاربر و شناسه گروه کلاینت با اطلاعات داخل سرور مطابقت داشته باشد. گزینه دیگر، استفاده از ویژگی idmapping در NFSv4 است که شناسه‌های گروه و کاربر را به نام‌ها و برعکس ترجمه می‌کند.

در این مرحله، شما یک سرور NFS روی سرور اوبونتو خود راه‌اندازی کرده‌اید. اکنون می‌توانید به مرحله بعدی بروید و کلاینت‌ها را پیکربندی کرده و به سرور NFS متصل شوید.

 

پیکربندی فایروال

اگر Jenkins را روی سرور یک اوبونتوی ریموتی نصب می‌کنید که توسط فایروال محافظت می‌شود، باید ترافیک را برروی پورت NFS فعال نمایید:

sudo ufw allow from 192.168.33.0/24 to any port nfs

سپس با دستور زیر، تغییر را اعمال کنید:

sudo ufw status

در خروجی باید نشان دهد که ترافیک برروی پورت 2049 مجاز است:

output:
To                         Action      From
--                         ------      ----
2049                       ALLOW       192.168.33.0/24           
22/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)  

 

این مطلب نیز ممکن است برای شما مفید باشد: دستور غیرفعالسازی فایروال در لینوکس

 

راه‌اندازی کلاینت‌های NFS

اکنون که سرور NFS راه‌اندازی شده و دایرکتوری‌های مشترک استخراج شدند، مرحله بعدی پیکربندی کلاینت‌ها و mount کردن سیستم فایل‌های ریموت است.

در اینجا، روی سیستم‌های لینوکس تمرکز کرده‌ایم، اما شما می‌توانید آن را برروی دستگاه‌های macOS و Windows نیز mount کنید.

 

نصب کلاینت NFS

در ماشین‌های کلاینت، تنها باید ابزارهای مورد نیاز برای mount کردن سیستم فایل NFS ریموت را نصب نماییم.

 

نصب کلاینت NFS روی دبیان و اوبونتو

بسته‌ای که شامل برنامه‌هایی برای mount کردن سیستم فایل‌های NFS در توزیع‌های مبتنی بر Debian است، nfs-common نام دارد. برای نصب آن، دستور زیر را اجرا کنید:

sudo apt update
sudo apt install nfs-common

 

نصب کلاینت NFS برروی CentOS و Fedora

در Red Hat و مشتقات آن، بسته nfs-utils را بصورت زیر نصب نمایید:

sudo yum install nfs-utils

 

نصب (mount) کردن سیستم فایل

در اینجا، برروی دستگاه کلاینتی با  آدرس 192.168.33.20 کار می‌کنیم، که دارای دسترسی خواندن و نوشتن به سیستم فایل/srv/nfs4/www  و دسترسی تنها خواندن برای سیستم فایل /srv/nfs4/backup است.

دو دایرکتوری جدید برای نقاط mount بصورت زیر ایجاد نمایید:

sudo mkdir -p /backups
sudo mkdir -p /srv/www

شما می‌توانید دایرکتوری‌ها را در هر مسیر مورد نظر ایجاد کنید.

سپس سیستم فایل‌های استخراج شده را با دستور زیر mount نمایید:

sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www

که در آن، 192.168.33.10 آدرس IP سرور NFS است. شما می‌توانید به جای آدرس IP از نام میزبان نیز استفاده کنید؛ اما باید توسط دستگاه کلاینت با IP نظیر نگاشت شده باشد. این کار معمولاً با نگاشت نام میزبان به IP در فایل /etc /hosts انجام می‌شود.

هنگام mount کردن یک سیستم فایل NFSv4، دایرکتوری اصلی NFS را حذف کرده و به جای /srv/nfs4/backups از /backups استفاده نمایید.

با استفاده از دستور mount یا df به صورت زیر می‌توانید، بررسی کنید که سیستم فایل‌های ریموت با موفقیت نصب شده است:

df -h

 

این دستور، تمام سیستم فایل‌های mount شده را چاپ می‌کند. دو خط آخر، همان دایرکتوری‌های mount شده اند:

Filesystem              Size  Used Avail Use% Mounted on
udev                    951M     0  951M   0% /dev
tmpfs                   199M  676K  199M   1% /run
/dev/sda3               124G  2.8G  115G   3% /
tmpfs                   994M     0  994M   0% /dev/shm
tmpfs                   5.0M     0  5.0M   0% /run/lock
tmpfs                   994M     0  994M   0% /sys/fs/cgroup
/dev/sda1               456M  197M  226M  47% /boot
tmpfs                   199M     0  199M   0% /run/user/1000
192.168.33.10:/backups  124G  2.8G  115G   3% /backups
192.168.33.10:/www      124G  2.8G  115G   3% /srv/www

به منظور دائمی کردن mountها در راه‌اندازی مجدد، فایل /etc/fstab را باز کرده و خطوط زیر را اضافه نمایید:

sudo nano /etc/fstab
/etc/fstab

192.168.33.10:/backups /backups   nfs   defaults,timeo=900,retrans=5,_netdev	0 0
192.168.33.10:/www /srv/www       nfs   defaults,timeo=900,retrans=5,_netdev

	0 0

برای اطلاع از گزینه‌های موجود هنگام mount کردن سیستم فایل NFS، در ترمینال خود دستور man nfs را تایپ کنید.

یکی دیگر از گزینه‌های mount کردن سیستم فایل ریموت، استفاده از ابزار autofs یا ایجاد یک واحد systemd است.

 

این مطلب نیز ممکن است برای شما مفید باشد: ذخیره دائمی قوانین فایروال iptables در لینوکس

 

آزمایش دسترسی NFS

اجازه دهید دسترسی به دایرکتوری مشترک را با ایجاد یک فایل جدید در هر یک از آن‌ها آزمایش کنیم.

ابتدا سعی کنید، با استفاده از فرمان touch، یک فایل آزمایشی در دایرکتوری /backups ایجاد نمایید:

sudo touch /backups/test.txt

سیستم فایل /backup به صورت فقط خواندنی استخراج می‌شود و همانطور که انتظار می‌رود یک پیغام خطای Permission denied را مشاهده خواهید کرد:

output:
touch: cannot touch ‘/backups/test’: Permission denied

در مرحله بعد، سعی کنید یک فایل آزمایشی در دایرکتوری /srv /www به عنوان یک root با استفاده از دستور زیر ایجاد نمایید:

sudo touch /srv/www/test.txt

دوباره، پیام Permission denied را مشاهده خواهید کرد.

touch: cannot touch ‘/srv/www’: Permission denied

 

اگر به خاطر بیاورید، دایرکتوری /var /www متعلق به کاربر www-data است و این دایرکتوری مشترک دارای گزینه root_squash است که کاربر root را به کاربر nobody و گروه nogroup (که مجوز نوشتن برای دایرکتوری مشترک ریموت را ندارند) نگاشت می‌کند.

با فرض این که یک www-data در دستگاه کلاینت با UID و GID یکسان با سرور ریموت دارید (که مثلاً nginx را روی هر دو دستگاه نصب کرده‌اید)، شما می‌توانید سعی کنید که یک فایل به عنوان کاربر www-data ایجاد کنید.

sudo -u www-data touch /srv/www/test.txt

این دستور هیچ خروجی نشان نمی‌دهد؛ به این معنی که فایل با موفقیت ایجاد شده است.

برای تأیید آن، فایل‌های موجود در دایرکتوری /srv /www را با دستور زیر لیست نمایید:

ls -la /srv/www

خروجی باید فایل تازه ایجاد شده را مشابه زیر نشان دهد:

output:
drwxr-xr-x 3 www-data www-data 4096 Apr 10 22:18 .
drwxr-xr-x 3 root     root     4096 Apr 10 22:29 ..
-rw-r--r-- 1 www-data www-data    0 Apr 10 21:58 index.html
-rw-r--r-- 1 www-data www-data    0 Apr 10 22:18 test.txt

 

جدا (unmount) کردن سیستم فایل NFS

اگر دیگر نیازی به اشتراک گذاری NFS ریموت نیست، شما می‌توانید با استفاده از دستور unmount، آن را مانند هر سیستم فایل mount شده دیگر جدا کنید.

به عنوان مثال، برای جدا کردن دایرکتوری /backup، دستور زیر را اجرا نمایید:

sudo umount /backups

اگر نقطه mount در فایل /etc/fstab تعریف شده است، مطمئن شوید که آن خط را حذف کرده یا علامت # در ابتدای آن قرار داده‌اید.

 

 

 

منبع:

linuxize