NFS是sun公司开发的网络文件系统,可实现在异构网络上共享和装配远程文件系统。
NFS工作原理简介
NFS并不是单独存在的,它和另外2个模块共同存在。包括NFS在内,这三个模块分别是NFS,RPC,PORTMAP。
NFS只负责将数据通过以文件系统的方式共享出去,并进行登录管理和权限管理,并不负责数据的传输,而数据的传输则有RPC来完成。试想远程客户端在进行链接的时候需要知道哪个端口可用,以便将可用的端口用于NFS数据传输(NFS的数据传输方式有端口来完成),而负责维护可用端口与远程主机的映射关系则是有PORTMAP的完成的。
RPC:远程过程调用协议,RPC跨越了传输层和应用层
portmap进程的主要功能是把RPC程序号转化为Internet的端口号。
portmap进程一般使用TCP/UDP的111端口
想要深入了解RPC:见
在Linux Kernel 2.6.32中,portmap已经被rpcbind代替了,仔细查看安装信息就会发现,执行命令yum install portmap时安装的就是rpcbind.
工作流程:
(1)客户端向NFS服务器提交RPC请求,并明确访问NFS服务,并告知其具体的读写操作。
(2)RPC查找端口映射表,并根据客户端请求,返回相应的结果。
(3)客户端获取指定的NFS服务器端口后,将直接与NFS进程进行读写操作。
NFS服务器配置
安装
#yum install -y nfs*
服务器配置
#man exports
#vim /etc/exports
/tmp/share 192.168.173.0/24(rw,sync,root_squash)
【NFS共享的常用参数】
- ro 只读访问
- rw 读写访问
- sync 同步写入硬盘
- async 暂存内存
- secure NFS通过1024以下的安全TCP/IP端口发送
- insecure NFS通过1024以上的端口发送
- wdelay 多个用户对共享目录进行写操作时,则按组写入数据(默认)
- no_wdelay 多个用户对共享目录进行写操作时,则立即写入数据
- hide 不共享其子目录
- no_hide 共享其子目录
- subtree_check 强制NFS检查父目录的权限
- no_subtree_check 不检查父目录权限
- all_squash 任何访问者,都转为 匿名yong
- root_squash root用户访问此目录, 映射成如anonymous用户一样的权限(默认)
- no_root_squash root用户访问此目录,具有root操作权限
- anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
- anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
如果修改了/etc/exports文件后不需要重新激活nfs,只要重新扫描一次/etc/exports文件,并且重新将设定加载即可:
#exportfs -rv
- -a:全部挂载(或卸载)/etc/exports文件内的设定。
- -r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。
- -u:卸载某一目录。
- -v:在export时将共享的目录显示在屏幕上。
重启NFS服务
#service nfs restart
#chkconfig nfs on
ps:/var/lib/nfs/etab里面可以查看每个目录的分享权
NFS客户端配置(Autofs)
服务器分享目录:/tmp/share
客户端挂载目录:/tmp/share
1.手动挂载
#mkdir /tmp/test
#mount -t nfs 192.168.173.140:/tmp/share /tmp/test
2.直接的自动挂载
mount是用来挂载文件系统的,可以在系统启动的时候挂载也可以在系统启动后挂载。对于本地固定设备,如硬盘可以使用mount挂载;而光盘、软盘、NFS、SMB等文件系统具有动态性,即需要的时候才有必要挂载。光驱和软盘我们一般知道什么时候需要挂载,但NFS和SMB共享等就不一定知道了,即我们一般不能及时知道NFS共享和SMB什么时候可以挂载。而autofs服务就提供这种功能,好像windows中的光驱自动打开功能,能够及时挂载动态加载的文件系统。免去我们手动载在麻烦。要实现光驱,软盘等的动态自动挂载,需要进行相关的配置。
autofs 能够自动挂载卸载nfs和文件系统,并且在空闲的时候能够关闭nfs连接,降低系统负载。
#yum install -y autofs
#service autofs stop
首先修改全局的配置文件
#vim /etc/auto.master
/- /etc/auto.nfs
#vim /etc/auto.nfs
/tmp/test 192.168.173.140:/tmp/share
#service autofs restart
这里的/tmp/test,必须是存在的。
3.间接自动挂载
#yum install -y autofs
#service autofs stop
#vim /etc/auto.master
/tmp/test /etc/auto.nfs --timeout=60
/tmp/share是要挂载的本地目录,我们在向NFS服务器发送请求信号时,一定要在这个目录下面进行操作,否则是无效的。
/etc/auto.nfs: 是一个配置 NFS服务器共享文件的路径,及本地在/mnt/nfs目录中要与远程共享文件挂载的目录及权限,在auto.nfs文件中还要详细说明。
–timeout=60:指NFS客户端在多久没有向NFS服务器请求数据时断开挂载连接。
#vim /etc/auto.nfs
server 192.168.173.140:/tmp/share
#service autofs restart
server : 它是一个本地目录,我们不需要创建它,用于挂载远程共享文件192.168.20.6:/public,在我们想要使用远程共享文件/public时,只要在本地目录/mnt/nfs下键入:cd server 系统就会自动挂载到远程共享目录:192.168.20.6:/public,我们就可以正常使用里面的共享文件了 ,在到达超时时间时就会自动卸载。
NFS安全配置
1.iptables
NFS启动时会随机启动多个端口并向RPC注册,这样如果使用iptables对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。
#rpcinfo –p #查看本地rpc进程
#vim /etc/sysconfig/nfs #NFS相关端口的配置文件
打开对应端口(也可以自己修改)
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662
然后编写iptables的规则
如:
#iptables -A INPUT -s 192.168.173.0/24 -p tcp –dport 111 -j ACCEPT
#iptables -A INPUT -s 192.168.1.173.0/24 -p udp –dport 111 -j ACCEPT
#iptables -A INPUT -s 192.168.1.173.0/24 -p tcp –dport 2049 -j ACCEPT
#iptables -A INPUT -s 192.168.1.173.0/24 -p udp –dport 2049 -j ACCEPT
保存
#service iptables save
#service ipatbles restart
2.selinux
可根据需要自己打开,如:
#setsebool -P samba_share_nfs on