您的位置:首页 > 运维架构 > Linux

搭建linux NFS服务器(转自蔡元纪老师的文章)

2010-12-17 23:38 218 查看
搭建linux NFS服务器

 

一、NFS简介 
NFS由SUN公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大功能是可以通过网络让不同操作系统的计算机可以共享数据,所以也可以将其看做是一台文件服务器。NFS提供Windows与Linux及UNIX与Linux之间通信的方法(功能与samba相似)。所以,NFS是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配远程文件系统。
客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。NFS有属于自己的协议与使用的端口号(TCP 2049端口),但是在传送资料或者其他相关信息时候,NFS服务器使用一个称为"远程过程调用"(Remote Procedure Call,RPC)的协议来协助NFS服务器本身的运行。
二、RPC服务的原理
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动。每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口才没有固定,而是采用随机取用一些未被使用的小于724的端口来作为传输之用。但如此一来又造成客户端要连接服务器时的困扰,因为客户端要知道服务器端的相关端口才能够联机,此时我们需要远程过程调用(RPC)的服务。RPC最主要的功能就是指定每个NFS功能所对应的端口号,并且回报给客户端,让客户端可以连接到正确的端口上。当服务器在启动NFS时会随机选用数个端口,并主动地向RPC注册。因此RPC可以知道每个端口对应的NFS功能。然后RPC固定使用端口111来监听客户端的请求并回报客户端正确的端口,所以可以让NFS的启动更为容易。注意,启动NFS之前,要先启动RPC;否则NFS会无法向RPC注册。另外,重新启动RPC时原本注册的数据会不见,因此RPC重新启动后它管理的所有程序都需要重新启动以重新向RPC注册。
当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?
(1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。
(2)服务器端找到对应的已注册的NFS daemon端口后会回报给客户端。
(3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机。
由于NFS的各项功能都必须要向RPC注册,因此RPC才能了解NFS服务的各项功能的port number、PID和NFS在主机所监听的IP等,而客户端才能够通过RPC的询问找到正确对应的端口。即NFS必须要有RPC存在时才能成功地提供服务,因此我们称NFS为RPC Server的一种。事实上,有很多这样的服务器都向RPC注册。例如,NIS(Network Information Service)也是RPC Server的一种。所以如下图所示,不论是客户端还是服务器端,要使用NFS都需要启动RPC服务。




三、NFS所需软件包
nfs-utils-1.0.9-16.e15  nfs服务主程序包
portmap-4.0-65.2.2.1 提供RPC服务,众多服务必须依赖此服务(例:nis 、nfs等)
四、搭建NFS服务器
1. NFS服务器网络配置环境如下图所示:




2. 安装所需软件包
由于nfs-utils程序包与portmap程序包默认都已经安装,所以本案例中不需再手工安装(如果您的环境中没有安装,就需要使用rpm 命令将这两个程序包安装上)。查询程序包是否安装,具体操作如下图所示:




将nfs、portmap服务设置为开机自动启动(当然portmap服务默认就是开机自动启动),操作如下图所示:




启动nfs服务(由于portmap服务默认已经启动,所以本例中就不需要手工启动portmap服务),操作如下图所示:




3. 设置输出(共享)目录
       服务器端目录的输出(共享)都是通过设置/etc/exports这个文件而完成的,设定格式如下: 
       欲输出的目录名 主机名1或者IP1(参数1,参数2) 主机名2或者IP2(参数3,参数4) ...... 
    上面这个格式表示,同一个目录可以输出给多台不同的主机,但提供给这些主机的权限和参数是不同的,所以需要分别设定这些主机得到的权限。可以设定的参数主要有以下几种: 
          rw:可读写的权限; 
      ro:只读的权限; 
      no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。
   root_squash 将root用户及所属组都映射为匿名用户或用户组(默认设置)。 
  all_squash:不管登陆NFS主机的用户是什么都会被重新设定为nobody。 
  anonuid:将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中。 
  anongid:同 anonuid ,但是此处代表 group ID 。 
  sync:资料同步写入存储器中。 
  async:资料会先暂时存放在内存中,不会直接写入硬盘。 
  insecure 允许从这台机器过来的非授权访问。
例如:①建立目录,并在目录中创建新文件,如下图所示:




②将上图创建的目录写入/etc/exports文件,设置为输出(只允许172.24.0.0/24网段访问,权限为可读写),效果如下图所示:




4.  将/etc/exports文件中指定的输出目录输出(共享)
在服务器上设置完输出目录之后,生效方法有两种(即:有两种方法将目录输出),分别是:重新启动nfs服务和使用exportfs命令重新输出。
方法一:[root @station4 ~]# service nfs restart
方法二:[root @station4 ~]# exportfs -rv
 exportfs命令: 
    如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下: exportfs [-aruv] 
    说明: -a :全部mount或者unmount /etc/exports中的内容 ;  -r :重新mount /etc/exports中分享出来的目录 ;  -u :umount 目录 ;  -v :在 export 的时候,将详细的信息输出到屏幕上。 
       接上例中,③将"/common"目录输出操作方法如下图所示:
 


   注: [root @station4 ~]# exportfs -rv <==该命令表示:全部重新 export 一次! 
        [root @station4 ~]# exportfs -auv <==该命令表示:全部都卸载了。 
五、客户段的操作: 
当NFS服务器将目录输出之后,客户端就可以使用mount命令 将NFS服务器上的输出目录挂载到客户端本地的目录中,进而访问操作。但客户端并不知道NFS服务器输出了哪些目录,所以客户端在使用mount命令挂载之前必须先使用showmount命令查看NFS服务器上有哪些输出目录。 
1. showmout命令的用法 

showmout 
 -a :这个参数一般在NFS Server上使用,是用来显示已经mount到本nfs服务器上的客户端IP及其所连接的目录。 
 -d :这个参数一般在NFS Server上使用,是用来显示NFS服务器上有哪些目录被客户端挂载了。
 -e :这个参数一般在NFS Client上使用,显示指定的NFS SERVER上export出来的目录。 
       接上例,④在NFS客户端使用showmount命令查看NFS服务器有哪些输出目录,具体操作如下:





2. mount nfs目录的方法: 
          mount -t nfs hostname(orIP):/directory /mount/point 
    说明:mount -t nfs 服务器IP或服务主机名:/输出目录  挂载点
接上例,⑤在客户端挂载172.24.0.4中的/common目录,具体操作如下图所示: 




 六、NFS安全 
1. NFS的不安全性主要体现于以下4个方面:新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现;NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制;较早的NFS可以使未授权用户获得有效的文件句柄;在RPC远程调用中,一个SUID的程序就具有超级用户权限. 
2. 加强NFS安全的方法: 
a) 合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用root_squash。 
b) 使用IPTABLE防火墙限制能够连接到NFS SERVER的client IP范围 
iptables -A INPUT -i eth0 -p tcp -s 192.168.0.0/24 --dport 111 -j ACCEPT 
iptables -A INPUT -i eth0 -p udp -s 192.168.0.0/24 --dport 111 -j ACCEPT 
c) 为了防止可能的Dos攻击,需要合理设定NFSD 的COPY数目。 
d) 通过/etc/hosts.allow和/etc/hosts.deny文件限制客户端访问
方法如下:在/etc/hosts.deny文件中,添加portmap:ALL行(表示拒绝任何客户端使用portmap服务);在/etc/hosts.allow文件中,添加portmap:允许访问的客户端网段(表示允许某个网段的客户端访问portmap服务) 
例如:允许172.24.0.0网段访问portmap服务,拒绝其它任何网段访问portmap服务,具体操作如下所示:




e) 改变默认的NFS 端口 
NFS默认使用的是111端口,但同时你也可以使用port参数来改变这个端口,这样就可以在一定程度上增强安全性。 
f) 使用Kerberos V5作为登陆验证系统
七、关于iptables 防火墙的设置:
portmap服务使用TCP、UDP的111端口工作,而NFS服务是使用TCP的2049端口以及其它的一些高位动态端口工作,这样对iptables防火墙的设置难度较大。因此需要我们为NFS服务指定静态工作端口。方法如下:
新建或编辑/etc/sysconfig/nfs文件,并在该文件中添加以下四行即可(说明:本例中将端口指定为4002、4003、4004):
MOUNTD_PORT="4002"
STATD_PORT="4003"
LOCKD_TCPPORT="4004"
LOCKD_UDPPORT="4004"
效果如下图所示:




通过以上操作,portmap服务与nfs服务的所有端口都固定之后,我们就可以开始设置iptables防火墙了。在iptables防火墙中开放tcp及udp的111端口、开放tcp的2049端口、开放tcp及udp的4002到4004端口即可。具体操作如下图所示:




关于NFS 服务就讨论到这里,如果有相关问题请与我联系。
流星:caiyuanji (at) 163.com  QQ:85104942
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息