Wireshark网络分析就这么简单——NFS

Wireshark网络分析就这么简单——NFS

本文引用部分为从原书中摘抄或者整理改写的部分

在正式阅读之前———NFS解释

什么是NFS

NFS(Network File System)顾名思义,就是网络文件系统,最大的功能就是可以通过网络,在不同的机器,不同的操作系统共享彼此的文件。

在使用上,可以将远程服务器上的目录挂载到客户端的文件系统中,在使用上像一个本地磁盘,非常方便。

挂载原理

可以用一张图比较直白的说明

服务器挂载示意图

客户端连接NFS中间发生了什么?

  1. 客户端向服务器的portmap(RPC服务)进程询问端口号,portmap维护一张进程与端口号的对应关系表,而portmap的端口号111是已知的(NFS的端口号默认为2049,所以其实这部有时候可以跳过portmap直接连接NFS)
  2. 客户端尝试连接NFS进程判断是否能够成功连接(没有被防火墙拦截,确保NFS服务已经启动)
  3. 客户端再次询问portmap,询问mount进程的端口号(mount进程端口号比较随机,所以改步询问不能跳过)
  4. 客户端尝试连接mount进程判断是否能够成功连接(没有被防火墙拦截,确保mount进程已经启动)
  5. 挂载目录。挂载成功后,服务器将该目录的file handle告诉客户端
  6. 再次测试NFS进程(这一步是否有必要?从询问mount到挂载目录NFS是否有挂掉的可能?)
  7. 客户端获得了该文件系统的大小和使用率等属性

NFS的安全机制

访问控制

  • 通过IP地址实现,哪些IP允许读写,哪些IP允许读,哪些IP不允许挂载。

用户权限

  • NFS只认UID不认用户名,由于用户名与UID的对应关系是由/etc/passwd来决定的,所以如果passwd不对应会造成用户名及owner显示不同的情况出现。

NFS读写过程

NFS读过程

  1. 客户端校验是否能进入某目录,服务器同意请求
  2. 客户端请求获取文件以及File Handle,服务器返回客户端需要的信息(NFS操作文件用的是file handle)
  3. 客户端请求服务器获取目标文件属性
  4. 客户端请求打开打开文件,重复发起多个READ Call(等上一个READ Call收到回复后发送),直到读完整个文件。
    在高性能环境下需要手动指定每次READ Call发送的数据大小
    mount -o rsize=num server:path

NFS写过程

  1. 客户端校验是否能进入某目录,服务器同意请求
  2. 校验文件是否存在,如果存在会询问是否覆盖源文件
  3. 客户端请求创建文件,服务器创建完返回file Handle
  4. 开始多次写入
    async写入时,在WRITE Call之后就会回复WRITE Reply,实际上存盘操作未完成,只有在commit操作时才会有
    sync写入,WRITE Call与WRITE Replay交替出现,必须等到WRITE Call收到Replay之后才会发送下一个
    wsize限制发送的长度
  5. commit操作,询问服务器是否已经保存
  6. 客户端申请查看文件属性

noac参数

使用noac参数发现了明显的性能下降问题,在RFC中有说明,noac让客户端不缓存文件属性,并没有进一步的说明。经过抓包可以分析出原因。

  • 写性能
    • noac把写操作强制变成了sync方式,所以导致性能下降。
  • 读性能
    • 开启noac后,客户端平凡通过GETATTR查询文件属性,所以读性能也受到了影响。