NFS簡介和配置

1、簡介
   NFS(Network File System/網絡文件系統):
      1)、設置Linux系統之間的文件共享(Linux與Windows中間文件共享採用SAMBA服務);

2)、NFS只是一種文件系統,自己沒有傳輸功能,是基於RPC協議實現的,才能達到兩個Linux系統之間的文件目錄共享; linux

3)、NFS爲C/S架構; web

2、依賴的服務和軟件包
    一、檢查下列兩個包是否已經安裝(默認安裝完RHEL或者CentOS系統,就已經安裝了這兩個軟件包)
[root@Mylinux ~]# rpm -qa | grep 'portmap\|nfs-utils'

二、若是沒有安裝,如今就安裝它們
[root@Mylinux ~]# yum install -y portmap nfs-utils

說明以下:
(1)
nfs-utils套件
該套件提供 rpc.nfsd  rpc.mountd 這兩個 NFS daemons 與其它相關 documents 與說明文件、執行檔等的套件!因此它是 NFS 的主要套件
(2)portmap套件
NFS 其實能夠被視爲一個 RPC server program,而要激活任何一個 RPC server program 以前,咱們都須要作好 port 的對應 (mapping)的工做才行,這個工做其實就是portmap這個服務所負責的!也就是說,在激活任何一個 RPC server 以前,須要激活 portmap ,那麼 portmap 就是做 port  mapping 
例如:當 Client 端嘗試來使用 RPC server 所提供的服務時,因爲 Client 須要取得一個能夠鏈接的 port 纔可以使用 RPC server 所提供的服務,所以, Client 首先就會去跟 portmap 聯繫一個port number ,好讓Client能夠跟 RPC 聯絡,這個時候 portmap 就自動的將本身管理的 port mapping 告知 Client ,好讓他能夠鏈接上來 server!因此說:在激活 NFS 以前,要先激活portmap


既然nfs依賴於RPC,那麼咱們使用rpcinfo指令來查看一下本地rpc信息
[root@Mylinux ~]# service portmap start;   service nfs start;   rpcinfo -p localhost
rpc.nfsd
---管理clinet是否有權限登陸,以及判別登陸者的uid
rpc.mountd---
讀取/etc/exports的權限,對文件訪問權限進行控制
rpc.lockd
---文件的互斥鎖,保證文件在同一時間只有一我的訪問,須要nfslockd服務

rpc.statd---檢查文件的一致性,須要nfslockd服務
vim

3、服務端配置方法

    1)配置服務器端的主配置文件/etc/exports
[root@Mylinux ~]# vim   /etc/exports

(1)語法格式
/etc/exports文件中每一行提供了一個共享目錄的設置,其格式爲以下:

+ 空格 + [hostname1IP1(參數1,參數2.....)] + 空格 + [ hostname2IP2(參數3,參數4....)]

(2)主要參數以下

rw 緩存

可讀可寫 安全

ro 服務器

只讀 網絡

sync 架構

數據同步寫入內存緩衝區與磁盤中,雖然這樣作效率較低,但能夠保證數據的一致性(適合於小文件傳輸) app

async async

數據先暫時放於內存,而非直接寫入硬盤,等到必要時才寫入磁盤(適合於大文件傳輸)

no_root_squash

使用nfs時,若是用戶是root,不進行權限壓縮,即root用戶在nfs上建立的文件   屬組和屬主仍然是root(不安全,不建議使用)

root_squash

使用nfs時,若是用戶是root,則進行權限壓縮,即把root用戶在nfs上建立的文件   屬組和屬主修改成nfsnobody

all_squash

全部的普通用戶使用nfs都將使用權限壓縮,即:將遠程訪問的全部普通用戶及所屬用戶組都映射爲匿名用戶或者用戶組(通常均爲nfsnobody

no_all_squash

全部的普通用戶使用nfs都不使用權限壓縮,即:不將遠程訪問的全部普通用戶及所屬用戶組都映射爲匿名用戶或者用戶組(默認設置)

anonuid=XXX

anonanonymous(匿名者),前面關於*_squash提到的匿名用戶的uid的設置值,一般爲nobody或者nfsnobody,使用這個參數能夠自行設定這個uid值,這個uid必須存在  /etc/passwd

anongid=XXX

將遠程訪問的全部用戶組都映身爲匿名用戶組帳戶,並指定該匿名用戶組帳戶爲本地用戶組帳戶(GID=XXX

insecure

容許客戶端從大於1024TCP/IP端口連NFS服務器

secure

限制客戶端只能從小於1024TCP/IP端口鏈接NFS服務器(默認設置)

wdelay

檢查是否有相關的寫操做,若是有則將這些寫操做一塊兒執行,這樣可提升效率(默認設置)

no_wdelay

如有寫操做則當即執行(應與sync配置)

subtree_check

若輸出目錄是一個子目錄,則NFSW:務器將檢查其父目錄的權限(默認設置)

no_subtree_check

即便輸出目錄是一個子目錄,NFS服務器也不檢查其父目錄的權限,這樣作可提升效率


(3)設置實例

/tmp *(rw,no_root_squash)

在全部的IP(主機)上登陸的用戶均可對NFS服務器上的共享目錄/tmp擁有rw操做權限,同時若是是root用戶訪問該共享目錄,那麼不將root用戶及所屬用戶組都映射爲匿名用戶或用戶組(*表示全部的主機或者IP

/tmp *(rw)

在全部的IP(主機)登陸的用戶均可對NFS服務器上的共享目錄/tmp擁有rw操做權限

/home/public 192.168.0.*(rw)   *(ro) 
/home/public 192.168.0.0/24(rw) *(ro)

除了在192. 168. 0.0/24這個網段內的主機上登陸的用戶,可對NFS服務器共享目錄/home/public進行rw操做權限,而其它網段的主機上登陸的用戶,對NFS服務器共享目錄/home/public只能進行r操做

/home/test 192.168.0.100(rw)

只對192.168.0.100該臺主機設置權限,即:使在該臺主機登陸的用戶均可對NFS服務器上的共享目錄/home/test擁有讀與寫的操做

/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)

*.linux.org(加入域linux.org的全部主機) 登錄此NFS主機,而且在/home/linux下面寫入檔案時,該檔案的全部人與全部組,就會變成NFS服務器上的/etc/passwd文件裏面對應的UID40的那個身份的使用者了(由於指定了參數:all_squashanonuid=40anongid=40


(4)權限問題

NFS服務器(192.168.0.2)上的/etc/exports配置文件設置以下
/tmp *(rw,no_root_squash)
/home/public 192.168.0.*(rw) *(ro)
/home/test 192.168.0.100(rw)
/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)

例如:咱們在192.168.0.100這個client端登錄此NFS主機(192.168.0.2),那麼會怎麼樣呢?

狀況一: 在192.168.0.100的賬號爲test這個身份,同時NFS主機上也有test這個賬號

1)因爲NFS主機的/tmp權限爲-rwxrwxrwt,因此我(test192.168.0.100)/tmp下面具備存取的權限,而且寫入檔案的全部人爲test

2)在/home/public中,因爲我有讀寫的權限,若是NFS主機在/home/public這個目錄的權限對於test開放寫入的話,那麼就可 以讀寫,而且寫入檔案的全部人是test。若是NFS主機的/home/public對於test這個使用者並無開放寫入權限時,那就沒法寫入,雖然 /etc/exports裏面是rw,也不起做用

3)在/home/test中,權限與/home/public有相同的狀態,須要NFS主機的/home/test對於test有開放的權限

4)在/home/linux當中,不管是何種的user,身份都會被變成UID=40的這個賬號

狀況二: 若是咱們在192.168.0.100的身份爲test2,可是NFS主機卻沒有test2這個賬號時

1)在/tmp下仍是能夠寫入,可是寫入的檔案全部人變成nobody

2)在/home/public/home/test裏面是否能夠寫入,還須要看/home/public的權限而定,不過身份就被變成nobody

3/home/linux下的身份仍是變成UID=40的賬號

狀況三:在192.168.0.100的身份爲root     

1)在/tmp裏面能夠寫入,可是因爲no_root_squash的參數,改變了預設的root_squash的設定值,因此在/tmp寫入檔案的全部人爲root

2)在/home/public底下的身份被壓縮成了nobody,由於預設的屬性都具備root_squash,因此檔案全部人就變成了nobody

3/home/test狀況與/home/public相同

4/home/linux中,root的身份也被壓縮成UID=40的那個使用者了

(5)啓動nfslock、portmap、nfs服務,並查看日誌是否正常的激活
[root@Mylinux ~]# service portmap start
[root@Mylinux ~]# service nfs   start
[root@Mylinux ~]# service nfslock start
[root@Mylinux ~]# tail -10 /var/log/messages

注意:啓動這些服務的順序

(6)客戶端鏈接使用nfs
[root@Mylinux ~]# /etc/init.d/portmap start
[root@Mylinux ~]# /etc/init.d/nfslock    start
[root@Mylinux ~]# showmount -e 192.168.0.2

(7)exportfs與showmount指令的用法 

exportfs指令做用

用來維護NFS服務的共享目錄列表的輸出

exportfs指令語法
exportfs [-aruv]

-a

所有mount或者unmount /etc/exports中內容(即:要被共享出來的目錄)

-r

從新讀取/etc/exports文件的設置,並使得設置當即生效,而不須要從新啓動nfs服務

-u

中止輸出某一個目錄

-v

在輸出目錄時,將詳細的信息輸出到屏幕上

注意:當修改了/etc/exports配置文件,可使用參數-r從新讀取/etc/exports配置文件,使得設置當即生效,而不須要重啓nfs服務

exportfs指令例子

#exportfs -rv //從新export一次
#exportfs -au //
所有卸載
exporting 192.168.0.100:/home/test
exporting 192.168.0.*:/home/public
exporting *.the9.com:/home/linux
exporting *:/home/public
exporting *:/tmp
reexporting 192.168.0.100:/home/test to kerne


格式:showmount [-ae] hostnameIP

-a

顯示指定的NFS服務器的全部客戶端主機及其所鏈接的目錄(通常在NFS Server上使用該參數)

-e
-d

顯示指定的NFS服務器全部export出來的目錄
顯示指定的NFS服務器中已被客戶端鏈接的全部export出來的目錄

(8)/var/lib/nfs/etab裏面能夠查看每一個目錄的分享權,例如:
/nfs *rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
對照一下 /etc/passwd ,你就會發現,65534這個UID的用戶是nfsnobody

(9)啓動和中止NFS服務
Section 1:啓動NFS服務
[root@Mylinux ~]# service portmap start
[root@Mylinux ~]# service nfs start
[root@Mylinux ~]# service nfslock start

注意:它們的啓動順序,由於nfs服務是依賴於RPC服務的,而RPC服務又依賴於portmap服務,因此要先啓動portmap,而最後一個nfslock服務是對nfs共享的文件的讀定鎖定,因此在啓動nfs服務後再啓動
Section 2:中止NFS服務
[root@Mylinux ~]# service nfslock start
[root@Mylinux ~]# service nfs start
[root@Mylinux ~]# service portmap start
Section 3:檢測與重啓NFS服務
[root@Mylinux ~]# /etc/init.d/nfs restart
[root@Mylinux ~]# /etc/init.d/nfs status
[root@Mylinux ~]# /etc/init.d/portmap status
Section 4:設置自動啓動NFS服務
[root@Mylinux ~]# chkconfig --level 345 portmap on
[root@Mylinux ~]# chkconfig --level 345 nfs on




4、客戶端配置方法
    一、手動掛載NFS服務器的共享目錄到NFS客戶端

[root@Mylinux ~]# mount -t nfs hostname(orIP):/directory /mountpoint 
注意:爲了擔憂會不當心將 NFS 端掛進來的具備 SUID 權限檔案的程序執行,root能夠將NFS 所分享的目錄以較爲安全的狀況掛載進來,即:「 mount -t nfs -o nosuid,ro hostname:/directory /mountponit 」

掛載NFS系統文件的可選參數以下

soft

當服務器端沒回應時,會在timeout後從新鏈接,傳回錯誤信息

hard

當服務器端沒回應時持續在後臺嘗試鏈接

intr

當正在進行 NFS 請求時,容許用鍵盤中斷

nointr

當正在進行 NFS 請求時,不容許用鍵盤中斷

timeo

請求過時時間,單位爲秒

bg

當第一次請求不成功,第二次的mount將放到後臺執行

fg

一直在前臺發送請求

proto=tcp|udp

修改使用TCP協議仍是UDP協議來傳輸nfs的數據

default

hardnointr

rsize

讀操做的塊大小,這個設置影響服務器和客戶端的nfs緩存大小,若是有充足的內存和網絡帶寬,能夠設置高些,如32768(bytes)

wsize

寫操做的塊大小,這個設置影響服務器和客戶端的nfs緩存大小,若是有充足的內存和網絡帶寬,能夠設置高些,如32768(bytes)

查看幫助文件:man fstabman -a mount


注意:若是要自動掛NFS共享目錄,那麼能夠在/etc/fstab文件中進行配置

二、使用autofs來實現自動掛載NFS服務器的共享目錄到NFS客戶端

1)爲何要使用autofs
autofs 
可以自動掛載卸載nfs和文件系統,而且在空閒的時候可以關閉nfs鏈接,下降系統負載。使用autofs要先關閉netfs服務,並註釋掉/etc/fstab裏關於nfs的內容

2)如何使用autofs實現NFS服務
[root@Mylinux ~]# chkconfig --level 35 autofs on
[root@Mylinux ~]# /etc/init.d/autofs start
[root@Mylinux ~]# vi /etc/auto.master

/nfs    /etc/auto.nfs   --timeout=60
[root@Mylinux ~]# vi /etc/auto.nfs
public          -ro,soft,intr           192.168.0.228:/data
[root@Mylinux ~]# reboot
[root@Mylinux ~]# cd /nfs
[root@Mylinux ~]# ls
[root@Mylinux ~]# mount

/dev/hda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda2 on /web type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

[root@Mylinux ~]# cd public
[root@Mylinux ~]# mount

/dev/hda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda2 on /web type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.0.228:/data on /nfs/public type nfs (ro,soft,intr,addr=192.168.0.228)

同時使用多個參數的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
注意:NFS客戶機和服務器的選項並不必定徹底相同,並且有的時候會有衝突。好比說服務器以只讀的方式導出,客戶端卻以可寫的方式mount,雖然能夠成功mount上,但嘗試寫入的時候就會發生錯誤。通常服務器和客戶端配置衝突的時候,會以服務器的配置爲準

三、配置/etc/fstab文件來實現開機自動掛載NFS服務器的共享目錄到NFS客戶端
注意:
 要開機掛載nfs文件系統還須要開啓netfs服務,而且把掛載項寫入到/etc/fstab

/etc/fstab文件的語法格式

格式: fs_spec   fs_file   fs_type   fs_options  fs_dump fs_pass

fs_spec

該字段定義但願加載的文件系統所在的設備或遠程文件系統, 對於nfs這個參數通常設置爲這樣:192.168.0.1:/NFS

fs_file

本地的掛載點

fs_type

對於NFS來講這個字段只要設置成nfs

fs_options

掛載的參數,可使用的參數能夠參考上面的mount參數

fs_dump

該選項被 " dump " 命令使用來檢查一個文件系統應該以多快頻率進行轉儲,若不須要轉儲就設置該字段爲:0

fs_pass

該字段被fsck命令用來決定在啓動時須要被掃描的文件系統的順序,根文件系統"/"對應該字段的值應該爲:1,其餘文件系統應該爲:2。若該文件系統無需在啓動時掃描則設置該字段爲:0

查看幫助文件:man fstabman -a mount

四、與NFS有關一些其它指令
nfsstat: 查看NFS的運行狀態,對於調整NFS的運行有很大幫助
rpcinfo -p hostname(orIP)
 查看rpc執行信息,能夠用於檢測rpc運行狀況的工具

5、NFS服務的安全

一、NFS不安全體如今如下幾個方面

第一點:新手對NFS的訪問控制機制難於作到駕輕就熟,控制目標的精確性難以實現

第二點:NFS沒有真正的用戶驗證機制,而只有對RPC/Mount請求的過程驗證機制

第三點:較早的NFS可使未受權用戶得到有效的文件句柄

第四點:在RPC遠程調用中,一個SUID的程序就具備超級用戶權限

二、增強NFS安全的方法以下

第一:合理的設定/etc/exports中共享出去的目錄,最好能使用anonuidanongid以使MOUNTNFS SERVERCLIENT僅僅有最小的權限,最好不要使用root_squash

第二:使用IPTABLE防火牆限制可以鏈接到NFS SERVER的機器範圍
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT

第三:爲了防止可能的Dos攻擊,須要合理設定NFSD COPY數目

第四:修改/etc/hosts.allow/etc/hosts.deny達到限制CLIENT的目的
/etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow
/etc/hosts.deny
portmap: ALL : deny

第五:改變默認的NFS 端口
NFS
默認使用的是111端口,但同時你也可使用port參數來改變這個端口,這樣就能夠在必定程度上加強安全性

第六:使用Kerberos V5做爲登錄驗證系統

6、NFS服務的trouble shooting

   

常見錯誤

1)權限的設置不符合

 

2)忘記了激活portmap服務

錯誤信息

mount: RPC: Port mapper failure - RPC: Unable to receive mount: RPC: Program not registered

解決辦法

啓動portmap,而且從新啓動nfs
#service portmap start
#service nfs restart

3)被防火牆攔截

從新設置防火牆,包括iptablesTCP_Wrappers,由於激活了portmap,因此port 111必須提供出去.所以在iptables rules中,要增長:
iptables -A INPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT

若是還不行,那就是TCP_Wrappers的問題,檢查/etc/hosts.deny,若是有一行是:
  ALL: ALL: deny
那就必須在/etc/hosts.allow中增長:
  portmap: ALL: allow

若是咱們的NFS針對內部網絡開發,對於外部網絡只對學術網絡開發(140.0.0.0/8),能夠:
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT

還可使用TCP_Wrappers,在/etc/hosts.allow裏面規定連上 NFS 主機的主機 IP 與名稱,例如
#vi /.etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 :allow
portmap: 140.113.23.23     :allow

4cant contact portmapper: RPC: Remote system error - Connection refused

出現這個錯誤信息是因爲SEVER端的PORTMAP沒有啓動

5mount clntudp_create: RPC: Program not registered

NFS沒有啓動起來,能夠用showmout -e host命令來檢查NFS SERVER是否正常啓動起來

6mount: localhost:/home/test failed, reason given by server: Permission denied

這個提示是當clientmount nfs server時可能出現的提示,意思是說本機沒有權限去mount nfs server上的目錄。解決方法固然是去修改NFS SERVER

相關文章
相關標籤/搜索