linux中的nfs权限,Linux中的NFS协议解析

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

实验步骤

步骤1:下载实验文件

请访问http://file.ichunqiu.com/686f863d下载实验文件。

步骤2:学习NFS协议的挂载

这里我们结合着Wireshark来分析一下NFS协议数据,来学习一下它的挂载过程、安全机制以及读写过程,以直观的方式进行学习。首先分析一下协议的挂载,实验文件Lab18-1.pcap就是在执行挂载命令(mount)时所捕获的数据包:

d8efcd9362361dc4fddbb1659bdf5d88.png

上图中,IP地址为10.32.106.159是客户端,10.32.106.62则为服务器端,我们逐条分析一下每个数据包:

1:客户端想连接服务器的NFS进程,于是询问应该使用哪个端口(GETPORT)。在这里我们可以看到“Reply In 2”,说明2号数据包就是对于这个数据包的回应。

2:服务器回应说,NFS端口是2049。那么这里的“Call In 1”说明本数据包是对于1号数据包询问的回应。

3:客户端尝试连接服务器的NFS进程。并且还可以判断2049端口是否被防火墙拦截,以及NFS服务是否已经启动。

4:服务器回应,收到请求,可以连接上。

5:客户端想连接服务器的挂载(mount)服务,询问该服务的端口。由于mount服务的端口号是比较随机的,因此客户端必须要进行询问。

6:服务器回应自己的mount服务端口为1234。

7:客户端尝试连接mount进程。同理,也可以判断1234号端口是否被防火墙所拦截,还有mount进程是否已经成功启动。

8:服务器回应收到请求,可以连接。

9:客户端提出要求,请求挂载(MNT)“/code”这个共享目录。NFS主要提供了/code以及/document两个共享目录,分别被挂载到多台客户端的本地目录上。当用户在这些本地目录进行文件的读写时,实际上是在NFS的服务器上进行的。

10:服务器同意了客户端的请求。通过查看Packet Details面板可以知道,服务器要求客户端使用file handle 0x75a18429进行目录的访问。

11:客户端尝试客户端的NFS进程是否能连接上。

12:服务器回应可以连接。其实这两步完全没有必要,因为NFS一直处于连接的状态。这个问题估计和我们之前讨论的Windows中FTP的主动和被动模式一样,是开发人员的疏忽造成的。如果他们当时能够熟练使用Wireshark进行测试,相信不会出现这样的问题。

13:客户端要求查看文件句柄为0x75a18429的文件的属性。

14:服务器为客户端提供了该文件系统的大小和空间使用率等属性,之后就可以在客户端看到这些信息了。

15:客户端要求查看文件句柄为0x75a18429的文件的属性。

16:服务器为客户端提供该文件的属性。那么很明显,这两步也是多余的操作,估计原因同上。

这里需要说明的是,为了便于大家的理解与观察,这个捕获文件中只保留了关键步骤,而删去了关系不太大的数据包。大家如果分析真实的场景,所捕获到的数据包会比这复杂很多,但是原理是一致的。

利用Wireshark就可以很清晰地看到,如果portmap请求没有得到回复,这就说明很可能是防火墙对相关端口进行了拦截;如果发现mount请求被服务器拒绝了,那么可以考虑检查一下共享目录的访问设置。

步骤3:了解NFS的安全机制

NFS的安全机制主要包括对客户端的访问控制以及对用户的权限控制。NFS对客户端的访问控制是通过IP地址实现的。创建关键共享目录时可以指定哪些IP允许读写,哪些IP只允许读操作,还有哪些IP不给予任何权限。这方面的配置虽然并不复杂,但是一旦出现问题,却难以排查,当然如果借助于Wireshark,问题往往能够很快迎刃而解。

NFS的用户权限往往会使人困惑。有这样一个例子,一个客户端上的用户admin在/code目录里面新建了一个名为abc.txt的文件,该文件的owner正常显示为admin。但是在另一台客户端上查看该文件时,owner却变成了nasadmin。那么这里我们可以借助于Wireshark来分析一下实验文件Lab18-2.pcap,它展示了用户admin在创建abc.txt时的数据包:

a01f2912c293076605e36ed04bc162b8.png

我们关注一下第4个数据包。从上图中的Credentials中可以看到,用户在创建文件时并没有使用admin这个用户名,而是使用了admin的UID 501来代表自己的身份。而NFS协议是只认UID不认用户名的。当admin通过客户端创建了一个文件,那么UID 501就会被写到文件里面,成为了owner的信息。而当另一个客户端上的用户查看该文件的属性时,看到的就是UID 501。但是不同的客户端上UID值与其所对应的名称往往是不一致的。因此创建文件的客户端的UID 501表示的就是admin,但是换了客户端,UID就对应着nasadmin了。那么为了防止这样的问题,需要大家在实际的操作中,保证每个客户端的UID与用户名的映射是一致的。

步骤4:了解NFS的读文件过程

这里我们研究一下NFS协议读取文件abc.txt的过程,结合实验文件Lab18-3.pcap进行分析:

f988db83082eb34fab9acd1a9d1efefd.png

由于捕获文件中包含有很多关于数据传输的数据包,而那些数据包并不是我们关注的重点,所以我们可以利用筛选器,只保留NFS数据包。我们逐条分析一下每个数据包:

1:客户端向服务器询问,是否可以进入(ACCESS)FH为0x75a18429,也就是/code里面。

2:服务器回应说允许进入。

3:客户端想要查看这个目录里面的文件和文件的句柄。

4:服务器回应了客户端索要的信息,此时可以展开Packet Details来查看文件信息:

091c04aca6d63de316b59d62352c1da9.png

可见abc.txt的file handle为0x056560e1。

5:客户端询问file handle为0x056560e1的文件属性是什么。

6:服务器回应了该文件的权限、UID、GID以及文件的大小等信息。

7:客户端询问是否可以打开file handle为0x056560e1的文件。

8:服务器同意了请求,并给予了相应的权限。

9:从0x056560e1的偏移量为0的位置,也就是abc.txt文件的开头位置,读取(READ)131072字节的数据。

10:从0x056560e1的偏移量为131072的位置,再读取131072字节的数据。

148:服务器回应客户端,允许读取131072字节的数据。

288:同上。

这样,NFS就完成了文件的读操作。

步骤5:了解NFS的写文件操作

这里我们通过实验文件Lab18-4.cap来分析一下,将名为abc.txt的文件写入NFS共享文件夹的过程。首先依旧加入筛选条件nfs:

a5a21d513fa9ca876b0e2f00f00d4178.png

1:客户端向服务器发出请求,要求进入0x75a18429,也就是/code目录。

2:服务器接受请求。

4:客户端询问服务器,查找(LOOKUP)名为abc.txt的文件。因为在创建一个文件之前,需要首先检查一下是否有同名文件的存在。如果不存在同名文件,才能够继续写入,否则要询问用户是否覆盖原文件。

5:服务器回应没有这个文件。

6:客户端要求创建(CREATE)一个名为abc.txt的文件。

7:服务器答应了请求。此时在Packet Details面板中展开NFS区段,就可以找到文件的file handle为0x056560e1。

69:客户端要求从0x056560e1的偏移为0的位置,也就是abc.txt文件的开头,写入(WRITE)131072个字节。

104:服务器回应已经写完了。

130:客户端要求从0x056560e1的偏移为131072的位置,也就是abc.txt文件的开头,写入(WRITE)131072个字节。那么接下来的两个数据包也是这个道理。

302:服务器回复已经写入。下面两个数据包同理。

306:客户端询问,刚才所写的数据是否已经存盘,也就是COMMIT操作,只有经过COMMIT过的数据才算是真正的写好了。

307:服务器回应都保存好了。

308:客户端要求查看刚才所写入的文件的属性(GETATTR)。

309:服务器将文件的权限、UID、GID以及文件的大小等信息交给客户端。

由这个例子可以发现,写操作是多个WRITE Call连续发送过去的。其实我们刚才的读文件的操作也是如此。同时将多个请求一起发出,接下来等待回应的这种方法,比发一条回复一条,发一条回复一条的方式要更加有效率。特别是在高带宽高延迟的情况下,NFS的这种读写特性的优势就会非常的明显。对于写操作而言,如果我们在挂载的时候没有指定任何参数,那么就会采用默认的async(异步)写的方式。而与之相对应的是sync(同步)方式。如果在挂载时指定了sync参数,那么客户端就会先发送一个WRITE Call,等到收到Reply之后再发送下一个请求,也就是说,请求和回应是交替出现的。对于我们这个捕获文件而言,由于采用的是默认挂载方式,所以数据包的WRITE操作会有一个UNSTABLE,表示的是异步的方式。如果是同步方式,则会出现FILE_SYNC的标志。

所以,假设我们在实际的网络中,NFS的读写性能有问题,那么可以通过抓包看一看,是不是开启了同步的模式,或者有其它多余的操作。

第1题:以下哪个操作系统一般并不使用NFS协议?

Ubuntu

Windows

Debian

RedHat

B

第2题:在NFS的写文件操作中,需要利用()操作来确定是否存盘。

GETPORT

ACCESS

WRITE

COMMIT

D

第3题:在NFS的写文件操作中,第一步是要使用()。

LOOKUP

CREATE

GETATTR

COMMIT

B

第4题:对于NFS写操作而言,如果我们在()的时候没有指定任何参数,那么就会采用默认的async写的方式。

写操作

1、在NTF协议中,用什么标识来确认用户()UID

GID

Name

A

2、在NFS协议中,MOUNT请求无回复,可能是共享目录访问控制权限导致对

A

3、在NFS协议中,Portmap请求无回复,可能是防火墙导致对

A

4、在NFS的写文件操作协议中,查看文件是否存在使用什么标识头()LOOKUP

CREATE

GETATTR

COMMIT

A

5、在NFS的写文件操作中,需要利用什么操作来确定是否存盘()GETPORT

ACCESS

WRITE

COMMIT

D

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值