当前位置首页 > Ubuntu知识

Ubuntu搭建NFS服务器,NFS协议详细分析

阅读次数:354 次  来源:admin  发布时间:

目录 1. Ubuntu搭建NFS服务器 2. NFS协议分析 2.1 实验拓扑: 2.2 在kali抓包分析 2.2.1 portmap协议 2.2.2 mount协议 2.2.3 NFS 2.2.4 权限 2.2.5 LOOKUP 2.2.6 读取文件操作 1、open 2、open_confirm 3、read 4、结果 5、close 2.2.7 写操作 1、access询问权限 2、确认权限 3、查找文件 4、查找失败 5、创建文件 6、创建成功 返回句柄 7、写入内容 8、写入成功 9、10、关闭文件

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 实验拓扑:

Ubuntu搭建NFS服务器,NFS协议详细分析

fs server为ubuntu:

Ubuntu搭建NFS服务器,NFS协议详细分析

fs client 为kali:

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2 在kali抓包分析

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.1 portmap协议

Ubuntu搭建NFS服务器,NFS协议详细分析

客户端:10.10.10.1 Call

发送连接端口请求,向服务器10.10.10.2询问NFS服务的端口号

服务器:10.10.10.2 Reply

发送回应,告知客户端10.10.10.1NFS服务器的端口号为34381

展开reply如下:

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.2 mount协议

Ubuntu搭建NFS服务器,NFS协议详细分析

客户端:10.10.10.1 Call

向服务器发送连接请求。

服务器:10.10.10.2 Reply

服务器收到连接请求,回应客户端连接成功。

Reply协议展开结果如下:

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.3 NFS

Ubuntu搭建NFS服务器,NFS协议详细分析

客户端:10.10.10.1 Call SETCLIENTID

客户端请求服务器为客户端设置服务ID -> set Client Id

服务器:10.10.10.2 Reply SETCLIENTID

服务器为客户端设置id,并将id和验证返回给客户端

Ubuntu搭建NFS服务器,NFS协议详细分析

SETCLIENTID请求中,服务器为客户端设置了clientid,但是客户端不能马上使用这个clientid,必须先向服务器发起SETCLIENTID_CONFIRM请求,确认接收到了clientid,然后才能使用。

Ubuntu搭建NFS服务器,NFS协议详细分析

客户端:10.10.10.1 Call SETCLIENTID_CONFIRM

客户端将接收到的clientid发送给服务器以确认,包内容如下:

Ubuntu搭建NFS服务器,NFS协议详细分析

服务器:10.10.10.2 Reply SETCLIENTID_CONFIRM

服务器接收到确认请求后客户端即可使用此client id

Ubuntu搭建NFS服务器,NFS协议详细分析

需要说明的一点是,客户端发起SETCLIENTID_CONFIRM请求的同时还发起了GETATTR请求,这个请求的作用是获取clientid的过期时间,过期后就不能使用这个clientid了

Ubuntu搭建NFS服务器,NFS协议详细分析

PUTROOTFH 设置文件系统根节点的文件句柄 由于GETATTR中需要使用文件句柄,因此先设置为根节点的文件句柄

Ubuntu搭建NFS服务器,NFS协议详细分析

客户端:10.10.10.1 Call PUTROOTFH | GETATTR

客户端发送获得系统根节点句柄的请求

服务器:10.10.10.2 Reply PUTROOTFH | GETATTR

服务器收到请求后核对clientid信息,正确后将根节点的文件句柄回复给客户端,客户端以后就可以使用这个句柄来访问当前目录。

Ubuntu搭建NFS服务器,NFS协议详细分析

这样,客户端就成功与服务器建立连接,然后客户端可以使用获得的句柄对服务器上的文件进行各种操作

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.4 权限

客户端:10.10.10.1 Call

客户端向服务器发出查询自己权限的请求 read 、lookup 、modify、extend、delete

Ubuntu搭建NFS服务器,NFS协议详细分析

服务器:10.10.10.2 Reply

服务器回应:允许read和lookup,拒绝modify、extend、delete

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.5 LOOKUP

客户端:10.10.10.1 Call

客户端发出查询home目录的请求,并请求获得home目录的句柄

Ubuntu搭建NFS服务器,NFS协议详细分析

服务器找到home目录,并将对home目录操作的句柄返回给客户端

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.6 读取文件操作

Ubuntu搭建NFS服务器,NFS协议详细分析

1、首先客户端发送请求,请求打开test.txt文件

2、服务器回应请求,并返回test.txt文件的句柄

3、客户端将收到的句柄发送给服务器进行确认 OPNE_CONFIRM

4、服务器收到确认信息并验证通过后,客户端就可以使用此句柄对文件进行操作

5、客户端发出READ请求,对象是test.txt文件

6、服务器收到请求,执行READ操作,并将读取的内容返回给客户端

7、客户端发出关闭文件的请求,对象是test.txt

8、服务器收到请求后将文件关闭。

1、ope

Ubuntu搭建NFS服务器,NFS协议详细分析

2、open_confirm

Ubuntu搭建NFS服务器,NFS协议详细分析

Ubuntu搭建NFS服务器,NFS协议详细分析

3、read

Ubuntu搭建NFS服务器,NFS协议详细分析

4、结果

Ubuntu搭建NFS服务器,NFS协议详细分析

5、close

Ubuntu搭建NFS服务器,NFS协议详细分析

Ubuntu搭建NFS服务器,NFS协议详细分析

2.2.7 写操作

Ubuntu搭建NFS服务器,NFS协议详细分析

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询问权限

Ubuntu搭建NFS服务器,NFS协议详细分析

2、确认权限

Ubuntu搭建NFS服务器,NFS协议详细分析

3、查找文件

Ubuntu搭建NFS服务器,NFS协议详细分析

4、查找失败

Ubuntu搭建NFS服务器,NFS协议详细分析

5、创建文件

Ubuntu搭建NFS服务器,NFS协议详细分析

6、创建成功 返回句柄

Ubuntu搭建NFS服务器,NFS协议详细分析

7、写入内容

Ubuntu搭建NFS服务器,NFS协议详细分析

8、写入成功

Ubuntu搭建NFS服务器,NFS协议详细分析

9、10、关闭文件

Ubuntu搭建NFS服务器,NFS协议详细分析

实验所用NFS数据包:

https://files.cnblogs.com/files/0x4D75/NFS.7z

上一篇:Linux内存泄漏
下一篇:Debian3.1(Sarge)正式发布,Knoppix也升级到最后一个单CD版3.9