一、概要
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。NFS是一个使用RPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS本身没有提供信息传输的协议和功能,但NFS却能让我们通过网络进行资料的分享,就是因为NFS使用了RPC提供的传输协议,可以说NFS就是使用PRC的一个程序。NFS依赖于RPC协议。所谓RPC远程过程调用(Remote Procedure Call),是使客户端能够执行其他系统中程序的一种机制。NFS服务器在端口UDP2049接收作为UDP数据包的客户端请求,NFS服务本身不提供文件传输功能,我们要远程使用NFS文件系统就需要RPC服务的支持;而portmap服务用来为RPC服务进行动态端口分配和映射,所以portmap服务也是NFS服务所必须的。可以把NFS服务看作RPC服务的一种,开启NFS服务其实就是在开启RPC服务,PortMap 服务是用于 RPC 服务(如 NIS (network information service)和 NFS)的动态端口分配守护进程。安装NFS服务时所需要的两个软件包nfs-utils
和portmap
:Nfs-utils软件包提供了rpc.nfsd和rpc.mountd两个RPC的daemon(守护进程)程序,而portmap软件包提供了portmap程序。RHEL6.5以NFSv3作为默认版本,NFSv3使用TCP、UDP协议(端口号是2049),默认是UDP; RHEL7以NFSv4作为默认版本,NFSv4使用TCP协议(端口号是2049)和NFS服务器建立连接。NFS协议到现在经历了V1,V2,V3,V4版本,NFSv2和NFSv3都是无状态协议,NFSv4有状态了,NFS协议没有用户认证机制,而且数据在网络上传送的时候是明文传送,所以安全性极差,故一般只能在局域网中使用;但 NFSv4增加了安全性,支持RPCSEC-GSS身份认证。
目前NFS已具备了防止被利用导出文件夹的功能,但遗留系统中的NFS服务配置不当,则仍可遭到恶意攻击者的利用。
关联资源:rfc7862-NFSv4.2、nfs 所有的版本对比、NFS版本介绍、rfc3530-NFSv4、NFS文档、rfc7530-NFSv4、rfc5661-NFSv4.1
二、安装
rpm -qa |grep nfs //检查系统是否已经安装
nfs4-acl-tools-0.3.3-13.el7.x86_64
nfs-utils-1.3.0-0.48.el7_4.x86_64 //必要安装
libnfsidmap-0.25-9.el7.x86_64
rpm -qa |grep rpc //
xmlrpc-c-1.32.5-1905.svn2451.el7.x86_64
xmlrpc-c-client-1.32.5-1905.svn2451.el7.x86_64
libtirpc-0.2.4-0.10.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64 //必要安装
yum install rpcbind nfs-utils.x86_64 nfs4-acl-tools //如果没有安装
systemctl enable rpcbind.service //即之前的portmap
systemctl enable nfs-server.service
systemctl enable nfs-server.service #启用安全的nfs,用于对挂载点有安全要求的目录使用
#安全秘钥
wget -O /etc/krb5.keytab http://ldap.example.com/pub/nfs_secure.keytab
Chkconfig --level 345 rpcbind on
Chkconfig --level 345 nfs on
systemctl start rpcbind.service //需要首先要启动RPC服务(即portmap 服务),否则NFS SERVER就无法向RPC服务区注册,当然如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。
systemctl start nfs-server.service
chkconfig --list nfs
chkconfig --list rpcbind
vim /etc/fstab #伪文件系统根目录(/)使用fsid=0标示,只有一个共享可以是fsid=0
172.10.11.2:/vpmdata /data nfs ro 0 0
172.10.11.2:/protected /nfssecure nfs rw,sec=krb5p 0 0
#vim /etc/exports
/ *(rw,fsid=0,insecure,no_root_squash)
/data/nfs *(rw,fsid=1000,insecure,no_root_squash
exportfs -rv //重新读取NFS配置文件; 当修改NFS配置文档后,不需要重启NFS,exportfs –rv即可使修改的/etc/exports生效,或执行systemctl reload nfs
#客户端
yum install nfs-utils rpcbind
#配置
vim /etc/sysconfig/nfs #
# Turn off v2 and v3 protocol support
RPCNFSDARGS="-N 2 -N 3"
# v4 protocol support 只使用nfs4
#RPCNFSDARGS="-N 4"
#RHEL7.3环境:
在/etc/sysconfig/nfs文件里,启用nfs4.2
RPCNFSDARGS="-V 4.2"
#这时,挂载就会报错:Protocol not supported;默认采用nfsv3
mount -t nfs 172.10.11.2:/vpmdata /data
mount.nfs: Protocol not supported
#防火墙
firewall-cmd --add-service=nfs --zone=internal --permanent
firewall-cmd --add-service=mountd --zone=internal --permanent
firewall-cmd --add-service=rpc-bind --zone=internal --permanent
NFS 原理回顾:
NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动。其中,RPC,基于C/S模型。程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节,甚至可以请求对方的系统调用。
涉及关联服务组件:
- rpc:远程过程调用协议,是实现本地调用远程主机实现系统调用的协议。当NFS启动后,就会随机使用一些端口;然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端;如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了;总之,RPC 就是用来统一管理NFS端口的服务,并且统一对外的端口是111;PRC最主要的功能就是指定每个NFS功能所对应的 port number,并且通知客户端,可以连接到正常端口上去。
- portmapper:负责分配rpc server的端口,并在client端请求时,负责响应目的rpc server端口返回给client端,工作在tcp与udp的111端口上。
- mountd:是nfs服务的认证服务的守护进程,client在收到返回的真正端口时,就会去连接mountd&#