2)、NFS只是一種文件系統,自己沒有傳輸功能,是基於RPC協議實現的,才能達到兩個Linux系統之間的文件目錄共享; linux
3)、NFS爲C/S架構; web
rpc.statd---檢查文件的一致性,須要nfslockd服務
vim
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 |
anon即anonymous(匿名者),前面關於*_squash提到的匿名用戶的uid的設置值,一般爲nobody或者nfsnobody,使用這個參數能夠自行設定這個uid值,這個uid必須存在 於/etc/passwd |
anongid=XXX |
將遠程訪問的全部用戶組都映身爲匿名用戶組帳戶,並指定該匿名用戶組帳戶爲本地用戶組帳戶(GID=XXX) |
insecure |
容許客戶端從大於1024的TCP/IP端口連NFS服務器 |
secure |
限制客戶端只能從小於1024的TCP/IP端口鏈接NFS服務器(默認設置) |
wdelay |
檢查是否有相關的寫操做,若是有則將這些寫操做一塊兒執行,這樣可提升效率(默認設置) |
no_wdelay |
如有寫操做則當即執行(應與sync配置) |
subtree_check |
若輸出目錄是一個子目錄,則NFSW:務器將檢查其父目錄的權限(默認設置) |
no_subtree_check |
即便輸出目錄是一個子目錄,NFS服務器也不檢查其父目錄的權限,這樣作可提升效率 |
/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) |
除了在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文件裏面對應的UID爲40的那個身份的使用者了(由於指定了參數:all_squash,anonuid=40,anongid=40) |
(4)權限問題
NFS服務器(192.168.0.2)上的/etc/exports配置文件設置以下 |
|
例如:咱們在192.168.0.100這個client端登錄此NFS主機(192.168.0.2),那麼會怎麼樣呢? |
|
狀況一: 在192.168.0.100的賬號爲test這個身份,同時NFS主機上也有test這個賬號 |
(1)因爲NFS主機的/tmp權限爲-rwxrwxrwt,因此我(test在192.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指令語法 |
-a |
所有mount或者unmount /etc/exports中內容(即:要被共享出來的目錄) |
-r |
從新讀取/etc/exports文件的設置,並使得設置當即生效,而不須要從新啓動nfs服務 |
|
-u |
中止輸出某一個目錄 |
|
-v |
在輸出目錄時,將詳細的信息輸出到屏幕上 |
|
注意:當修改了/etc/exports配置文件,可使用參數-r從新讀取/etc/exports配置文件,使得設置當即生效,而不須要重啓nfs服務 |
||
exportfs指令例子 |
#exportfs -rv //從新export一次 |
格式:showmount [-ae] hostname(IP) |
|
-a |
顯示指定的NFS服務器的全部客戶端主機及其所鏈接的目錄(通常在NFS Server上使用該參數) |
-e |
顯示指定的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
[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 |
hard和nointr |
rsize |
讀操做的塊大小,這個設置影響服務器和客戶端的nfs緩存大小,若是有充足的內存和網絡帶寬,能夠設置高些,如32768(bytes) |
wsize |
寫操做的塊大小,這個設置影響服務器和客戶端的nfs緩存大小,若是有充足的內存和網絡帶寬,能夠設置高些,如32768(bytes) |
查看幫助文件:man fstab、man -a mount |
二、使用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 fstab、man -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中共享出去的目錄,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT僅僅有最小的權限,最好不要使用root_squash |
第二:使用IPTABLE防火牆限制可以鏈接到NFS SERVER的機器範圍 |
第三:爲了防止可能的Dos攻擊,須要合理設定NFSD 的COPY數目 |
第四:修改/etc/hosts.allow和/etc/hosts.deny達到限制CLIENT的目的 |
第五:改變默認的NFS 端口 |
第六:使用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 |
|
(3)被防火牆攔截 |
從新設置防火牆,包括iptables與TCP_Wrappers,由於激活了portmap,因此port 111必須提供出去.所以在iptables rules中,要增長: 若是還不行,那就是TCP_Wrappers的問題,檢查/etc/hosts.deny,若是有一行是: 若是咱們的NFS針對內部網絡開發,對於外部網絡只對學術網絡開發(140.0.0.0/8),能夠: 還可使用TCP_Wrappers,在/etc/hosts.allow裏面規定連上 NFS 主機的主機 IP 與名稱,例如 |
|
(4)cant contact portmapper: RPC: Remote system error - Connection refused |
出現這個錯誤信息是因爲SEVER端的PORTMAP沒有啓動 |
|
(5)mount clntudp_create: RPC: Program not registered |
NFS沒有啓動起來,能夠用showmout -e host命令來檢查NFS SERVER是否正常啓動起來 |
|
(6)mount: localhost:/home/test failed, reason given by server: Permission denied |
這個提示是當client要mount nfs server時可能出現的提示,意思是說本機沒有權限去mount nfs server上的目錄。解決方法固然是去修改NFS SERVER |