1、前言
簡言之 NFS 就是 Unix-Like 作業系統之間的網路芳鄰,本篇將在 SELinux 安全機制及 IPTables 防火牆開啟的環境下實作,關於 NFS 檔案分享伺服器內容及更詳細設定參數可以參考官方文件 RedHat - Storage Administration Guide - Chapter 12. Network File System (NFS)。文章目錄
1、前言2、實作環境
3、NFS Server 所需要啟動的服務
4、安裝 NFS 檔案分享套件
5、設定 IPTables 防火牆規則
6、修改 NFS 設定檔
7、修改 SELinux 設定值
8、啟動 NFS 服務
9、NFS Client 掛載分享資源
2、實作環境
- OS: CentOS 6.0 (32 bit)
- NFS 套件資訊: rpcbind-0.2.0-8.el6.i686、nfs-utils-1.2.2-7.el6.i686
- NFS 設定檔: /etc/exports、/etc/sysconfig/nfs
- IPTables 防火牆: TCP/UDP 協定 Port 111、2049、40001 ~ 40004
- SELinux 權限: var_lib_nfs_t、domain_kernel_load_modules=1
3、NFS Server 所需要啟動的服務
- rpcbind: NFS Server 用於讓 NFS Client 能正確 「找到」 NFS Server 的服務 Port,以便進一步溝通(舊版 CentOS 5.x 稱之為 Portmap)。
- nfsd: NFS Server 用於「接收」 NFS Client 所傳送過來讀寫檔案資源的需求,再將請求傳遞給 mountd 執行序處理。
- mountd: NFS Server 實際用於 「處理」 NFS Client 對於讀寫檔案資源的動作。
了解 NFS Server 及 NFS Client 所需服務以及開啟 Port 號:
4、安裝 NFS 檔案分享套件
請使用 yum 指令搭配 NFS 套件名稱 rpcbind、nfs-utils 即可進行套件安裝。#yum -y install rpcbind nfs-utils //安裝 NFS 套件(預設已安裝)
#rpm -qa rpcbind nfs-utils //查詢 NFS 套件版本
rpcbind-0.2.0-8.el6.i686
nfs-utils-1.2.2-7.el6.i686
#rpm -ql rpcbind nfs-utils //查詢 NFS 相關檔案路徑
/etc/rc.d/init.d/rpcbind
/sbin/rpcbind
/usr/sbin/rpcinfo
/usr/share/doc/rpcbind-0.2.0
...略...
5、設定 IPTables 防火牆規則
NFS 檔案分享服務屆時啟動時會 TCP/UDP 協定 Port 111、2049、50001 ~ 50004,因此我們必須修改 IPTables 防火牆規則以便等一下進行測試,請修改 IPTables 防火牆規則設定檔 「/etc/sysconfig/iptables」 加上允許相關 Port 號的規則,修改防火牆規則後請使用指令「service iptables restart」來重新啟動防火牆服務,以便防火牆規則套用生效,並且使用「service iptables status」指令來確定目前防火牆規則是否有允許相關 Port 號。#vi /etc/sysconfig/iptables //修改防火牆規則(加入如下六行)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50001:50004 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 50001:50004 -j ACCEPT
#service iptables restart //重新啟動防火牆服務
#service iptables status | grep -E '111|2049|4000' //查看防火牆規則是否套用生效
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:111
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:2049
7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpts:50001:50004
8 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:111
9 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:2049
10 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpts:50001:50004
#chkconfig nfs on //開機自動啟動 NFS 服務
#chkconfig rpcbind on //開機自動啟動 Rpcbind 服務
6、修改 NFS 設定檔
接著修改 NFS 設定檔 「/etc/exports」,設定內容中分享 /home/nfs 資料夾同時僅允許 10.10.25.0/24 網段主機才能存取此分享資源,下列為修改內容:#vi /etc/exports //修改 NFS 設定檔
/home/nfs 10.10.25.0/255.255.255.0(rw,no_root_squash)
在預設情況下 mountd 這個執行序會使用 大於 1024 的隨機 Port 號,但這樣會影響我們 IPTables 防火牆的設定,因此我們修改 NFS 服務設定檔「/etc/sysconfig/nfs」把相關隨機 Port 號設定為固定 Port 號,也就是先前設定的 TCP/UDP 50001 ~ 50004 Port 號。
#vi /etc/sysconfig/nfs //修改 NFS 服務設定檔(加入如下五行)
RQUOTAD_PORT=50001
LOCKD_TCPPORT=50002
LOCKD_UDPPORT=50002
MOUNTD_PORT=50003
STATD_PORT=50004
7、修改 SELinux 設定值
修改 SELinux 安全機制的設定值,因為將 NFS 分享目錄由預設的 「/var/lib/nfs」 修改至 「/home/nfs」,因此新的 /home/nfs 資料夾其 SELinux 安全機制的權限勢必與原來的 /var/lib/nfs 資料夾不同,若不進行修改的話屆時啟動 NFS 服務時便可能會因為 SELinux 權限問題造成無法啟動 NFS 服務的狀況。#ls -dZ /var/lib/nfs /home/nfs
drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/nfs
drwxr-xr-x. root root system_u:object_r:var_lib_nfs_t:s0 /var/lib/nfs
接著透過「semanage fcontext -a -t」指令配合 SELinux 權限「var_lib_nfs_t」,指定「/home/nfs」資料夾設定此權限為「SELinux預設權限」,之後使用「restorecon -Rv」指令把 /home/nfs 相關資料夾還原至剛才設定的 SELinux 預設權限,若執行 semanage 指令發現系統中沒有此一指令請安裝 policycoreutils-python 套件即可(yum -y install policycoreutils-python)。
#semanage fcontext -a -t var_lib_nfs_t "/home/nfs(/.*)?" //設定 SELinux 預設權限
#restorecon -Rv /home/nfs //還原 SELinux 權限
#ls -dZ /var/lib/nfs /home/nfs //查看資料夾 SELinux 權限
drwxr-xr-x. root root system_u:object_r:var_lib_nfs_t:s0 /home/nfs
drwxr-xr-x. root root system_u:object_r:var_lib_nfs_t:s0 /var/lib/nfs
最後則是要將相關的 SELinux 安全機制的布林值打開,將「domain_kernel_load_modules」設定為 1 啟動 NFS 服務才不會發生錯誤。
#setsebool -P domain_kernel_load_modules=1 //開啟 SELinux 安全機制的布林值
#getsebool -a |grep domain_kernel_load_modules //查詢設定是否成功
domain_kernel_load_modules --> on
8、啟動 NFS 服務
完成修改 SELinux 安全機制權限設定後,我們可以放心啟動 NFS 相關服務,請使用指令「service nfs start、service rpcbind start」來啟動 NFS 服務,並且於服務啟動後使用「netstat」指令來查看系統是否開啟了相關 Port 號,以及使用「ps」指令來查看相關執行序是否運作。#service rpcbind start //啟動 rpcbind 服務
#service nfs start //啟動 nfs 服務
#netstat -tunpl |grep -E '111|2049|4000' //查看是否開啟相關 Port 號
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4825/rpcbind
...略...
#ps aux |grep -E 'rpcbind|nfsd|mountd' //查看相關執行序
rpc 4825 0.0 0.0 2516 872 ? Ss 11:52 0:00 rpcbind
root 4868 0.0 0.0 0 0 ? S 11:52 0:00 [nfsd4]
...略...
#rpcinfo -p localhost //查看哪些執行序使用哪些 Port 號
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
...略...
#showmount -e localhost //查看 NFS 分享資源
Export list for localhost:
/home/nfs 10.10.25.0/255.255.255.0
9、NFS Client 掛載分享資源
NFS Client 先使用 showmount 指令確定可以找到 NFS Server 分享資源,之後使用 mount 指令掛載資源至本機的 /mnt 掛載點下,掛載成功後即可進行相關操作。#showmount -e 10.10.25.115 //查看 NFS Server 分享資源
Exports list on 10.10.25.115:
/home/nfs 10.10.25.0/255.255.255.0
#mount 10.10.25.115:/home/nfs /mnt //掛載資源
#df -h | grep mnt
10.10.25.115:/home/nfs 7.4G 2.3G 4.8G 32% /mnt //掛載成功
此時在 NFS Server 可以看到誰正在使用分享資源。
#showmount -a localhost
All mount points on localhost:
10.10.25.245:/home/nfs //此 IP 正掛載分享資源
最後 NFS Client 不使用分享資源時即可使用指令 umount 來卸載 NFS Server 分享資源。
#umount /mnt