1. Ubuntu搭建NFS服务器

​ NFS(Network FileSystem,网络文件系统 ),是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样 。

NFS服务器所共享文件或目录记录在/etc/exports文件中。

** 安装NFS **

  1. mkdir /home/mu/nfs # 新建目录, 目录随意起名字,此处为nfs, 此目录为nfs共享目录
  2. sudo apt install nfs-kernel-server # 安装nfs服务
  3. sudo echo "/home/mu/nfs *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports # 编辑权限
  4. # /home/mu/nfs :nfs客户端加载目录
  5. # * :允许所有的网段访问,也可以使用具体的IP
  6. # rw :挂接此目录的客户端对该共享目录具有读写权限
  7. # sync :资料同步写入内存和硬盘
  8. # no_root_squash :root用户具有对根目录的完全管理访问权限。
  9. # no_subtree_check :不检查父目录的权限。
  10. # Tips: *和后面的括号之间无空格
  11. sudo service portmap start # 重启portmap
  12. sudo /etc/init.d/rpcbind restart # 重启rpcbind 服务
  13. sudo /etc/init.d/nfs-kernel-server restart # 重启nfs服务
  14. sudo /etc/init.d/nfs-kernel-server status # 测试nfs服务是否成功
  15. # 在客户端挂载服务,如此客户端/mnt目录下的内容就是共享目录nfs下的内容
  16. sudo mount -t nfs ip:/home/mu/nfs /mnt # ip为nfs server的IP
  17. umount /mnt/ # 取消挂载
  18. ls /mnt # 查看结果
  19. # 结果 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

Ubuntu搭建NFS服务器,NFS协议详细分析的更多相关文章

  1. Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程

    Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...

  2. Git版本控制之ubuntu搭建Git服务器

    Git是一个开源的分布式版本控制系统,可以有效.高效的处理从很小到非常大的项目版本管理.使得开发者可以通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库,也可以将代码提交到Git服务 ...

  3. ubuntu搭建svn服务器并htpp访问版本库并svn与web同步

    Ubuntu搭建SVN服务器多版本库 1  介绍   Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 ...

  4. Ubuntu搭建Anki服务器

    Ubuntu搭建Anki服务器 第一步安装Anki 阿里云的服务器,xshell远程登录上 #以root用户进行操作 #安装Akni服务 easy_install AnkiServer #添加名为an ...

  5. Ubuntu 搭建 LAMP 服务器

    /******************************************************************** * Ubuntu 搭建 LAMP 服务器 * 说明: * 想 ...

  6. ubuntu下查看服务器的CPU详细情况

    https://www.cnblogs.com/liuq/p/5623565.html 全面了解 Linux 服务器 - 1. 查看 Linux 服务器的 CPU 详细情况 ubuntu下查看服务器的 ...

  7. Ubuntu搭建Gitlab服务器

    想到Gitlab就必定会想到SVN,因为两者都是代码管理系统,作为开发人员来说,用习惯了SVN的图形化界面和SVN代码更新和提交的方式, 可能就会觉得使用git会比较麻烦,其实不然git使用起来非常方 ...

  8. Ubuntu搭建NTP服务器

    NTP简介 NTP是Network Time Protocol的缩写,又称为网络时间协议.是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提 ...

  9. [Ubuntu] Ubuntu搭建VPN服务器pptpd

    在 Ubuntu 上搭建 VPN 服务器的方法非常多,比较著名的有 PPTP, L2TP/IPSec 和 OpenVPN. 这三种方式中后两者的安全性比较好,但配置较麻烦.其中 OpenVPN 在 W ...

随机推荐

  1. 五分钟轻松了解Hbase面向列的存储

    说明:从严格的列式存储的定义来看,Hbase并不属于列式存储,有人称它为面向列的存储,请各位看官注意这一点. 行式存储 传统的数据库是关系型的,且是按行来存储的.如下图: 其中只有张三把一行数据填满了 ...

  2. (转)解决 TortoiseGit 诡异的 Bad file number 问题

    此问题,请不要使用 rebase, 下载最新的 TortoiseGit 即可: TortoiseGit-2.3中文版与Git安装包_手册: http://download.csdn.net/detai ...

  3. NET Core微服务之路:弹性和瞬态故障处理库Polly的介绍

    前言 上一节中我们介绍了Ocelot的常见使用配置,通过json配置文件,实现API网关的请求处理.和一个使用DownStream扩展下游中间件,来实现Http转RPC的简单实现,功能不算强大,但可以 ...

  4. OJ:又一道考察多态的题目

    Description 下面的程序输出结果是: A::Fun A::Do A::Fun C::Do 请填空: 程序代码如下 #include <iostream> using namesp ...

  5. UVC 驱动调用过程与驱动框架的简单分析

    内核:Linux-3.4.2 驱动:drivers\media\video\uvc\uvc_driver.c UVC 驱动整体调用流程: /* 打开设备描述符 */ 1. open: uvc_v4l2 ...

  6. 业务开发(六)—— MyBatis框架

    0x01.元素内容必须由格式正确的字符数据或标记组成. Caused by: org.apache.ibatis.builder.BuilderException: Error creating do ...

  7. 【转载】 C#工具类:使用iTextSharp操作PDF文档

    iTextSharp是一个用于操作PDF文件的组件DLL程序,在C#程序中可以引用iTextSharp组件,用于开发与PDF文件相关的报表等功能,利用iTextSharp组件提供出来的方法接口,我们可 ...

  8. .Net 登陆的时候添加验证码

    一.ASPX 登陆界面验证码 1.登陆验证码图片和输入验证码框 <asp:TextBox ID="txtValiCode" runat="server" ...

  9. VB.NET 使用ADODB連接資料庫滙出到EXCEL

    '導入命名空間 Imports ADODB Imports Microsoft.Office.Interop Private Sub A1() Dim Sql As StringDim Cnn As ...

  10. mysqlslap 压力测试使用总结

    今天从运维同事那听说了mysql压力测试工具mysqlslap.经了解其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开 ...