LINUX下NFS的配置与安全设置
Redhat Linux NFS配置 NFS简介: NFS是网络文件系统的简写(network file system),主要用在linux或unix环境中,是有sun公司开发,并于1984年推出的一个RPC服务系统。 NFS功能介绍: 他可以将多个目录或者单个目录进行发布,例如我们在网刻系统的时候可以用NFS来共享光盘镜像,NFS是以发布目录的方式将文件进行发布,而客户端是以挂载的方式进行访问。客户端可以节省本地空间,将数据存放在nfs服务器上。NFS也可以针对但个用户以及多用户设置不同的访问权限。 详细配置步骤: 安装NFS必须要开启的服务有:nfs、portmap、 NFS的配置相对于其他服务是比较简单的,我们依然还是要注意防火墙以及SElinux, 首先我们检查软件是否已安装,这里我已经都安装了。 在安装redhat linux 时这些包默认就已被安装,如果你检查发现没有安装,可以使用一下命令进行安装; #rpm –ivh nfs* #rpm –ivh portmap 配置NFS,配置文件在/etc/exports 首先我们使用vim打开/etc/exports 我们会发现这是一个空文件,里面没有任何内容。如果没有此文件,我们可以新创建一个, 这里我们举个例子来完成对NFS的配置, 例如:公司有多台计算机,而其中只有一台服务器有光驱,而我们其他的计算机也想安装光盘上的软件,现在我们就可以用NFS来实现。例如我们的服务器光驱挂载在/media上,接下来我们来编辑配置文件来实现以上的功能。 依然使用vi打开配置文件编辑以下内容: 然后保存退出,这个文件里我们只需编辑俩个字段:前面的为共享目录,后面的为哪些人可以访问以及访问权限,*代表所有人(ro)为只读权限。 启动服务 然后我们可以使用exportfs命令查询输出的目录 客户端挂载 需要启动服务 portmap 使用mount命令挂载,例如我/下有nfs目录,我将挂载到nfs目录上 然后我们就可以访问光盘目录了, 反挂载使用umount /nfs 我们还可以使用shoumount --export 192.168.0.7 查看NFS所发布的目录 如果您想共享其他的目录也是安装同样的方法,注意权限问题,目录权限和共享权限。 一些相关共享权限: ro 客户端为只读权限 rw 客户端为读写权限 root_sqush 客户端使用root访问时映射为nobady (默认选项) no_root_squash 客户端映射为root访问 启动服务的其它方式:/etc/rc.d/init.d/portmap start /etc/rc.d/init.d/nfs start 部分配置文件细节 exports文件内容格式: <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)] 1.输出目录: 输出目录是指NFS系统中需要共享给客户机使用的目录; 2.客户端: 客户端是指网络中可以访问这个NFS输出目录的计算机 客户端常用的指定方式 指定ip地址的主机 192.168.0.200 指定子网中的所有主机 192.168.0.0/24 指定域名的主机 a.liusuping.com 指定域中的所有主机 *.liusuping.com 所有主机 * 3.选项: 选项用来设置输出目录的访问权限、用户映射等。NFS主要有3类选项: 访问权限选项 设置输出目录只读 ro 设置输出目录读写 rw 用户映射选项 all_squash 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody); no_all_squash 与all_squash取反(默认设置); root_squash 将root用户及所属组都映射为匿名用户或用户组(默认设置); no_root_squash 与rootsquash取反; anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx); anongid=xxx 将远程访问的所有用户组都映射为匿名用 户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx); 其它选项 secure 限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置); insecure 允许客户端从大于1024的tcp/ip端口连接服务器; sync 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性; async 将数据先保存在内存缓冲区中,必要时才写入磁盘; wdelay 检查是否有相关的写操作,如果有则将这些写操作 一起执行,这样可以提高效率(默认设置); no_wdelay 若有写操作则立即执行,应与sync配合使用; subtree 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置); no_subtree 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率; /home/work 192.168.0.*(rw,sync,no_root_squash) 内容表示:允许ip 地址范围在192.168.0.*的计算机以读写的权限来访问/home/work 目录。 /home/work 也称为服务器输出共享目录。 括号内的参数意义描述如下: rw:读/写权限,只读权限的参数为ro; sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。 no_root_squash:NFS 服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。 接着执行如下命令,启动端口映射: # /etc/rc.d/init.d/portmap start 最后执行如下命令启动NFS 服务,此时NFS 会激活守护进程,然后就开始监听 Client 端的请求: # /etc/rc.d/init.d/nfs start 用户也可以重新启动Linux 服务器,自动启动Linux NFS 服务。 在NFS 服务器启动后,还需要检查Linux 服务器的防火墙等设置(一般需要关闭防火墙服务),确保没有屏蔽掉NFS 使用的端口和允许通信的主机,主要是检查Linux 服务器iptables,ipchains 等选项的设置,以及/etc/hosts.deny,/etc/hosts.allow 文件。 我们首先在Linux 服务器上进行NFS 服务器的回环测试,验证共享目录是否能够被访问。在Linux 服务器上运行如下命令: # mount –t nfs 192.168.0.20:/home/work /mnt # ls /mnt 命令将Linux 服务器的NFS 输出共享目录挂载到/mnt 目录下,因此,如果NFS 正常工作,应该能够在/mnt 目录看到/home/work 共享目录中的内容。 客户端 mount命令 mount –t nfs 192.168.0.20:/home/work /mnt/nfs –o nolock 简单脚本执行 host启动nfs: snfs #!/bin/bash ifconfig eth0 192.168.0.20 /etc/rc.d/init.d/portmap start /etc/rc.d/init.d/nfs start 嵌入式目标机挂载nfs: mnfs: #!/bin/sh mount -t nfs 192.168.0.20:/home/work/nfs /mnt/nfs -o nolock echo "nfs ok!" 在客户端查看NFS各种状态 showmount -e 可看有分享哪些目录 # showmount -a 可看出所有的 mount # showmount -e 172.16.75.1 在服务端 显示当前主机NFS服务器中已经被NFS客户机挂载使用的共享目录 # showmount -d 检查NFS的运行级别: # chkconfig --list portmap # chkconfig --list nfs 根据需要设置在相应的运行级别自动启动NFS: # chkconfig --level 235 portmap on # chkconfig --level 235 nfs on 客户端开机自动挂载 通过修改/etc/fstab文件可以实现开机自动挂载nfs目录 [root@linux-b nfs1]# vim /etc/fstab /dev/VolGroup00/LogVol00 / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 /dev/VolGroup00/LogVol01 swap swap defaults 0 0 192.168.0.231:/nfs/frank /mnt/nfs1 nfs defaults 0 0 1、在配置NFS服务器之前用ping命令确保两个linux系统正常连接,如果无法连接关闭图形界面中的防火墙#service iptables stop 2、更改完“exports”文件后要输入exportfs –rv ,使得“exports”文件生效。 3、检查nfs服务是否开启,默认是关闭的。
###############################################################################################################
一,应用环境介绍:
用途
操作系统
IP地址
服务器端
CentOS 5.2 X86_64
192.168.0.121
客户端
CentOS 5.2 X86_64
192.168.0.122
二,NFS相关软件的安装:
[root@youxia122 ~]# yum -y install portmap nfs*
三,服务器端配置:
1,创建共享的目录:
[root@youxia121 data]# mkidr /usr/local/data/
2,修改NFS配置文件:
[root@youxia121 data]# vi /etc/exports
/usr/local/data/ 192.168.0.122(rw,no_root_squash,no_all_squash,sync)
注:配置文件说明:
/usr/local/data/ 为共享的目录,使用绝对路径。
192.168.0.122(rw,no_root_squash,no_all_squash,sync) 为客户端的地址及权限,地址可以是一个网段,一个IP地址或者是一个域名,域名支持通配符,如:*.youxia.com,地址与权限中间没有空格,权限说明:
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。
NFS服务器配置: 创建一个目录用于共享,然后再用vi /etc/exports编辑文件,在里面 添加内容,格式如下: [共享的目录] [主机名或ip(参数1,参数2)] [主机名或ip(参数1,参数2)] ... NFS常用到的参数有: ro 只读 rw 读写 sync 所有数据在请求时写入共享 async nfs在写入数据前可以相应的请求 secure nfs通过1024以下端口发送 insecure nfs通过1024以上端口发送 wdenlay 有多个用户写入nfs目录,则归组写入 no_wdelay 有多个用户写入nfs目录,则立即写入 hide 不共享子目录 no_hide 共享子目录 subtree_check 如果共享/usr/bin之类的子目录,强制nfs检查父目录的权限 no_subtree_check不检查父目录权限 all_squash 共享文件的uid和gid映射匿名用户anonymous,适用公用目录 no_all_squash 保留共享文件的uid和gid root_squash root用户的所有请求映射成和anonymous用户一样的权限 no_root_squash root用户具有根目录的完全管理访问权限 anonuid=xxx 指定nfs服务器/etc/passwd文件匿名用户的uid anongid=xxx 指定nfs服务器/etc/passwd文件匿名用户的gid 配置完成后要重启nfs服务例如:/etc/init.d/nfs restart
在linux客户机上要查看nfs资源可以用showmount -e 服务端ip地址,测试是否通讯成功
如果要用windows系统不能直接访问NFS服务器,如果要共享可以用samba服务器。
四,启动NFS服务器并进行测试:
1,启动NFS服务器:
[root@youxia121 data]# service portmap start
启动 portmap:[确定]
[root@youxia121 data]# service nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额:[确定]
启动 NFS 守护进程:[确定]
启动 NFS mountd:[确定]
2,在客户端进行测试:
创建需要挂载的目录:
[root@youxia122 local]# mkdir /usr/local/data/
执行挂载命令:
[root@youxia122 local]# mount -t nfs 192.168.0.121:/usr/local/data /usr/local/data -o proto=tcp -o nolock
在客户端创建一个测试文件并进行检查:
[root@youxia122 ~]# cd /usr/local/data/
[root@youxia122 data]# echo "this is a test" >> /usr/local/data/hehehe
[root@youxia122 data]# ll -h
总计 8.0K
-rw-r--r-- 1 root root 15 02-23 16:47 hehehe
在服务器端检查:
[root@youxia121 usr]# ll -h /usr/local/data/
总计 8.0K
-rw-r--r-- 1 root root 15 02-23 16:47 heheh
五,我在配置中遇到的问题:
1,在启动NFS服务器的时候遇到的一个问题如下,原因在于NFS配置文件中地址与权限中间多了一个空格,去掉空格重新启动即可:
[root@youxia121 local]# service nfs restart
关闭 NFS mountd:[确定]
关闭 NFS 守护进程:[确定]
关闭 NFS 服务: [确定]
启动 NFS 服务: exportfs: No options for /usr/local/data/ 192.168.0.122: suggest 192.168.0.122(sync) to avoid warning
exportfs: No host name given with /usr/local/data (rw,no_root_squash,no_all_squash,sync), suggest *(rw,no_root_squash,no_all_squash,sync) to avoid warning
[确定]
关掉 NFS 配额:[确定]
启动 NFS 守护进程:[确定]
启动 NFS mountd:[确定]
2,客户端在挂载的时候遇到的一个问题如下,可能是网络不太稳定,NFS默认是用UDP协议,换成TCP协议即可:
[root@youxia122 local]# mount -t nfs 192.168.0.121:/usr/local/data /usr/local/data
mount.nfs: Input/output error
解决方法:mount -t nfs 192.168.0.121:/usr/local/data /usr/local/data -o proto=tcp -o nolock
本篇文章没有结论,只有思路。有兴趣的自己做做吧。
所有的事情都有个缘由的,这个事情我就比较烦。用来NFS,以前觉得简单,所以没有特别在意。这次想用NFS,并且打开iptables的情况下,就发现了问题。 问题描述:已经在Server端iptables上,打开portmap的端口111,后来得知NFS 4用的端口是2049,当时使用图形界面配置,所以也打开了。但是客户端就是错误。showmount -e serverIP的时候报mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive,关闭iptalbes就OK。再查,知道了。NFS和RPC的关系得知了一些NFS在2、3版本的时候的一些相关进程。(这些具体进程,可以看我的参考文档),总之,当使用3的版本时,要将相关联的端口打开。而那几个端口是随机的,如果想指定为固定端口,需要在/etc/sysconfig/nfs里面定义。而NFS 4的版本是不需要portmap的。但是需要配合krb5来做。很麻烦,都是思路。除非真的用。我是不想弄了。 写写思路就得了。 几个命令用得着: man -k nfs exportfs -r nfsstat 引用 参考文档: 1: RHEL5 Deployment_Guide.eng.pdf 2: http://slackwiki.org/NFS_and_Firewall 3: http://www.guyong.cn/blog/article.asp?id=168 4: http://wiki.linux-nfs.org/wiki/index.php/Main_Page 忍不住,还是处理了。具体操作如下: 修改/etc/sysconfig/nfs [root@kook ~]# grep -v ^# /etc/sysconfig/nfs LOCKD_TCPPORT=4001 LOCKD_UDPPORT=4001 MOUNTD_PORT=4002 STATD_PORT=4003 [root@kook ~]# cat /etc/sysconfig/iptables ................. -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 111 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 2049 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 4001 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 4001 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 4002 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 4002 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 4003 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 4003 -j ACCEPT .................