目录
目录
修改hosts.allow,只允许挂载的服务器使用mountd服务
修改hosts.deny,禁止除挂载外的其他所有主机使用mountd服务
NFS服务器搭建与配置_曹世宏的博客-CSDN博客_nfs服务
NFS服务简介
NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;
NFS一般用来存储共享视频,图片等静态数据。
NFS挂载原理:
RPC与NFS通讯原理:
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
注意:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行systemctl reload nfs或exportfs –rv即可使修改的/etc/exports生效
NFS客户端和NFS服务器通讯过程:
- 首先服务器端启动RPC服务,并开启111端口
- 服务器端启动NFS服务,并向RPC注册端口信息
- 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
- 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
- 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
NFS 服务安装
服务端 | 客户端 |
192.168.171.11 | 192.168.171.10 |
通过上边简要的介绍,我们知道 NFS 服务需要依赖 RPC 服务,所以这里 NFS 服务端需要安装 rpcbind
和 nfs-utils
,客户端只需要安装 nfs-utils
即可。
首先,确认下服务端系统是否已安装 NFS。
$ rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-44.el7.x86_64
nfs-utils-1.3.0-0.54.el7.x86_64
注意:这里我已经安装完毕,若为空,则说明未安装,执行安装命令。
# 服务端
$ yum install -y nfs-utils rpcbind
# 客户端
$ yum install -y nfs-utils
配置NFS服务端,客户端无需配置,只需要挂载
在服务端创建一个共享目录 /home/share
,并设置权限为777。
$ mkdir -p /home/share
$ chmod 777 /data/share
修改 NFS 配置文件 /etc/exports
这是 NFS 的主要配置文件了。该文件是空白的,有的系统可能不存在这个文件,主要手动建立。NFS的配置一般只在这个文件中配置即可。
vi /etc/exports
# 设置ip段内的主机可以挂载
/home/share 192.168.171.10/24(rw,sync,no_root_squash)
# 设置只允许单台主机进行挂载
/home/share 192.168.171.10(rw,sync,no_root_squash)
说明一下,这里配置后边有很多参数,每个参数有不同的含义,具体可以参考下边。此处,我配置了将 /home/share 文件目录设置为允许 IP 为该 192.168.171.10/24 的客户端挂载,也可以设置ip段,例如192.168.171.0/24,可以设置 IP 区间更大或者设置为 * 即允许所有客户端挂载,例如:/home *(ro,sync,no_root_squash) 设置 /home 目录允许所有客户端只读挂载。
服务端启动
先启动rpc,再启动nfs
# systemctl start rpcbind
# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 47708 status
100024 1 tcp 27601 status
注意:此时我们还没有启动 NFS 服务,只监听了 111 端口,接着我们来启动 NFS 服务,再来看下注册的端口列表。
# systemctl start nfs
# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 47708 status
100024 1 tcp 27601 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 28298 nlockmgr
100021 3 udp 28298 nlockmgr
100021 4 udp 28298 nlockmgr
100021 1 tcp 11195 nlockmgr
100021 3 tcp 11195 nlockmgr
100021 4 tcp 11195 nlockmgr
我们发现,启动了 NFS 服务后,rpc 注册的端口列表明显增多。OK 现在服务端都启动起来了,在服务端看下是否正确加载了设置的 /etc/exports
配置。
# showmount -e localhost
Export list for localhost:
/home/share 192.168.171.10/24
中途修改nfs配置文件后,重新加载的指令为:exportfs -arv,或者systemctl reload nfs,不用重新启动。
客户端配置
客户端只需要挂载上服务端的共享目录即可:
首先,我们可以在客户端查看下 NFS 服务端 (服务端 IP 为:192.168.171.11) 设置可共享的目录信息。
# showmount -e 192.168.171.11
Export list for 192.168.171.11:
/home/share 192.168.171.10/24
然后,在客户端创建挂在目录 /share
$ mkdir -p /share
最后,挂载远端目录到本地 /share
目录。
$ mount 192.168.171.11:/home/share /share
$ df -h | grep 192.168.171.11
Filesystem Size Used Avail Use% Mounted on
192.168.171.11:/data/share 200G 10G 190G 5% /share
可以看到,可以正确将远端 NFS 目录挂载到本地。注意:挂载点 /share
目录必须已经存在,而且目录中没有文件或子目录。
最后再进行测试一下就可,服务端跟客户端增删改查来一遍,因为服务端配置的权限是可读写,所以增删改查都可以进行测试。
最后,如果客户端要卸载 NFS 挂载的话,使用如下命令即可。
修改hosts.allow,只允许挂载的服务器使用mountd服务
修改hosts.deny,禁止除挂载外的其他所有主机使用mountd服务
$ umount /share
配置nfs永久挂载
上面的指令只适用于临时挂载,如果重启客户端,那么挂载配置将会失效,失效后,就需要手动将重新进行配置,如果发现不及时,就需要先手动将新产生的数据导入到nfs服务端,再进行配置,这样来说比较麻烦,下面介绍一下永久挂载nfs的方法----重启有效。
与硬盘挂载相同,可以通过在/etc/fstab中添加NFS挂载信息来持久化挂载:
vi /etc/fstab 在文件的最后按照自己服务器的实际情况进行添加
# device mountpoint fs-type options dump fsckorder
188.2.137.30:/data/syn /opt/share_nfs nfs rw 0 0
编辑完成后,重新加载配置文件
mount -a
如果想要取消挂载点,直接使用如下指令,取消挂载点时如果只更改配置文件中的挂载点名称,重新加载后发现,之前的挂载点还在,而且使用unmount /opt/share_nfs进行卸除时,会提示忙碌,不能进行卸载,这时候先使用umount -a,再执行unmount /opt/share_nfs命令即可卸载
NFS带来的安全问题
showmount -e信息泄露如何解决?
最近单位信息系统做安全等保,因为服务器使用了nfs文件共享,而导致在等保扫描中发现了一个高危漏洞,通过showmount -e可以展示nfs挂载列表,然后建议整改方法是限制使用showmount -e展示列表的主机,也就是说在使用nfs的客户端可以通过showmount -e展示可挂载的主机列表,其他主机均不可以使用showmount -e展示可挂载列表。
问题分析:设置NFS挂载的客户端以后,无论是设置的单个ip或者设置的ip段,只要在一个局域网可以连通的所有机器上,通过showmount -e [nfs server ip] 命令都可获取到nfs挂载列表,这就造成了安全隐患,我们可以通过设置/etc/hosts.allow和/etc/hosts.deny这两个文件,对mountd服务进行限制来解决。
/etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务。
1. 当文件 /etc/hosts.allow 存在时,则先以此文件内之设定为准;
2. 而在 /etc/hosts.allow 没有规定到的事项,将在 /etc/hosts.deny 当中继续设定!
也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny允许进入的写在 /etc/hosts.allow 当中;
不许进入的则写在 /etc/hosts.deny 当中。
修改hosts.allow,只允许挂载的服务器使用mountd服务
该文件修改保存后即刻生效,无需重启任何服务
vi /etc/hosts.allow
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
# 将放开的ip依次进行添加即可
mountd:192.168.171.10
mountd:192.168.171.12
mountd:192.168.171.13
修改hosts.deny,禁止除挂载外的其他所有主机使用mountd服务
该文件修改保存后即刻生效,无需重启任何服务
vi /etc/hosts.deny
# hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a 'deny' option instead.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
mountd:all
修改完成后,使用其他ip进行访问,发现已经访问不了了
# showmount -e 192.168.171.11
rpc mount export: RPC: Authentication error; why = Failed (unspecified error)
权限成功设置!!!