Linux之NFS配置
NFS背景知識介紹
NFS是一種古老的用於在UNIX/Linux主機之間進行文件分享的協議。它古老到你必須穿著白大褂才能接近一臺計算機的年代。在那個年代,所有的聯網計算機都被認為是可信的,而不像現今這樣,任何人都有多種多樣方法能連接到你的計算機。因此,NFS在開發的時候專註於快速及易用的文件共享,而忽視了其安全性設計。
在NFS協議裏,其安全性是基於主機的。也就是說,當你創建了一個文件共享時,它是基於主機進行權限分配,而不是基於帳戶進行權限分配。當某臺主機連接至NFS Server端時,在該臺主機上的用戶與NFS Server上的具有相同ID的用戶具有相同的權限。例如,客戶端ID 501的用戶與Server端 ID 501的用戶具有相同的權限。因此,這會引發十分嚴重的系統安全性問題。例如:假設在客戶端上有一個用戶Ethan,其ID為1001,而在主機端有一個用戶Alex,其ID也為1001,且其屬於管理員組。對於計算機而言,其僅僅識別用戶ID,而不會關心用戶的用戶名。因此,則當客戶端連接至服務器端並進行文件訪問時,Server端進行比判後發現用戶ID為1001的客戶端需要訪問本機文件,且其屬於管理員組,因此就會給予其相應的管理員組的權限,這是一個十分危險的行為,如此以來,×××就可以嘗試通過窮舉的方法,獲取系統的管理權限,危害性不言而喻。
也正是基於此,NFS通常會和NIS服務聯合使用。NIS服務提供了集中化的用戶管理服務,下一篇博文我會詳細介紹該協議。
目前,NFS共有4個版本,在最新的NFSV4中,Kerberos可以作為一個選項,為NFS協議安全性保駕護航。本文暫不涉及kerberos的配置。
理解NFS進程
為了使用NFS server, 需要配置幾個相應的組件。首先就是NFS Server本身,這是由linux內核提供的。而為了提供服務,NFS還使用了另一個服務,即NFS RPC(遠程過程調用)portmapper。(在CentOS6後,該服務已經被替換為rpcbind服務)首先,我們先看一下RPC服務的作用。
大家都知道,現代計算機提供的服務都有其自身固定的端口號。比如telnet協議使用23號端口,ssh使用22號端口,http協議使用80號端口,但NFS卻沒有其固定的端口號,歸根結底,這是由於NFS誕生時,TCP和UDP端口的使用尚未形成統一的規範。所以,NFS就使用了自定義的端口號,也就是所謂的RPC 功能號碼(RPC program numbers)。直至NFSV3為了與現代計算機提供服務的方式相兼容,這些功能號碼必須被轉換成一個固定的端口號,這即是portmapper(rpcbind)這個程序的功能。當一個基於rpc的程序(比如nfs)啟動時,它就會將自身正在監聽的端口號向rpc進行註冊。當某個客戶端想要與基於RPC的服務進行通信時,它首先會連接至portmapper(rpcbind)進程,從而查找出服務端正在監聽的號碼,並與之進行通信。為了查找你的服務器端正在監聽哪些RPC端口號,可以使用命令rpcinfo -p命令。在我的計算機上它顯示如下:
[root@localhost ~]# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 58017 status
100005 1 udp 20048 mountd
100024 1 tcp 48387 status
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 33529 nlockmgr
100021 3 udp 33529 nlockmgr
100021 4 udp 33529 nlockmgr
100021 1 tcp 44320 nlockmgr
100021 3 tcp 44320 nlockmgr
100021 4 tcp 44320 nlockmgr
從命令輸出可以看到,NFS正在監聽2049端口,並且其支持Version3, 4。其內部使用了RPC端口號10003.由於NFS需要向RPC服務進行註冊自身使用的端口號,所以在啟動NFS服務之前,必須確保portmapper服務已經啟動。所有的各Linux主要發行版均會在你啟動NFS Server時自動確保該點實現。
當啟動portmapper後,其它的NFS Server組件就可以啟動了。首先即是rpc.nfsd進程。該進程用來通知portmapper有一個NFS Server啟動了,並且告訴NFS Server端portmapper的功能號。
第二個需要啟動的就是rpc.mountd進程。該進程允許客戶端將nfs Server共享文件掛載至本地。
第三個可選啟動的即是rpc.lockd進程。該進程確保在同一時刻,僅有一個用戶可以訪問同一個文件。這些進程不需要手動啟動,它們由啟動NFS Server時的腳本自動加載運行。
需要註意的是從NFSV4開始,NFS進程發生了重大變化。在NFSV4中,其使用固定的端口號2049對外提供服務。這使得配置管理和使用NFS變得更容易了,特別是在一些使用防火墻的場景中。
最後一個部分是關於NFS Server端的配置文件,總共有兩個文件。第一個是/etc/exports文件。在該文件中,指出了NFS需要共享的文件。在其余的Linux發行版諸如:SUSE和Red Hat, 還用另一個配置文件:/etc/sysconfig/nfs,該配置文件配置了NFS的線程數及啟動參數等等。
配置NFS Server端
在大多數的linux發行版中,有兩個配置文件需要進行配置。第一個即為/etc/exports。在所有的linux發行版中都有該配置文件。在該文件中用於配置你想在網絡中共享的文件目錄。除此之外,還可能用到/etc/sysconfig/nfs文件,該文件中定義了一系列的參數,定義了NFS Server的服務方式。
在/etc/exports中定義文件共享的方式的結構如下:
目錄 主機(選項)
其中,目錄即是你想共享的文件目錄,例如: /share。
其次,主機定義了允許訪問你開放的共享目錄的主機名,可以通過以下幾種方式定義:
l 主機名,可以是短主機名也可以FQDN名
l 單個的主機IP地址
l 通過名稱標識的某個網段,例如:*.mydomain.com
l 通過IP地址和子網掩碼表示的某個網段,例如:192.168.10.0/255.255.255.0
l 用*號表示的所有網段
配置完允許哪些主機可以訪問NFS Server上的共享目錄後,還需指定這些主機訪問該文件夾時的選項。常用的選項如表一所示:
表一 常用NFS選項
選項 | 含義 |
RO | 故名思義,只讀導出,無論目錄權限如何,用戶只能以只讀權限訪問,任何的寫入均是被禁止的。 |
Rw | 文件系統以可讀寫的方式導出,最終用戶訪問時的權限,由本地目錄的權限決定。 |
Root_squash | 當以root用戶的身份訪問共享目錄時,其用戶ID被映射成65534, 即nobody。 也即意味著你不會有任何的寫權限,並且根據NFS Server端的配置,很可能沒有任何的權限。這是一個默認選項。它確保了當某個終端用戶用root用戶訪問共享目錄時,不會得到root用戶的權限,從而保證了系統的安全性。 |
No_root_squash | 不壓縮root用戶權限。即當用戶以root用戶的身份訪問某個文件夾時,給予其相應的root權限。 |
Sync | 同步寫入磁盤選項,該選項用於保證用戶對文件或目錄所做的修改,在其它用戶訪問前即時生效。雖然使用該選項效率稍低,但由於其可以有效減少文件丟失,推薦使用。 |
舉個例子:
/ ilulissat(rw) kangerlussuaq(rw,no_root_squash)
在本例中,ilulissat主機對共享的根文件系統有讀寫權限,但該主機的root用戶當訪問共享的根文件系統時其並不具有root權限。而kangerlussuaq用戶對共享的根文件系統也享有讀寫權限,並且當從該主機以root用戶訪問該共享根文件系統時,其擁有root權限。
通過exportfs調整導出文件系統
當NFS Server啟動後,其在/var/lib/nfs/xtab文件中保留了一份導出文件目錄,其通過在NFS Server初始化時調用exportfs -a命令實現。通過使用exportfs命令,可以更改NFS Server的文件系統導出列表,而不必編輯/etc/exports文件或者重啟NFS Server。例如:以下命令實現將/srv目錄導出至192.1681.0網段:
exportfs 192.168.1.0/255.255.255.0:/srv
執行上述命令後,導出即刻生效,但重啟NFS Server後會失效。因此,如果需要其永久有效,必須將其包含至/etc/exports文件中。
配置NFS Client
NFS Server端配置好後,就可以開始配置NFS Client端了,有兩種辦法實現掛載NFS系統:
l 手動掛載
l 通過fstab自動掛載
通過mount命令手動掛載
最快的訪問NFS共享目錄的方法就是調用mount命令。僅需指定需掛載的文件系統的類型為nfs,並且指明需要掛載的目錄以及掛載點,就可以快速進行訪問了。下面的例子演示了如下通過本地的/mnt目錄訪問NFS Server上共享的/opt目錄。
mount -t nfs STN:/opt /mnt
需要特別註意是的NFS Server名稱後的冒號,它將NFS Server的名稱和其共享的目錄分割開來。盡管你可以不加任何參數的掛載並訪問NFS Server的共享目錄,但是仍然有一些參數可以使得訪問nfs的共享目錄更加容易一些。常見的選項如表2所示。
表2: 常用的NFS掛載選項
選項 | 含義 |
Soft | 使用該選項,用來告訴mount命令,不要一直不間斷嘗試掛載遠程共享目錄。如果默認超時時間(60s)過後, 仍然掛載不上,就不再嘗試掛載。對那些非關鍵的掛載可以使用該選項。 |
Hard | 使用該選項,用來告訴mount命令,要一直嘗試不間斷掛載遠程共享目錄。需要註意的是如果在系統啟動的時候使用該選項,有可能導致啟動進程停滯。因此,僅在確實需要掛載的目錄下使用該選項。 |
Fg | 該選項為默認選項。用來告訴mount命令所有的mount操作必須在前臺運行。結果就是在掛載過程中在當前終端界面用戶無法進行其它工作。 |
Bg | 該選項用來進行後臺掛載。如果第一次掛載不成功的話,所有的其它的嘗試過載均在後臺進行。 |
Rsize=n | 通過這個選項,用戶可以指定客戶端從服務器端可以一次性讀取的字節數。 由於兼容性的原因,該參數默認為1024字節。NFSV3後的版本可以讀取更多數據。為了提高系統訪問速度,可以將其設置為了一個更大的值,如8192。 |
Wsize=n | 該選項用來設置一次性可以寫入的最大字節數。默認為1024字節。NFSV3後的版本可以處理更多的數據,所以可以指定例如8192字節以提高系統的寫入速度。 |
Retry=n | 這個選項用來指明一次掛載可以等待的最大的分鐘數。默認值是10000(6.94天)。可以考慮將其設置為一個更小的值以避免在不能建立的mount連接上長時間等待。 |
Nosuid | 用這個選項指明SUID及SGID選項不能用於導出文件系統上,這是一個安全選項。 |
Noexec | 使用該選項用來禁止在導出文件系統上執行任何可執行文件 |
通過fstab自動掛載NFS共享目錄
使用mount命令可以快速的掛載NFS共享目錄。但如果需要多次掛載相同的共享目錄,則應該使用/etc/fstab文件。如果你已經了解了如何在/etc/fstab下增加新的條目,則自動掛載就會變得非常簡單。唯一的區別就是必須要指定的完整nfs共享目錄的路徑而不是指定設備名稱,同時,還必須指定相應的掛載選項。當通過/etc/fstab自動掛載時,應該總是指定rsize,wsize及soft選項進行性能優化。可以通過服務器的名字或IP地址指定NFS服務器。舉個例子:
server:/nfsshare /mnt/nfsserver nfs rsize=8192,wsize=8192,soft 1 2
獲取NFS共享目錄導出列表
為了掛載NFS共享目錄,必須首先了解server端提供了哪些導出目錄。可以通過使用命令showmount得出。命令使用非常簡單:showmount -e後跟想要檢查的host的主機名即可。例如:
showmount -e localhost:
[root@localhost /]# showmount -e localhost
Export list for localhost:
/usr/centos_6.4iso 10.1.11.0/24
好了,這就是NFS系統的全部內容,有任何問題歡迎私信我交流,有不對的地方歡迎評論區指正!
Linux之NFS配置