2)、NFS只是一种文件系统,自己没有传输功能,是基于RPC协议实现的,才能达到两个Linux系统之间的文件目录共享; linux
3)、NFS为C/S架构; web
rpc.statd---检查文件的一致性,须要nfslockd服务
vim
rw 缓存 |
可读可写 安全 |
ro 服务器 |
只读 网络 |
sync 架构 |
数据同步写入内存缓冲区与磁盘中,虽然这样作效率较低,但能够保证数据的一致性(适合于小文件传输) app |
async async |
数据先暂时放于内存,而非直接写入硬盘,等到必要时才写入磁盘(适合于大文件传输) |
no_root_squash |
使用nfs时,若是用户是root,不进行权限压缩,即root用户在nfs上建立的文件 属组和属主仍然是root(不安全,不建议使用) |
root_squash |
使用nfs时,若是用户是root,则进行权限压缩,即把root用户在nfs上建立的文件 属组和属主修改成nfsnobody |
all_squash |
全部的普通用户使用nfs都将使用权限压缩,即:将远程访问的全部普通用户及所属用户组都映射为匿名用户或者用户组(通常均为nfsnobody) |
no_all_squash |
全部的普通用户使用nfs都不使用权限压缩,即:不将远程访问的全部普通用户及所属用户组都映射为匿名用户或者用户组(默认设置) |
anonuid=XXX |
anon即anonymous(匿名者),前面关于*_squash提到的匿名用户的uid的设置值,一般为nobody或者nfsnobody,使用这个参数能够自行设定这个uid值,这个uid必须存在 于/etc/passwd |
anongid=XXX |
将远程访问的全部用户组都映身为匿名用户组帐户,并指定该匿名用户组帐户为本地用户组帐户(GID=XXX) |
insecure |
容许客户端从大于1024的TCP/IP端口连NFS服务器 |
secure |
限制客户端只能从小于1024的TCP/IP端口链接NFS服务器(默认设置) |
wdelay |
检查是否有相关的写操做,若是有则将这些写操做一块儿执行,这样可提升效率(默认设置) |
no_wdelay |
如有写操做则当即执行(应与sync配置) |
subtree_check |
若输出目录是一个子目录,则NFSW:务器将检查其父目录的权限(默认设置) |
no_subtree_check |
即便输出目录是一个子目录,NFS服务器也不检查其父目录的权限,这样作可提升效率 |
/tmp *(rw,no_root_squash) |
在全部的IP(主机)上登陆的用户均可对NFS服务器上的共享目录/tmp拥有rw操做权限,同时若是是root用户访问该共享目录,那么不将root用户及所属用户组都映射为匿名用户或用户组(*表示全部的主机或者IP) |
/tmp *(rw) |
在全部的IP(主机)登陆的用户均可对NFS服务器上的共享目录/tmp拥有rw操做权限 |
/home/public 192.168.0.*(rw) *(ro) |
除了在192. 168. 0.0/24这个网段内的主机上登陆的用户,可对NFS服务器共享目录/home/public进行rw操做权限,而其它网段的主机上登陆的用户,对NFS服务器共享目录/home/public只能进行r操做 |
/home/test 192.168.0.100(rw) |
只对192.168.0.100该台主机设置权限,即:使在该台主机登陆的用户均可对NFS服务器上的共享目录/home/test拥有读与写的操做 |
/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40) |
当*.linux.org(加入域linux.org的全部主机) 登录此NFS主机,而且在/home/linux下面写入档案时,该档案的全部人与全部组,就会变成NFS服务器上的/etc/passwd文件里面对应的UID为40的那个身份的使用者了(由于指定了参数:all_squash,anonuid=40,anongid=40) |
(4)权限问题
NFS服务器(192.168.0.2)上的/etc/exports配置文件设置以下 |
|
例如:咱们在192.168.0.100这个client端登录此NFS主机(192.168.0.2),那么会怎么样呢? |
|
状况一: 在192.168.0.100的账号为test这个身份,同时NFS主机上也有test这个账号 |
(1)因为NFS主机的/tmp权限为-rwxrwxrwt,因此我(test在192.168.0.100上)在/tmp下面具备存取的权限,而且写入档案的全部人为test |
(2)在/home/public中,因为我有读写的权限,若是NFS主机在/home/public这个目录的权限对于test开放写入的话,那么就可 以读写,而且写入档案的全部人是test。若是NFS主机的/home/public对于test这个使用者并无开放写入权限时,那就没法写入,虽然 /etc/exports里面是rw,也不起做用 |
|
(3)在/home/test中,权限与/home/public有相同的状态,须要NFS主机的/home/test对于test有开放的权限 |
|
(4)在/home/linux当中,不管是何种的user,身份都会被变成UID=40的这个账号 |
|
状况二: 若是咱们在192.168.0.100的身份为test2,可是NFS主机却没有test2这个账号时 |
(1)在/tmp下仍是能够写入,可是写入的档案全部人变成nobody |
(2)在/home/public与/home/test里面是否能够写入,还须要看/home/public的权限而定,不过身份就被变成nobody |
|
(3)/home/linux下的身份仍是变成UID=40的账号 |
|
状况三:在192.168.0.100的身份为root |
(1)在/tmp里面能够写入,可是因为no_root_squash的参数,改变了预设的root_squash的设定值,因此在/tmp写入档案的全部人为root了 |
(2)在/home/public底下的身份被压缩成了nobody,由于预设的属性都具备root_squash,因此档案全部人就变成了nobody |
|
(3)/home/test状况与/home/public相同 |
|
(4)/home/linux中,root的身份也被压缩成UID=40的那个使用者了 |
(5)启动nfslock、portmap、nfs服务,并查看日志是否正常的激活
[root@Mylinux ~]# service portmap start
[root@Mylinux ~]# service nfs start
[root@Mylinux ~]# service nfslock start
[root@Mylinux ~]# tail -10 /var/log/messages
注意:启动这些服务的顺序
(6)客户端链接使用nfs
[root@Mylinux ~]# /etc/init.d/portmap start
[root@Mylinux ~]# /etc/init.d/nfslock start
[root@Mylinux ~]# showmount -e 192.168.0.2
(7)exportfs与showmount指令的用法
exportfs指令做用 | 用来维护NFS服务的共享目录列表的输出 |
|
exportfs指令语法 |
-a |
所有mount或者unmount /etc/exports中内容(即:要被共享出来的目录) |
-r |
从新读取/etc/exports文件的设置,并使得设置当即生效,而不须要从新启动nfs服务 |
|
-u |
中止输出某一个目录 |
|
-v |
在输出目录时,将详细的信息输出到屏幕上 |
|
注意:当修改了/etc/exports配置文件,可使用参数-r从新读取/etc/exports配置文件,使得设置当即生效,而不须要重启nfs服务 |
||
exportfs指令例子 |
#exportfs -rv //从新export一次 |
格式:showmount [-ae] hostname(IP) |
|
-a |
显示指定的NFS服务器的全部客户端主机及其所链接的目录(通常在NFS Server上使用该参数) |
-e |
显示指定的NFS服务器上全部export出来的目录 |
(8)/var/lib/nfs/etab里面能够查看每一个目录的分享权,例如:
/nfs *rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
对照一下 /etc/passwd ,你就会发现,65534这个UID的用户是nfsnobody
(9)启动和中止NFS服务
Section 1:启动NFS服务
[root@Mylinux ~]# service portmap start
[root@Mylinux ~]# service nfs start
[root@Mylinux ~]# service nfslock start
注意:它们的启动顺序,由于nfs服务是依赖于RPC服务的,而RPC服务又依赖于portmap服务,因此要先启动portmap,而最后一个nfslock服务是对nfs共享的文件的读定锁定,因此在启动nfs服务后再启动
Section 2:中止NFS服务
[root@Mylinux ~]# service nfslock start
[root@Mylinux ~]# service nfs start
[root@Mylinux ~]# service portmap start
Section 3:检测与重启NFS服务
[root@Mylinux ~]# /etc/init.d/nfs restart
[root@Mylinux ~]# /etc/init.d/nfs status
[root@Mylinux ~]# /etc/init.d/portmap status
Section 4:设置自动启动NFS服务
[root@Mylinux ~]# chkconfig --level 345 portmap on
[root@Mylinux ~]# chkconfig --level 345 nfs on
[root@Mylinux ~]# mount -t nfs hostname(orIP):/directory /mountpoint
注意:为了担忧会不当心将 NFS 端挂进来的具备 SUID 权限档案的程序执行,root能够将NFS 所分享的目录以较为安全的状况挂载进来,即:“ mount -t nfs -o nosuid,ro hostname:/directory /mountponit ”
挂载NFS系统文件的可选参数以下 |
|
soft |
当服务器端没回应时,会在timeout后从新链接,传回错误信息 |
hard |
当服务器端没回应时持续在后台尝试链接 |
intr |
当正在进行 NFS 请求时,容许用键盘中断 |
nointr |
当正在进行 NFS 请求时,不容许用键盘中断 |
timeo |
请求过时时间,单位为秒 |
bg |
当第一次请求不成功,第二次的mount将放到后台执行 |
fg |
一直在前台发送请求 |
proto=tcp|udp |
修改使用TCP协议仍是UDP协议来传输nfs的数据 |
default |
hard和nointr |
rsize |
读操做的块大小,这个设置影响服务器和客户端的nfs缓存大小,若是有充足的内存和网络带宽,能够设置高些,如32768(bytes) |
wsize |
写操做的块大小,这个设置影响服务器和客户端的nfs缓存大小,若是有充足的内存和网络带宽,能够设置高些,如32768(bytes) |
查看帮助文件:man fstab、man -a mount |
二、使用autofs来实现自动挂载NFS服务器的共享目录到NFS客户端
1)为何要使用autofs
autofs 可以自动挂载卸载nfs和文件系统,而且在空闲的时候可以关闭nfs链接,下降系统负载。使用autofs要先关闭netfs服务,并注释掉/etc/fstab里关于nfs的内容
2)如何使用autofs实现NFS服务
[root@Mylinux ~]# chkconfig --level 35 autofs on
[root@Mylinux ~]# /etc/init.d/autofs start
[root@Mylinux ~]# vi /etc/auto.master
/nfs /etc/auto.nfs --timeout=60
[root@Mylinux ~]# vi /etc/auto.nfs
public -ro,soft,intr 192.168.0.228:/data
[root@Mylinux ~]# reboot
[root@Mylinux ~]# cd /nfs
[root@Mylinux ~]# ls
[root@Mylinux ~]# mount
/dev/hda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda2 on /web type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
[root@Mylinux ~]# cd public
[root@Mylinux ~]# mount
/dev/hda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda2 on /web type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.0.228:/data on /nfs/public type nfs (ro,soft,intr,addr=192.168.0.228)
同时使用多个参数的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
注意:NFS客户机和服务器的选项并不必定彻底相同,并且有的时候会有冲突。好比说服务器以只读的方式导出,客户端却以可写的方式mount,虽然能够成功mount上,但尝试写入的时候就会发生错误。通常服务器和客户端配置冲突的时候,会以服务器的配置为准
三、配置/etc/fstab文件来实现开机自动挂载NFS服务器的共享目录到NFS客户端
注意: 要开机挂载nfs文件系统还须要开启netfs服务,而且把挂载项写入到/etc/fstab
/etc/fstab文件的语法格式 |
|
格式: fs_spec fs_file fs_type fs_options fs_dump fs_pass |
|
fs_spec |
该字段定义但愿加载的文件系统所在的设备或远程文件系统, 对于nfs这个参数通常设置为这样:192.168.0.1:/NFS |
fs_file |
本地的挂载点 |
fs_type |
对于NFS来讲这个字段只要设置成nfs |
fs_options |
挂载的参数,可使用的参数能够参考上面的mount参数 |
fs_dump |
该选项被 " dump " 命令使用来检查一个文件系统应该以多快频率进行转储,若不须要转储就设置该字段为:0 |
fs_pass |
该字段被fsck命令用来决定在启动时须要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为:1,其余文件系统应该为:2。若该文件系统无需在启动时扫描则设置该字段为:0 |
查看帮助文件:man fstab、man -a mount |
四、与NFS有关一些其它指令
nfsstat: 查看NFS的运行状态,对于调整NFS的运行有很大帮助
rpcinfo -p hostname(orIP): 查看rpc执行信息,能够用于检测rpc运行状况的工具
5、NFS服务的安全
一、NFS不安全体如今如下几个方面
第一点:新手对NFS的访问控制机制难于作到驾轻就熟,控制目标的精确性难以实现 |
第二点:NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制 |
第三点:较早的NFS可使未受权用户得到有效的文件句柄 |
第四点:在RPC远程调用中,一个SUID的程序就具备超级用户权限 |
二、增强NFS安全的方法以下
第一:合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用root_squash |
第二:使用IPTABLE防火墙限制可以链接到NFS SERVER的机器范围 |
第三:为了防止可能的Dos攻击,须要合理设定NFSD 的COPY数目 |
第四:修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的 |
第五:改变默认的NFS 端口 |
第六:使用Kerberos V5做为登录验证系统 |
6、NFS服务的trouble shooting
常见错误 |
||
(1)权限的设置不符合 |
|
|
(2)忘记了激活portmap服务 |
错误信息 |
mount: RPC: Port mapper failure - RPC: Unable to receive 或mount: RPC: Program not registered |
解决办法 |
启动portmap,而且从新启动nfs |
|
(3)被防火墙拦截 |
从新设置防火墙,包括iptables与TCP_Wrappers,由于激活了portmap,因此port 111必须提供出去.所以在iptables rules中,要增长: 若是还不行,那就是TCP_Wrappers的问题,检查/etc/hosts.deny,若是有一行是: 若是咱们的NFS针对内部网络开发,对于外部网络只对学术网络开发(140.0.0.0/8),能够: 还可使用TCP_Wrappers,在/etc/hosts.allow里面规定连上 NFS 主机的主机 IP 与名称,例如 |
|
(4)cant contact portmapper: RPC: Remote system error - Connection refused |
出现这个错误信息是因为SEVER端的PORTMAP没有启动 |
|
(5)mount clntudp_create: RPC: Program not registered |
NFS没有启动起来,能够用showmout -e host命令来检查NFS SERVER是否正常启动起来 |
|
(6)mount: localhost:/home/test failed, reason given by server: Permission denied |
这个提示是当client要mount nfs server时可能出现的提示,意思是说本机没有权限去mount nfs server上的目录。解决方法固然是去修改NFS SERVER |