למד לעבוד עם NFS בעשר דקות

נדב מבור
היסטוריית גירסאות
גירסה 1.0 06-04-2007 xx
הומר לפורמאט וויקי

זכויות יוצרים ורשיון

כל הזכויות שמורות © 2007, נדב מבור, הרשות ניתנת להעתיק, לשנות ולהפיץ מדריך זה תחת התנאים של רשיון ה-GFDL

Linux הוא סימן מסחרי רשום של Linus Torvalds.

הסרת אחריות

הכותב אינו נושא באחריות עבור שימוש ברעיונות, דוגמאות ומידע שבמדריך. השימוש הוא באחריות הקורא בלבד. המדריך עשוי להחיל טעויות ופרטים לא נכונים, שהשימוש בהם עשוי להיות מזיק למחשבך. למרות הסבירות הנמוכה, הכותב אינו לוקח כל אחריות

תורמים למדריך \ תודות

  • ברק בלוך על שסייע ביידי להעלות את המדריך
  • אתר הפינגווין על שהסכימו לאכסן אותו.

מבוא

מי ירצה לקרוא את המדריך?

כל מי שמריץ יותר ממכונת יוניקס / לינוקס אחת ברשת המקומית, ולא יודע להשתמש ב NFS, עשוי למצוא את המדריך הזה כרלוונטי עבורו.
בגדול, nfs הוא שירות שמאפשר למפות תקיות / מחיצות ממכונה אחת במכונה אחרת כלשהי ברשת.
המיפוי מאפשר למכונה שמריצה את ה client לעבוד מול הקבצים של המכונה השניה, כאילו היו מקומיים (הקבצים ממופים תחת תקיה כלשהי, בדיוק כמו שמממפים מחיצות / דיסקים קשיחים על מערכת היוניקס).

ניתן להתקין קליינט של NFS גם במכונת חלונות, אבל במקרים של שימוש בחלונות ברשת, במקרים רבים נעדיף לעבוד עם SAMBA שכן היא משתמשת בפרוטוקולים שחלונות מכירה בלי תוכנות צד שלישי.

מעבר לזה, ה NFS הוא שירות מאוד פשוט ומהיר , ולפיכך קל מאוד להגדיר אותו לשימוש מיידי, ובמקרים רבים נעדיף אותו בשל כך על השימוש ב SAMBA שדורשת עבודת הגדרה גדולה יחסית לפני הפעלה.

קצת רקע

מה זה NFS ומי צריך את זה

ה NFS, Network File System היא מערכת לשיתוף קבצים של מערכות היוניקס ושל מערכות הגנו/לינוקס, והיא מקבילה ל SMB/CIFS של חלונות (אשר בגנו/לינוקס ניתן לממש בעזרת השרת של samba).

השימוש ב NFS מאפשר בקלות רבה יחסית, לשתף תקיה / מחיצה של מחשב כלשהו (מעתה נקרא לו “שרת”) אל מול מחשב אחר (שמעתה נקרא לו “לקוח”).
ברגע ששיתפנו תקיה מסויימת, נותר רק למפות אותה (בעזרת השימוש ב mount בצורה סטנדרית ביותר) על הלקוח.
אם השירות רץ כראוי, הלקוח יכול לגשת לתקיה הרשתית כאילו היתה מקומית (כמובן, שמאחורי הקלעים הכל נעשה ברמת רשת).

הערה חשובה: שירות ה NFS, כמו שירותים אחרים לשיתוף קבצים ברשת, היא שירות מאוד בעייתי מבחינת אבטחה, ולפיכך,ואפשר לראות בזה פק”ל אם תשאלו אותי, חשוב מאוד לסגור את השירות כלפי הרשת החיצונית. אני ממליץ על סגירה של השירות גם ברמת firewall, וגם כפי שיוסבר בהמשך.
אם השירות לא נמצא בשימוש, מיותר להריץ אותו בלי סיבה, וכדאי לסגור אותו לחלוטין.

זכור: שרת NFS פתוח לאינטרנט, מהווה פרצת אבטחה חמורה ביותר!

התקנה והפעלה ראשונית

התקנת החבילות.

כדי להתקין מערכת שרת / לקוח צריכות להיות מותקנות לפחות שני החבילות הבאות:

  • nfs-utils-clients
  • nfs-utils

בהפצות כגון ראד האט, במקום החבילה nfs-utils-client צריך להתקין את החבילה nfs-client.

  • במערכות מנדריק שבדקתי, בניגוד ל-RedHat יש צורך להתקין גם את quota בנוסף.

החבילות הנ”ל זמינות בתור rpm בדיסק של ההתקנה, ככה שאין סיבה שההתקנה תהיה מסובכת מדי.

הפעלת השירות

ה NFS מבוסס על כמה שרותים ותהליכים שקשורים אחד בשני כמו Portamap.
בתור התחלה נפעיל את ה NFS ואז נבדוק אם כל השרותים הרלוונטים עלו בצורה תקינה. נתחיל ב:

service portmap start
service nfs start

אלו הפקודות שצריך להריץ כדי להפעיל לראשונה את השירות.
כמו כל שירות אחר במערכת, נוכל להשתמש ב chckonfig או ntsysv (הדרך המהירה יותר) לקבע את ההפעלה של המערכת אוטומטית בעת האתחול של המחשב.

כדי לבדוק שהשירות רץ, נבצע מספר בדיקות. ראשית, נבדוק ש nfsd רץ (השירות):

[root@localhost 1]# ps -A |grep nfs
1283 ? 00:00:00 nfsd
1286 ? 00:00:00 nfsd
1287 ? 00:00:00 nfsd
1288 ? 00:00:00 nfsd
1289 ? 00:00:00 nfsd
1290 ? 00:00:00 nfsd
1291 ? 00:00:00 nfsd
1292 ? 00:00:00 nfsd

נבדוק שה rpc רץ:

[root@localhost 1]# ps -A |grep rpc
1007 ? 00:00:00 rpc.statd
1285 ? 00:00:00 rpciod
1304 ? 00:00:00 rpc.mountd

ולבסוף נבדוק שמכלול השירותים עובד כראוי, על ידי שימוש ב rpcinfo, אנחנו אמורים לקבל פלט שנראה בערך ככה:

[root@localhost 111]# rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100021 1 udp 32776 nlockmgr
100021 3 udp 32776 nlockmgr
100021 4 udp 32776 nlockmgr
100024 1 udp 32780 status
100024 1 tcp 35075 status
100011 1 udp 626 rquotad
100011 2 udp 626 rquotad
100011 1 tcp 629 rquotad
100011 2 tcp 629 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100005 1 udp 32782 mountd
100005 1 tcp 35190 mountd
100005 2 udp 32782 mountd
100005 2 tcp 35190 mountd
100005 3 udp 32782 mountd
100005 3 tcp 35190 mountd

אם לא עלינו קיבלנו פלט שאינו דומה או את הודעת השגיאה הבאה:

rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused

סביר להניח שהשירותים לא הופעלו ויש להפעיל אותם שוב, כלומר:

[root@localhost root]# /etc/init.d/portmap restart
Stopping portmap services: [FAILED]
Starting portmapper: [ OK ]
[root@localhost 111]# /etc/init.d/nfs restart
Stopping NFS mountd: [FAILED]
Stopping NFS daemon: [FAILED]
Stopping NFS quotas: [FAILED]
Stopping NFS services: [FAILED]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]

אם יש בעיה בעלית אחד השירותים או יותר, אין מנוס מלהביט בקבצי הלוג הרלוונטים במערכת, אבל בד”כ אין סיבה טובה לבעיות, למרבה השמחה, והנסיון שלי מלמד שכמעט תמיד המערכת תעבוד ללא בעיות מיותרות.

עריכת קבצי הקונפיגורציה

עריכת הקובץ העיקרי

הקובץ העיקרי של שרת ה nfs יושב כצפוי תחת etc/, הקובץ הוא:

/etc/exports

הקובץ הזה מכיל כמה שורות. כל שורה היא רשומה של שיתוף ספריה. מבנה תחביר טפוסי של שורה בקובץ נראה ככה:

/home/nadav 192.168.0.10(rw) 192.168.0.11(ro)

ובעברית מה זה אומר? פשוט מאוד !!
כל שורה מתחלקת ל 2 חלקים עיקריים: צד שמאל זה הצד של השרת וצד ימין זה הצד של הלקוחות.
בצד של השרת יש את המיקום של הסיפריה שאנחנו רוצים לשתף (במקרה הזה את ספרית הבית שלי שהיא home/nadav) ובצד השני לאיזה לקוחות מותר לגשת לשיתוף ובאיזה הרשאה (קריאה או קריאה וכתיבה). במיקרה שבדוגמא, מותר רק לשתי מכונות לגשת לספריה הזאת אחת בעלת IP שמסתיים ב10 ומותר לה לקרוא את התוכן של הספריה ולכתוב והשניה שהIP שלה ניגמר ב 11 ולה מותר רק לקרוא את התוכן של הסיפריה. בנוסף אם יש DNS פעיל אפשר להשתמש בשם של המכונה במקום הIP אני אני ממליץ על זה פחות (זיהוי על פי שם הוא פחות מאובטח ואמין מאשר IP).

בנוסף אפשר להשתמש בטווח של כתובות במקום בIP בודד (למקרה שיש הרבה מחשבים שאמורים לגשת לספריה).
במקרה כזה במקום IP נכתוב את הטווח כתובות, לדוגמא אם היתי רוצה לאפשר לכל המחשבים אצלי בבית לגשת לספריה אז הייתי רושם בקובץ את השורה הבאה:

/home/nadav 192.168.0.0/255.255.255.0(ro)

במקרה הזה כול המחשבים שהIP שלהם נע בין 192.168.0.1 ל-192.168.0.254 ב-netmask של 255.255.255.0 יוכלו לגשת לספריה ולקרוא ממנה.
האופציות החשובות שצריך לזכור בקובץ הזה הם:

  • ro - במילים אחרות read only כלומר גישה במצב של קריאה בלבד
  • rw - שיתוף מלא, כלומר אפשר גם לכתוב לספריה וגם לקרוא ממנה.

נקודה חשובה היא שאחרי כל שינוי שבוצע בקובץ צריך לגרום למערכת לקרוא את הקובץ מחדש באמצעות עצירת השירות והעלאה שלו מחדש. יש דרך יותר אלגנטית לעשות את זה באמצעות הפקודה:

exportfs -ra

עריכת קבצים נוספים - לשיפור האבטחה!

אחרי שהגדרנו את ה NFS לשתף קבצים, חשוב קצת לשפר את האבטחה.
כמו שכבר אמרנו, שירות זה בהחלט אינו נחשב לשירות מאובטח, ולפיכך, אנחנו נשתמש במנגנון שמערכת הגנו/לינוקס נותנת לנו על מנת לשפר את האבטחה, ולמנוע אפשרות של התחברות אל השרת ממחשבים לא רצויים.

etc/hosts.allow/ ו etc/hosts.deny/ אלו לא קבצים שקשורים באופן ישיר ל NFS, אלה הם קבצי מערכת שאחראים על הגישה למערכת לפני שמשנים אותם חובה לגבות את התוכן שלהם (אפשר להעזר ב cp כמובן, להעתקתם ושמירת עותק שלהם)!!

קצת רקע : כאשר מתחברים לשרת GNU/Linux לצורך התחברות לשירות כלשהו (וזה לא משנה סוג השירות, למשל SSH POP3 FTP…) המערכת בודקת בצורה היררכית אם מותר לה לקבל בכלל פניות מה IP הזה ורק אז היא בודקת אם היא יכולה לטפל בפניה.
הבדיקה נערכת בצורה הררכית (כלומר בשלבים):

  • שלב א - בדיקה של ה IP בקובץ hosts.allow אם ה IP קיים הגישה מאושרת והבקשה מתחילה להיות מעובדת אם לא הבדיקה עוברת לקובץ hosts.deny
  • שלב ב - בדיקה של ה IP בקובץ hosts.deny, אם ה IP שם, הגישה נשללת מידית.
  • אם לא עוברים לשלב ג. שלב ג - אם הIP לא נמצא ב hosts.deny וגם לא ב hosts.allow אז הגישה ניתנה.

זה בכל אופן ההגדרה הסטנדרטית ברוב המערכות, למרות שיש מערכות שמוגדרות ההפך כלומר אם הIP לא נימצא ב hosts.allow וגם לא בhosts.allow אז הגישה נשללת מידית והלקוח נדחה.

טוב ונחזור לעסק ! בשביל מה לעזאזל אנחנו רוצים לשחק אם הקבצים האלה?

בגלל שהמנגנון זיהוי של הNFS הוא לא מספק, וכדי להגן על הספריות בצורה הטובה ביותר האפשרית, אנחנו נשתמש במנגנון של ה hosts.allow ו hosts.deny בשביל לשפר קצת את רמת האבטחה ולהיות בטוחים שאף חכמולוג מחוץ לרשת שלנו לא יוכל לשחק לנו עם ה - NFS.
בתור התחלה, נשים בקובץ hosts.deny שורה שתמנע מכולם לגשת ל PORTMAP (זה השרות שמולו נעשית הפעילות של NFS) השורה היא:

portmap:ALL

כלומר אין גישה לאף אחד !! כלומר אף אחד לא יוכל להתחבר לNFS נכון? כרגע כן, אז נוסף עוד שורה ל hosts.allow בשביל לסדר את הבעיה שיצרנו:

portmap: 192.168.0.10 , 192.168.0.11

אם נחזור ל”תרשים זרימה” מההסבר, נראה שאם מישהו, למשל אם כתובת IP 192.168.0.13,ינסה להתחבר אז בבדיקה של שלב א הוא לא ימצא והמחשב ימשיך לשלב ב, שם נשללת הגישה לכולם, אז הוא “יבעט אותו” החוצה, אבל אם לדוגמה מחשב עם IP של 192.168.0.10 ינסה להכנס אז כבר בשלב א הוא יקבל גישה ויורשה להתחבר למערכת ה NFS.

מדריכים/למד_לעבוד_עם_nfs_בעשר_דקות.txt · שונה לאחרונה ב: 2008/06/19 18:34 (עריכה חיצונית)
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0