Ubuntu搭建NFS服務器,NFS協議詳細分析


1. Ubuntu搭建NFS服務器

​ NFS(Network FileSystem,網絡文件系統 ),是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣 。

NFS服務器所共享文件或目錄記錄在/etc/exports文件中。

** 安裝NFS **

 mkdir /home/mu/nfs      # 新建目錄, 目錄隨意起名字,此處為nfs, 此目錄為nfs共享目錄
 
 sudo apt install nfs-kernel-server # 安裝nfs服務
 
 sudo echo "/home/mu/nfs *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports  # 編輯權限
 
    # /home/mu/nfs    :nfs客戶端加載目錄
    # *                    :允許所有的網段訪問,也可以使用具體的IP
    # rw                   :掛接此目錄的客戶端對該共享目錄具有讀寫權限
    # sync                 :資料同步寫入內存和硬盤
    # no_root_squash       :root用戶具有對根目錄的完全管理訪問權限。
    # no_subtree_check     :不檢查父目錄的權限。
    # Tips: *和后面的括號之間無空格


 sudo service portmap start  # 重啟portmap
 sudo /etc/init.d/rpcbind restart  # 重啟rpcbind 服務
 sudo /etc/init.d/nfs-kernel-server restart  # 重啟nfs服務
 
 
 sudo /etc/init.d/nfs-kernel-server status  # 測試nfs服務是否成功


# 在客戶端掛載服務,如此客戶端/mnt目錄下的內容就是共享目錄nfs下的內容
 sudo mount -t nfs ip:/home/mu/nfs /mnt  # ip為nfs server的IP
 
 
 umount /mnt/  # 取消掛載
 
 
 ls /mnt  # 查看結果
 # 結果 bin  dev  etc  home  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr 

​ 如果在使用中需要增加新的NFS共享目錄,直接修改/etc/exports文件即可。修改該文件后,可以不用重啟NFS服務,用exportfs命令讀取/etc/exports文件,重新共享輸出。exportfs -ra

2. NFS協議分析

2.1 實驗拓撲:

nfs server為ubuntu:

nfs client 為kali:

2.2 在kali抓包分析

2.2.1 portmap協議

客戶端:10.10.10.1 Call
發送連接端口請求,向服務器10.10.10.2詢問NFS服務的端口號
服務器:10.10.10.2 Reply
發送回應,告知客戶端10.10.10.1NFS服務器的端口號為34381

展開reply如下:

2.2.2 mount協議

客戶端:10.10.10.1 Call
向服務器發送連接請求。
服務器:10.10.10.2 Reply
服務器收到連接請求,回應客戶端連接成功。
Reply協議展開結果如下:

2.2.3 NFS

客戶端:10.10.10.1 Call SETCLIENTID
客戶端請求服務器為客戶端設置服務ID -> set Client Id
服務器:10.10.10.2 Reply SETCLIENTID
服務器為客戶端設置id,並將id和驗證返回給客戶端

SETCLIENTID請求中,服務器為客戶端設置了clientid,但是客戶端不能馬上使用這個clientid,必須先向服務器發起SETCLIENTID_CONFIRM請求,確認接收到了clientid,然后才能使用。

客戶端:10.10.10.1 Call SETCLIENTID_CONFIRM
客戶端將接收到的clientid發送給服務器以確認,包內容如下:

服務器:10.10.10.2 Reply SETCLIENTID_CONFIRM
服務器接收到確認請求后客戶端即可使用此client id

需要說明的一點是,客戶端發起SETCLIENTID_CONFIRM請求的同時還發起了GETATTR請求,這個請求的作用是獲取clientid的過期時間,過期后就不能使用這個clientid了

PUTROOTFH   設置文件系統根節點的文件句柄  由於GETATTR中需要使用文件句柄,因此先設置為根節點的文件句柄

客戶端:10.10.10.1 Call PUTROOTFH | GETATTR
客戶端發送獲得系統根節點句柄的請求
服務器:10.10.10.2 Reply PUTROOTFH | GETATTR
服務器收到請求后核對clientid信息,正確后將根節點的文件句柄回復給客戶端,客戶端以后就可以使用這個句柄來訪問當前目錄。

這樣,客戶端就成功與服務器建立連接,然后客戶端可以使用獲得的句柄對服務器上的文件進行各種操作

2.2.4 權限

客戶端:10.10.10.1 Call
客戶端向服務器發出查詢自己權限的請求 read 、lookup 、modify、extend、delete

服務器:10.10.10.2 Reply
服務器回應:允許read和lookup,拒絕modify、extend、delete

2.2.5 LOOKUP

客戶端:10.10.10.1 Call
客戶端發出查詢home目錄的請求,並請求獲得home目錄的句柄

服務器找到home目錄,並將對home目錄操作的句柄返回給客戶端

2.2.6 讀取文件操作

1、首先客戶端發送請求,請求打開test.txt文件
2、服務器回應請求,並返回test.txt文件的句柄
3、客戶端將收到的句柄發送給服務器進行確認 OPNE_CONFIRM
4、服務器收到確認信息並驗證通過后,客戶端就可以使用此句柄對文件進行操作
5、客戶端發出READ請求,對象是test.txt文件
6、服務器收到請求,執行READ操作,並將讀取的內容返回給客戶端
7、客戶端發出關閉文件的請求,對象是test.txt
8、服務器收到請求后將文件關閉。

1、open

2、open_confirm

3、read

4、結果

5、close

2.2.7 寫操作

1、客戶端向服務器查詢自己的權限,RD、LU、MD、XT、DL
2、服務器收到請求,返回allowed的權限 RD、LU、MD、XT、DL
3、客戶端請求服務器查找write.txt 文件,要求返回其句柄
4、服務器回應查找失敗,沒有此文件,並創建此文件,返回給客戶端此文件句柄
5、客戶端利用句柄請求打開此文件
6、服務器回應打開狀態,返回操作的新的句柄
7、客戶端利用句柄在write文件寫入信息
8、服務器回應寫入成功
9、客戶端請求關閉此文件
10、服務器回應已經關閉

1、access詢問權限

2、確認權限

3、查找文件

4、查找失敗

5、創建文件

6、創建成功 返回句柄

7、寫入內容

8、寫入成功

9、10、關閉文件

實驗所用NFS數據包:
https://files.cnblogs.com/files/0x4D75/NFS.7z


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM