标签:red hat 查找 dom 因此 客户端连接 统一 style 生效 了解
配置NFS ServerNFS背景知识介绍
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
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系统的全部内容,有任何问题欢迎私信我交流,有不对的地方欢迎评论区指正!
标签:red hat 查找 dom 因此 客户端连接 统一 style 生效 了解
原文地址:http://blog.51cto.com/13466841/2151545