Linux之NFS配置

配置NFS Server

NFS背景知识介绍

    NFS是一种古老的用于在UNIX/Linux主机之间进行文件分享的协议。它古老到你必须穿着白大褂才能接近一台计算机的年代。在那个年代,所有的联网计算机都被认为是可信的,而不像现今这样,任何人都有多种多样方法能连接到你的计算机。因此,NFS在开发的时候专注于快速及易用的文件共享,而忽视了其安全性设计。

    在NFS协议里,其安全性是基于主机的。也就是说,当你创建了一个文件共享时,它是基于主机进行权限分配,而不是基于帐户进行权限分配。当某台主机连接至NFS Server端时,在该台主机上的用户与NFS Server上的具有相同ID的用户具有相同的权限。例如,客户端ID 501的用户与Server端 ID 501的用户具有相同的权限。因此,这会引发十分严重的系统安全性问题。例如:假设在客户端上有一个用户Ethan,其ID为1001,而在主机端有一个用户Alex,其ID也为1001,且其属于管理员组。对于计算机而言,其仅仅识别用户ID,而不会关心用户的用户名。因此,则当客户端连接至服务器端并进行文件访问时,Server端进行比判后发现用户ID为1001的客户端需要访问本机文件,且其属于管理员组,因此就会给予其相应的管理员组的权限,这是一个十分危险的行为,如此以来,×××就可以尝试通过穷举的方法,获取系统的管理权限,危害性不言而喻。

    也正是基于此,NFS通常会和NIS服务联合使用。NIS服务提供了集中化的用户管理服务,下一篇博文我会详细介绍该协议。

    目前,NFS共有4个版本,在最新的NFSV4中,Kerberos可以作为一个选项,为NFS协议安全性保驾护航。本文暂不涉及kerberos的配置。

理解NFS进程

    为了使用NFS server, 需要配置几个相应的组件。首先就是NFS Server本身,这是由linux内核提供的。而为了提供服务,NFS还使用了另一个服务,即NFS RPC(远程过程调用)portmapper。(在CentOS6后,该服务已经被替换为rpcbind服务)首先,我们先看一下RPC服务的作用。

    大家都知道,现代计算机提供的服务都有其自身固定的端口号。比如telnet协议使用23号端口,ssh使用22号端口,http协议使用80号端口,但NFS却没有其固定的端口号,归根结底,这是由于NFS诞生时,TCP和UDP端口的使用尚未形成统一的规范。所以,NFS就使用了自定义的端口号,也就是所谓的RPC  功能号码(RPC program numbers)。直至NFSV3为了与现代计算机提供服务的方式相兼容,这些功能号码必须被转换成一个固定的端口号,这即是portmapper(rpcbind)这个程序的功能。当一个基于rpc的程序(比如nfs)启动时,它就会将自身正在监听的端口号向rpc进行注册。当某个客户端想要与基于RPC的服务进行通信时,它首先会连接至portmapper(rpcbind)进程,从而查找出服务端正在监听的号码,并与之进行通信。为了查找你的服务器端正在监听哪些RPC端口号,可以使用命令rpcinfo -p命令。在我的计算机上它显示如下:

 

[root@localhost ~]# rpcinfo -p

扫描二维码关注公众号,回复: 2432667 查看本文章

   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  58017  status

    100005    1   udp  20048  mountd

    100024    1   tcp  48387  status

    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  33529  nlockmgr

    100021    3   udp  33529  nlockmgr

    100021    4   udp  33529  nlockmgr

    100021    1   tcp  44320  nlockmgr

    100021    3   tcp  44320  nlockmgr

    100021    4   tcp  44320  nlockmgr

 

从命令输出可以看到,NFS正在监听2049端口,并且其支持Version3, 4。其内部使用了RPC端口号10003.由于NFS需要向RPC服务进行注册自身使用的端口号,所以在启动NFS服务之前,必须确保portmapper服务已经启动。所有的各Linux主要发行版均会在你启动NFS Server时自动确保该点实现。

    当启动portmapper后,其它的NFS Server组件就可以启动了。首先即是rpc.nfsd进程。该进程用来通知portmapper有一个NFS Server启动了,并且告诉NFS Server端portmapper的功能号。

    第二个需要启动的就是rpc.mountd进程。该进程允许客户端将nfs Server共享文件挂载至本地。

    第三个可选启动的即是rpc.lockd进程。该进程确保在同一时刻,仅有一个用户可以访问同一个文件。这些进程不需要手动启动,它们由启动NFS Server时的脚本自动加载运行。

需要注意的是从NFSV4开始,NFS进程发生了重大变化。在NFSV4中,其使用固定的端口号2049对外提供服务。这使得配置管理和使用NFS变得更容易了,特别是在一些使用防火墙的场景中。

    最后一个部分是关于NFS Server端的配置文件,总共有两个文件。第一个是/etc/exports文件。在该文件中,指出了NFS需要共享的文件。在其余的Linux发行版诸如:SUSE和Red Hat, 还用另一个配置文件:/etc/sysconfig/nfs,该配置文件配置了NFS的线程数及启动参数等等。

 

 

配置NFS Server端

    在大多数的linux发行版中,有两个配置文件需要进行配置。第一个即为/etc/exports。在所有的linux发行版中都有该配置文件。在该文件中用于配置你想在网络中共享的文件目录。除此之外,还可能用到/etc/sysconfig/nfs文件,该文件中定义了一系列的参数,定义了NFS Server的服务方式。

    在/etc/exports中定义文件共享的方式的结构如下:

    目录  主机(选项)

其中,目录即是你想共享的文件目录,例如: /share。

其次,主机定义了允许访问你开放的共享目录的主机名,可以通过以下几种方式定义:

 

l  主机名,可以是短主机名也可以FQDN名

l  单个的主机IP地址

l  通过名称标识的某个网段,例如:*.mydomain.com

l  通过IP地址和子网掩码表示的某个网段,例如:192.168.10.0/255.255.255.0

l  用*号表示的所有网段

 

    配置完允许哪些主机可以访问NFS Server上的共享目录后,还需指定这些主机访问该文件夹时的选项。常用的选项如表一所示:

 表一 常用NFS选项

选项

含义

RO

故名思义,只读导出,无论目录权限如何,用户只能以只读权限访问,任何的写入均是被禁止的。

Rw

文件系统以可读写的方式导出,最终用户访问时的权限,由本地目录的权限决定。

Root_squash

当以root用户的身份访问共享目录时,其用户ID被映射成65534, 即nobody。   也即意味着你不会有任何的写权限,并且根据NFS Server端的配置,很可能没有任何的权限。这是一个默认选项。它确保了当某个终端用户用root用户访问共享目录时,不会得到root用户的权限,从而保证了系统的安全性。

No_root_squash

不压缩root用户权限。即当用户以root用户的身份访问某个文件夹时,给予其相应的root权限。

Sync

同步写入磁盘选项,该选项用于保证用户对文件或目录所做的修改,在其它用户访问前即时生效。虽然使用该选项效率稍低,但由于其可以有效减少文件丢失,推荐使用。

 

举个例子:

/  ilulissat(rw)  kangerlussuaq(rw,no_root_squash)

    在本例中,ilulissat主机对共享的根文件系统有读写权限,但该主机的root用户当访问共享的根文件系统时其并不具有root权限。而kangerlussuaq用户对共享的根文件系统也享有读写权限,并且当从该主机以root用户访问该共享根文件系统时,其拥有root权限。

 

通过exportfs调整导出文件系统

当NFS Server启动后,其在/var/lib/nfs/xtab文件中保留了一份导出文件目录,其通过在NFS Server初始化时调用exportfs -a命令实现。通过使用exportfs命令,可以更改NFS Server的文件系统导出列表,而不必编辑/etc/exports文件或者重启NFS Server。例如:以下命令实现将/srv目录导出至192.1681.0网段:

    exportfs 192.168.1.0/255.255.255.0:/srv

    执行上述命令后,导出即刻生效,但重启NFS Server后会失效。因此,如果需要其永久有效,必须将其包含至/etc/exports文件中。

 

配置NFS Client

    NFS Server端配置好后,就可以开始配置NFS Client端了,有两种办法实现挂载NFS系统:

l  手动挂载

l  通过fstab自动挂载

通过mount命令手动挂载

最快的访问NFS共享目录的方法就是调用mount命令。仅需指定需挂载的文件系统的类型为nfs,并且指明需要挂载的目录以及挂载点,就可以快速进行访问了。下面的例子演示了如下通过本地的/mnt目录访问NFS Server上共享的/opt目录。

         mount -t nfs STN:/opt /mnt

需要特别注意是的NFS Server名称后的冒号,它将NFS Server的名称和其共享的目录分割开来。尽管你可以不加任何参数的挂载并访问NFS Server的共享目录,但是仍然有一些参数可以使得访问nfs的共享目录更加容易一些。常见的选项如表2所示。

2 常用的NFS挂载选项

选项

含义

Soft

使用该选项,用来告诉mount命令,不要一直不间断尝试挂载远程共享目录。如果默认超时时间(60s)过后, 仍然挂载不上,就不再尝试挂载。对那些非关键的挂载可以使用该选项。

Hard

使用该选项,用来告诉mount命令,要一直尝试不间断挂载远程共享目录。需要注意的是如果在系统启动的时候使用该选项,有可能导致启动进程停滞。因此,仅在确实需要挂载的目录下使用该选项。

Fg

该选项为默认选项。用来告诉mount命令所有的mount操作必须在前台运行。结果就是在挂载过程中在当前终端界面用户无法进行其它工作。

Bg

该选项用来进行后台挂载。如果第一次挂载不成功的话,所有的其它的尝试过载均在后台进行。

Rsize=n

通过这个选项,用户可以指定客户端从服务器端可以一次性读取的字节数。

由于兼容性的原因,该参数默认为1024字节。NFSV3后的版本可以读取更多数据。为了提高系统访问速度,可以将其设置为了一个更大的值,如8192。

Wsize=n

该选项用来设置一次性可以写入的最大字节数。默认为1024字节。NFSV3后的版本可以处理更多的数据,所以可以指定例如8192字节以提高系统的写入速度。

Retry=n

这个选项用来指明一次挂载可以等待的最大的分钟数。默认值是10000(6.94天)。可以考虑将其设置为一个更小的值以避免在不能建立的mount连接上长时间等待。

Nosuid

用这个选项指明SUID及SGID选项不能用于导出文件系统上,这是一个安全选项。

Noexec

使用该选项用来禁止在导出文件系统上执行任何可执行文件

 

通过fstab自动挂载NFS共享目录

使用mount命令可以快速的挂载NFS共享目录。但如果需要多次挂载相同的共享目录,则应该使用/etc/fstab文件。如果你已经了解了如何在/etc/fstab下增加新的条目,则自动挂载就会变得非常简单。唯一的区别就是必须要指定的完整nfs共享目录的路径而不是指定设备名称,同时,还必须指定相应的挂载选项。当通过/etc/fstab自动挂载时,应该总是指定rsize,wsize及soft选项进行性能优化。可以通过服务器的名字或IP地址指定NFS服务器。举个例子:

server:/nfsshare  /mnt/nfsserver  nfs  rsize=8192,wsize=8192,soft  1  2

 

获取NFS共享目录导出列表

    为了挂载NFS共享目录,必须首先了解server端提供了哪些导出目录。可以通过使用命令showmount得出。命令使用非常简单:showmount -e后跟想要检查的host的主机名即可。例如:

showmount -e localhost

[root@localhost /]# showmount -e localhost

Export list for localhost:

/usr/centos_6.4iso 10.1.11.0/24

好了,这就是NFS系统的全部内容,有任何问题欢迎私信我交流,有不对的地方欢迎评论区指正!

 

 

 

 

 

 

 

 

 

 

 

 

 


猜你喜欢

转载自blog.51cto.com/13466841/2151545