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
Ubuntu搭建NFS服务器,NFS协议详细分析的更多相关文章
- Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...
- Git版本控制之ubuntu搭建Git服务器
Git是一个开源的分布式版本控制系统,可以有效.高效的处理从很小到非常大的项目版本管理.使得开发者可以通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库,也可以将代码提交到Git服务 ...
- ubuntu搭建svn服务器并htpp访问版本库并svn与web同步
Ubuntu搭建SVN服务器多版本库 1 介绍 Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 ...
- Ubuntu搭建Anki服务器
Ubuntu搭建Anki服务器 第一步安装Anki 阿里云的服务器,xshell远程登录上 #以root用户进行操作 #安装Akni服务 easy_install AnkiServer #添加名为an ...
- Ubuntu 搭建 LAMP 服务器
/******************************************************************** * Ubuntu 搭建 LAMP 服务器 * 说明: * 想 ...
- ubuntu下查看服务器的CPU详细情况
https://www.cnblogs.com/liuq/p/5623565.html 全面了解 Linux 服务器 - 1. 查看 Linux 服务器的 CPU 详细情况 ubuntu下查看服务器的 ...
- Ubuntu搭建Gitlab服务器
想到Gitlab就必定会想到SVN,因为两者都是代码管理系统,作为开发人员来说,用习惯了SVN的图形化界面和SVN代码更新和提交的方式, 可能就会觉得使用git会比较麻烦,其实不然git使用起来非常方 ...
- Ubuntu搭建NTP服务器
NTP简介 NTP是Network Time Protocol的缩写,又称为网络时间协议.是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提 ...
- [Ubuntu] Ubuntu搭建VPN服务器pptpd
在 Ubuntu 上搭建 VPN 服务器的方法非常多,比较著名的有 PPTP, L2TP/IPSec 和 OpenVPN. 这三种方式中后两者的安全性比较好,但配置较麻烦.其中 OpenVPN 在 W ...
随机推荐
- sql server 索引阐述系列六 碎片查看与解决方案
一 . dm_db_index_physical_stats 重要字段说明 1.1 内部碎片:是avg_page_space_used_in_percent字段.是指页的填充度,为了使磁盘使用状况达到 ...
- 手写spring(简易版)
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作,如有错误之处忘不吝批评指正! 理解Spring本质: 相信之前在使用spring的时候大家都配置web.x ...
- iOS逆向开发(3):锁定APP的目标类与函数 | reveal | lldb | debugserver | 远程调试
之前介绍了怎么获取APP的所有类的结构信息,这个有什么用呢?用处大了,比如以这一步为基础,下一步通过注入来做更多研究工作. 注入的最小单位是函数,实际上,编译执行的程序在编译后,类就不复存在了,留下来 ...
- Dockerfile 中的 multi-stage(多阶段构建)
在应用了容器技术的软件开发过程中,控制容器镜像的大小可是一件费时费力的事情.如果我们构建的镜像既是编译软件的环境,又是软件最终的运行环境,这是很难控制镜像大小的.所以常见的配置模式为:分别为软件的编译 ...
- 第2章 细说Linux系统用户/组管理(1)
2.1 用户和组的基本概念 用户和组是操作系统中一种身份认证资源. 每个用户都有用户名.用户的唯一编号uid(user id).所属组及其默认的shell,可能还有密码.家目录.附属组.注释信息等. ...
- 基于SpringMVC+Spring+MyBatis实现秒杀系统【概况】
前言 本教程使用SpringMVC+Spring+MyBatis+MySQL实现一个秒杀系统.教程素材来自慕课网视频教程[https://www.imooc.com/learn/631].有感兴趣的可 ...
- zepto 事件分析1($.Event)
先看一下zepto事件的函数,在这里,zepto是把zepto对象作为一个立即执行函数的参数传进去的. (function($){ ... ... })(Zepto) 在zepto事件函数中,主要为$ ...
- c#中的特性Attribute
一:特性是什么?特性怎么创建怎么使用? 这一章节,我想谈谈c#的特性方面的知识,特性大家在工作开发中都很熟悉,比如我们经常见到的 1:key Display --EF 2:Import 3:HttpG ...
- C#计算字符串长度,汉字算两个字符
在C#中的字符串类String中,有个Length属性表示字符串的长度,但该字段返回的是字符的个数,如果字符串中含有中文字符的话,一个汉字占用两个字符的长度,此时获取的长度就不够精确,当然也看具体业务 ...
- python之strip()小记
描述 Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法 strip()方法语法: ...