首页 > 代码库 > 配置与管理NFS服务器

配置与管理NFS服务器

             

     

     配置与管理NFS网络文件系统







姓名:马雪敏

专业:网络工程

    






NFS介绍

NFS=network  file system 

NFS最早是由Sun公司于1984年开发出来的,其目的就是让不同计算机不同操作系统之间可以彼此共享文件。 

由于NFS使用起来非常方便,因此很快得到了大多数的UNIX/Linux系统的广泛支持,而且还被IETE(国际互联网工程组)制定为RFC1904、RFC1813和RFC3010标准 

NFS使用的是C/S模式,我们今天会学习服务器的架设,和client的使用 

NFS的几大好处,我个人觉得哈:

1、可以把服务器的文件像本地一样的操作,很方便

2、NFS服务器对系统资源占用也少 

3、NFS可以支持很多其他服务,比如kickstart(kickstart 是无人值守,网络批量安装服务),NIS等等 

4、还有很多,反正用linux和UNIX就不会离开NFS 

NFS只有三个系统守护进程: 

rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器 

rpc.mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过rpc.nfsd登录NFS服务后,在使用NFS服务所提供的文凭前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。 

portmap:portmap的主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。 

这些进程都可以在进程中找到 

NFS的常用目录

1、/etc/exports 
这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。 

现在的版本都有的,等会我们修改的也就是这个文件 

2、/usr/sbin/exportfs 
这是维护NFS共享资源的命令,我用的不是很多,我一般在配置文件里面定义 

3、/usr/sbin/showmount 
shouwmount命令主要是用在client端,可以用来查看NFS共享出来的目录资源  

4、/var/lib/nfs/*tab 
其中的etab记录了NFS分享出来的目录的完整权限设定值,另一个是xtab,记录曾经连接到此NFS主机的相关client数据。 

NFS主要使用以上文件,还有部分配置文件很少使用,我也记不的很详细了 



简单介绍安装配置NFS服务器所用到的命令


1> 要使NFS服务器提供服务,必须启动inet portmapnfs 和 mount

4个守护进程,并保持在后台运行。

2>规划好要共享的分区或目录

3>定义客户机的参数

4>配置NFS主配置文件:/etc/exports

5>重启NFS服务


1.配置/etc/exports文件的语法

#vi  /etc/exports

 /sharedir     -maproot=daemon   host2

 /sharedir2    -ro     -network 192.168.1.0

 或者用下面的格式

 /sharedir  host3(OPTION)

 /sharedir  192.168.1.12/24(OPTION)

 第一段:为共享目录,一定要绝对路径。

 第二段:一些参数,如:-maproot=daemon表示若访问者为root用户,则转换为daemon用户;-ro :表示只读权限。

 第三段:表示允许访问的客户端,可以是一台主机,如host2;也可以是一个网段;主机可以用域名表示,也可以用IP表示,域名支持通配符,但是不包括点。如 *.example.net  ,可以表示e1.example.nete2.example.net等等,但不能表示s1.e1.example.net

  第三种格式表示可以把那些读写,只读等参数写在括号里,并用逗号隔开。


2.激活服务portmap 和 nfsd

Portmap激活后,会出现端口号为111的 Sunrpc服务

#service  portmap restart

#service  nfs     restart


3. 客户端配置

3.1  开启portmap服务


3.2  使用mount命令挂载共享目录

 mount   –t type   -o option   device    dir

 #mount  -t  nfs   -o  hard  192.168.1.22:/sharedir   /tmp/

3.3  用户除了使用mount命令挂载外,还可使用/etc/fstab挂载或autofs挂载。


二、NFS服务器配置实例


NFS服务器端配置:

1.先查看服务器端是否安装下列软件包

#rpm -qa  |grep  nfs

nfs-utils-1.0.9-16.e15

nfs-utils-lib-1.0.8-7.2


2.配置NFS服务器端配置文件:/etc/exports

/sharedir:为共享目录,权限受共享权限(rw)和本地权限限制。

192.168.1.22/24:允许192.168.1.0网段所有的机器访问

#vim  /etc/exports

#cat  /etc/exports

/sharedir    192.168.1.22/24(rw


3.重启NFS服务

       #service    nfs     restart


NFS客户端配置:

1.确认安装portmap

       #rpm   -qa |grep  portmap

       portmap-4.0-65.2.2.1


2.开启portmap服务

#service    portmap   restart


3.查看一台NFS服务器共享目录

192.168.1.22:为NFS服务器的IP地址

 #showmount   -e    192.168.1.22

 export  list   for  192.168.1.22:

 /sharedir     192.168.1.22/24


4.挂载服务器的共享目录

-t nfs :表示挂载文件的文件系统格式,也可以省略

 #mount  -t nfs  192.168.1.22:/sharedir  /mnt/

安装NFS服务器 的具体步骤

wKioL1OdPrXRoBTgAAGL3wv-zlo659.jpg

使用vim 编辑器打开 /etc/exports 

刚安装好的NFS服务器,这个文件是空的.

wKiom1OdPwXjMQMfAABtN40MSbA238.jpg 

现在我们在这里面定义我们需要共享的文件和目录,用NFS共享的目录和文件是没有selinux限制的。

这个配置文件只要分为三列 

第一列,写入你需要共享的目录路径 

第二列 写入客户端描述,也就是哪些客户端可以使用你的服务器 

第三列是紧挨着第二列的,内容是共享的权限 

现在我们共享我们的/var/ftp/pub 这个目录,让本地网络都可以访问,访问的权限是读写 

wKioL1OdP-qxvXZDAABzILPfudg823.jpg

这里需要注意的是client的描述,表达方式 

NFS对client的表达方式要求不是很严格,常用的表达方式他都能识别 
比如,IP就直接输入IP 
192.168.0.24 
网段: 
192.168.0.0/24 
192.168.0.0/255.255.255.0 

域名: 
www.linux.com 
域: 
*.linux.com 

如果表示所有的IP都能访问,就直接输入*   

而且你还可以分段表示

wKiom1OdQCnCceQ2AAB4QkZ1A6s538.jpg

然后重新启动NFS服务器,现在我们的SELINUX是强制状态,iptablesinput和output都是默认ACCEPT,由于NFS服务是基于portmap服务的,所以我们需要先启动portmap服务:service portmap restart ,然后 service nfs restart 

wKioL1OdQAzgBDP-AACFuMBBKs8336.jpg

OK以后,大家使用showmount 指令看看是否共享成功 

showmount -e  后面跟你的服务器IP 

wKiom1OdQEjTB9tSAABqZ1rcTKk717.jpg

可以使用showmount -e  这是默认查看自己共享的服务,前提是要DNS能解析自己,不然容易报错 

wKioL1OdQCnh6wIGAABjAMdLi8s067.jpg

现在我们把服务器当成client,来挂载服务器上共享的目录 

挂载使用mount命令手动挂载,也可以使用autofs挂载 

如果使用fstab挂载的话,要注意了,由于系统启动读取fstab在启动rc.d之前。所以那个时候nfs还没有启动,所以会挂在失败,可以在rc.local里面写入 mount -a 来在最后从新挂载fstab 

我们先手动挂载试试 

mount -t nfs 192.168.0.188:/var/ftp/pub /mnt/nfs/

wKiom1OdQGPRyy9wAAFB9N-w538505.jpg

如果没有报错,就证明挂载成功了,也可以用mount 命令来查看是否挂载成功 

wKioL1OdQEuhVqvdAACVokHd520323.jpg

最下面就是我们NFS挂载的 

进去看看,是不是和我们/var/ftp/pub目录东西一样

wKiom1OdQIOBzTnsAACROe9PUWk592.jpg

然后我们在/mnt/nfs里面建立一个文件,看看权限是什么 

wKioL1OdQHOh7xy7AAC5Zo7sbXI991.jpg

看见没有,我明明是root写入的,怎么变成nfsnobody了呢? 

NFS的共享权限和访问控制 

关于刚才文件属于nfsnobody的原因,这个是由于系统默认的NFS共享权限中的root_squash 导致的

root_squash:当登陆NFS主机使用共享目录的使用者是root时,其权限被转换成匿名使用者,通常它的UID与GID都会变成nobody身份。 

其实NFS有很多默认的参数,我们可以去看看 

wKiom1OdQK2x_YPgAADwRf3MaWc474.jpg

大家看见了吗,默认就有sync,wdelay,hide等等 

no_root_squash是让root保持权限,root_squash是把root映射成nobody。  

no_all_squash 就不让所有用户保持在挂载目录中的权限  

所以,root建立的文件是nfsnobody 

所以有的参数我们是不需要改动的,下面我们使用普通用户挂载试试,写入文件试试,什么权限 

wKioL1OdQIqBzbRqAAFP1pOP9p0345.jpg

普通用户写入文件,就是自己的名字 

这也就保证了服务器的安装 

sync:同步写入资料到内存与硬盘中 
async:资料会暂存到内存中,而非直接写入硬盘 

这两个那个比较好?  

如果你是重要的小文件,当然是sync,同步写入,避免文件丢失  

如果你是很大的数据,建议不要同步写入 

rw:可读可写 
ro:只读,这个很简单 

其他参数就需要大家自己去查阅了,我记不住那么多 

现在我们来说说NFS的访问控制吧 

nfs的端口是 2049 ,但是它基于portmap,portmap的端口是111 ,所以默认策略是允许,禁止其中一个端口,都能禁止nfs服务器,而且nfs服务器自己的client描述功能已经很强大了 

但是如果把iptables的测试默认DROP的话,想要让服务器外的client访问就有一定难度了 ,下面我们来试试这种访问,把input默认drop掉

iptables -P INPUT DROP 

wKiom1OdQNTANPEMAACbor3JiYQ167.jpg

现在重新启动portmap和nfs好像都不行了哦 

wKioL1OdQLeAJKXXAACtUlGGvZE063.jpg

我们需要先加入一条规则,允许本地回环 

iptables -A INPUT -i lo -j ACCEPT

wKioL1OdQNOwWNaPAAEQLzM0KCE527.jpg

然后重新启动portmap和NFS就可以正常了

wKiom1OdQQ3yypDgAAD1tdHXx5A035.jpg

这样就可以启动了 ,现在本地可以访问挂载了,但是服务器之外的其他client都不能挂载,因为input限制了哈~ 

下面这个实验需要两个虚拟机才能实现 

我们要允许相关端口 
第一个 111 
第二个  2049 
还有四个端口需要允许,这个四个端口本来是由portmap动态分配,但是为了配合防火墙,所以我们要手动指定 

怎么确定是2049端口?linux系统里面你也可以看 

wKiom1OdQUbgrWsQAABeFkFFDHw446.jpg

你也可以使用相同的方法看看111端口

wKioL1OdQSXiPwR1AAC3VCdPtAg832.jpg  

编辑NFS的端口配置文件 

vim /etc/sysconfig/nfs

wKioL1OdQTPSMuvjAAGFGyydt9E213.jpg

自定义以下端口,然而不能和其他端口冲突 

RQUOTAD_PORT= 
LOCKD_TCPPORT= 
LOCKD_UDPPORT= 
MOUNTD_PORT= 
STATD_PORT= 

wKiom1OdQW2RZo5MAAGMogV9w_w385.jpg

就是这 5个参数,但是 
LOCKD_TCPPORT= 
LOCKD_UDPPORT= 
可以使用一个IP 

大家定义好了,重新启动服务器就可以了

wKioL1OdQUzA7SlYAAB-TOowajQ883.jpg

然后使用防火墙策略iptables打开这几个端口 

允许111和2049的语句 

iptables -A INPUT -s 192.168.0.0/24 -p tcp -m multiport --dport 111,2049 -j ACCEPT

iptables -A INPUT -s 192.168.0.0/24 -p udp -m multiport --dport 111,2049 -j ACCEPT

允许10001到10004端口的语句 

iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 10001:10004 -j ACCEPT

iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 10001:10004 -j ACCEPT

wKiom1OdQYvD-C1RAADBJSRaYB4645.jpg

wKiom1OdQbbwvY3cAADTViVsSsc851.jpg

注意:iptables开启nfs相关端口TCP和UDP都要开启哈~~~偶就只开了TCP没开UDP,导致客户端不能挂载nfs,

wKioL1OdQZqhkMQXAACNHuKF3J4438.jpg 

在iptables中开启相应端口后客户端挂载nfs时又提示RPC没有注册

wKiom1OdQdSiT8g8AAA6K37JDxQ013.jpg

查下nfs服务器哈~

wKioL1OdQbKxpPXIAAC9iiK4OHw476.jpg

重启下portmap和nfs服务哈~

wKiom1OdQfDDtMd6AADm1GwI_no598.jpg

执行注册后再使用rpcinfo命令进行检测

wKioL1OdQdKyk2O5AAGKFdSGP74506.jpg

这样CLIENT端口就可以访问了 

 wKiom1OdQg2jU_MfAADTXGHso2k024.jpg 

由于NFS基于portmap的,而且portmap支持tcp_wrapper,所以我们也可以用tcp_wrapper对nfs进行限制

vim /etc/hosts.deny

wKioL1OdQezT-MTQAADaEHOmwDc671.jpg

禁止之后,如果没有挂载nfs,则会提示nfs没有注册哈~

wKiom1OdQiWw7riuAACZtp1WsNg797.jpg

如果客户端已经挂载了nfs,则会提示不能umount

wKioL1OdQgLyw4UAAAHD8Q0hhQg527.jpg 

本地能访问使用的是127.0.0.1 如果把tcp_wrapper的client描述改成 ALL, 就不能访问了 




本文出自 “马雪敏的博客” 博客,转载请与作者联系!