第八章 NFS服务
第一节 NFS简介
什么是NFS
NFS(Network File System):
NFS可以让客户端把服务器的共享目录,挂载到本机使用,就像使用本机分区一样,使用非常方便
RPC服务
RPC(远程调用)服务:
NFS是被RPC服务管理的,所以必须安装RPC的主程序rpcbind
NFS端口
- NFS端口:2049
- RPC端口:111
- NFS daemon端口:随机
和其他文件服务器对比(SFU Windows客户端搭建)
服务名称 | 使用范围 | 服务器端 | 客户端 | 局限性 |
FTP | 内网和公网 | Windows、Linux | Windows、Linux | 无法直接在服务器端修改数据 |
Samba | 内网 | Windows、Linux | Windows、Linux | 只能在内网使用 |
NFS | 内网和公网 | Linux | Linux (Windows) | 客户端需要挂载使用,对普通用户有一定的技术要求 |
第二节 NFS权限说明
权限说明
- Linux系统目录权限会生效
- NFS服务共享权限也会生效
用户身份映射(系统权限)
NFS没有用户登陆认证机制,所以客户端登陆到服务器之后,会把客户端的身份映射到服务器端。就会出现一下四种可能:
- 第一种可能
- client和server上刚好有相同的帐号和用户组(用户名和UID都要相同)
- client上用户可以在server上按照用户权限使用文件
- 第二种可能
- 当clinet和server上拥有相同的UID,但是用户名不同,
假设clinet上有用户aa(UID:500),server上有用户bb(UID:500)。在clinet在使用server共享目录时,身份识别为bb(因为Linux权限绑定在UID上)
此种情况尽量避免出现,容易逻辑混乱
- 第三种可能
- server上没有clinet的UID
clinet用户访问server时,server上没有此UID, 则把此用户自动转变为nfsnobody(UID: 65534)用户
- 第四种可能
- clinet上是root使用共享
默认把root也转变为nfsnobody。服务器端可以修改配置文件,允许root访问nfs服务器
第三节 NFS服务器端设置
服务器端安装
默认已经安装,如果需要手工安装
– NFS主程序:nfs-utils
– RPC主程序:rpcbind(旧版本portmap)
相关文件
配置文件: /etc/exports
服务器端管理
默认已经启动,如果需要手工启动:
- service nfs start
- service rpcbind start
守护进程
ps aux | grep -E "nfs|rpc”
– rpc.rquotad:NFS配额
– rpc.mountd:处理客户端挂载
– nfsd:NFS守护进程
– rpcbind:RPC守护进程
RPC服务注册情况
rpcinfo -p IP或主机名
第四节 NFS服务器端配置文件
配置文件
/etc/exports
共享目录 客户端(权限)
多个共享,空格隔开
可以识别的客户端
- 指定IP:192.168.44.4
- 指定网段: 192.168.44.0/24 192.168.44.0/255.255.255.0
- 指定主机名:www.itxdl.cn
- 所有主机:*
常用权限
- rw: 读写
- ro: 只读
- all_squash:不论登陆是谁,都压缩为匿名用户nfsnobody
- root_squash:如果登陆的是root,压缩为nfsnobody
- no_root_squash:允许root身份登陆,不推荐anonuid:把所有的登陆用户,不再压缩为nfsnobody用户,而是压缩为指定uid用户
- sync:将数据同步写入内存缓冲区与磁盘中,效率低, 但可以保证数据的一致性;
- async:将数据先保存在内存缓冲区中,必要时才写入磁盘
- 举例1
任何人可以访问,允许root访问
vi /etc/exports
/home/test *(rw,no_root_squash) - 举例2
同时共享多个目录
vi /etc/exports
/home/test 192.168.44.3(rw,no_root_squash) *(ro)
/home/soft 192.168.44.0/24(rw) - 举例3
匿名用户访问
vi /etc/exports
/home/soft 192.168.44.0/24(rw,all_squash,anonuid=600)
常用命令
exportfs 选项
选项:
-a: 按照配置文件挂载/卸载所有目录
-r: 重新挂载
-u: 卸载
-v: 显示详细信息
exportfs举例
- exportfs -auv #全部卸载所有目录
- exportfs -arv #重新挂载所有目录,不用重启NFS服务
这种是为了不用重启服务,就可以使修改的配置文件生效,而且不会把正在登陆的用户踢掉
showmount命令
- showmount查看共享目录
- showmount -e IP或主机名
选项:
-e: 查看某个主机的共享目录
第五节 NFS客户端使用
客户端需要启动的服务
需要启动rpcbind,默认已经启
手工启动命令:
service rpcbind start
查看服务器端共享目录
showmount -e 192.168.44.3 #指定服务器端IP即可
把服务器共享目录挂载到本地
- mkdir /home/client #建立挂载点
- mount -t nfs 192.168.44.3:/home/soft /home/client #挂载到本地使用
- mount #查看挂载
卸载
umount /home/client
开机自动挂载
vim /etc/fstab
192.168.44.3:/home/test /home/client nfs defaults 0 0
第六节 权限实验
- 第一种可能
client和server上刚好有相同的帐号和用户组(用户名和UID都要相同)
client上用户可以在server上按照用户权限使用文件
服务器:
– [root@localhost ~]# useradd -u 600 test1
– [root@localhost ~]# passwd test1
客户端:
– 一样的用户与UID
– [root@localhost test]# su - test1
– [test1@localhost ~]$ cd /home/test
– [test1@localhost test]$ touch cde
– [test1@localhost test]$ ll cde
– -rw-rw-r-- 1 test1 test1 0 11月 14 2016 cde - 第二种可能
当clinet和server上拥有相同的UID,但是用户名不同,
假设clinet上有用户aa(UID:500),server上有用户bb(UID:500)。在clinet在使用server共享目录时,身份识别为bb(因为Linux权限绑定在UID上)
此种情况尽量避免出现,容易逻辑混乱
服务器端:
– 用户名:test1 UID:600
客户端:
– [root@localhost ~]# useradd -u 600 user1
– [root@localhost ~]# su - user1
– [user1@localhost ~]$ cd /home/test/
– [user1@localhost test]$ touch def
– [user1@localhost test]$ ll def
– -rw-rw-r-- 1 user1 user1 0 11月 14 2016 def
服务器端:
– [root@localhost ~]# ll /tmp/def
– -rw-rw-r-- 1 test1 test1 0 11月 14 04:40 /tmp/def - 第三种可能
server上没有clinet的UID
clinet用户访问server时,server上没有此UID, 则把此用户自动转变为nfsnobody(UID: 65534)用户
服务器端:
– 没有UID为700的用户
客户端:
– [root@localhost ~]# useradd -u 700 test2
– [test2@localhost test]$ touch qwe
– [test2@localhost test]$ ll qwe
– -rw-rw-r-- 1 nobody nobody 0 11月 14 2016 qwe - 第四种可能
clinet上是root使用共享
默认把root也转变为nfsnobody。服务器端可以修改配置文件,允许root访问nfs服务器
服务器端:
– 不允许root访问
客户端:
– [root@localhost ~]# cd /home/test
– [root@localhost test]# touch asd
– [root@localhost test]# ll asd
– -rw-r–r-- 1 nfsnobody nfsnobody 0 11月 14 2016 asd
服务器端:
– 允许root访问
– [root@localhost ~]# vi /etc/exports
– /tmp 192.168.44.4(rw,no_root_squash)
– [root@localhost ~]# exportfs -auv
– [root@localhost ~]# exportfs -arv
客户端:
– [root@localhost ~]# cd /home/test
– [root@localhost test]# touch zxc
– [root@localhost test]# ll zxc
– -rw-r–r-- 1 root root 0 11月 14 2016 zxc
第七节 总结
简单写一下关于NFS服务器搭建中的一些问题
首先要知道在我们搭建这些服务器的时候,对我们最大的阻碍就是SELinux与防火墙,我们先从这两点开始说起
SE Linux是美国国家安全局开发的Linux安全模块,它在本来已经很安全的Linux上,凌驾于root权限之上,设置了很多额外的条条框框;
如果你了解这些条条框框,那还好;但如果不了解,那SELinux可能并没有帮什么忙,却给你带来了很多不确定因素,通俗来讲, 把它关了就好,在刚开始学Linux这个东西对我们没有一点作用,所以我们在搭建这些Samba,FTP,NFS服务的时候,首先就要做到把它先关闭,
vim /etc/sysconfig/selinux 命令进入SELinux的配置文件,把SELINUX=disabled这一句设置好了,他就干干净净的从你的世界消失了,再也没有他的打扰,接下来第二个困扰便是防火墙,这个东西更加头疼,如果你是虚拟机搭建 ,没有太大的安全隐患,直接 iptables -F或者 systemctl stop firewalld.service 关了就好,但是如果在比如阿里云,华为云,腾讯云这上面的服务器来说,就有一定的安全隐患了,而且直接把它关了也很令人不爽,你如果到了企业工作,不能也直接把企业的防火墙关了吧。
所以说,我们还是老老实实的学一下关于防火墙的一点东西吧,为什么我在刚才说需要 iptables -F或者systemctl stop firewalld.service这么两个命令呢?这是因为在Linux中有两种防火墙软件,CentOS7.0以上使用的是firewall,CentOS7.0以下使用的是iptables,有一个就好。
对于防火墙,我们该如何理解呢?这样举个例子吧,有一个男孩喜欢一个女孩,那她怎么才能追到这个女孩呢?很简单,让这个女孩喜欢他就好了,这就是男追女,隔座山;女追男,隔层纱的意思,我们把服务器端(Server)比作男孩,客户端(Client)比作女孩,他们之间要想相互通信,就得有连接啊,但是很遗憾,防火墙就像女孩的父亲一样隔在你和女孩之间,如果你一味的去追女孩,因为有防火墙的存在,你是不可能建立联系的,这就好比FTP服务器的主动模式与被动模式,我们可以控制自己服务器的防火墙,但是却不能控制客户端的防火墙,而客户端也有可能对防火墙不太理解,你不能强迫人家说:你要想连接,去吧防火墙关了,或者开端口。这些对于非专业人士来说,是很难办到的。所以我们就有让我们自己的服务器开启相应的端口,让我们被动,我们去接客户端传来连接请求。这样女孩的父亲也管不住了,你们就可以完美的建立联系。所以,对于阿里云这些服务器,他的公网IP会映射到内网上,也就是你的私有IP,阿里云的环境需要开启被动模式,公网共享,否则连接不到服务器。
对于端口,他就是好像在防火墙上的一扇窗,通过特定开放的端口就可以进行连接,所以你也可以使用公网IP加端口(47.95.1.123:21)这样来链接,我们在服务器端需要把服务的每一个端口都开启,对于阿里云用户来说,就是在阿里云控制台里面的设置安全组,把里面的所需的服务的端口都打开。这样才能建立连接,FTP主动模式需要开20,21两个端口,服务从20端口主动向客户端发起连接,而被动模式你也需要另外在加开端口,比如50000-50010,这是一个范围,服务端在指定范围内某个端口被动等待客户端连接。这便是被动模式。
而对于NFS这种服务,他是先通过RPC服务的注册,才能正常工作,NFS是被RPC服务管理的,所以必须安装RPC的主程序rpcbind,才能允许NFS,在开启服务的时候也需要先开启rpcbind服务,才能开启nfs服务,而NFS主进程端口是2049,RPC端口是111 ,但是NFS还有许多子进程,这便是通过RPC注册的NFS daemon端口,他的端口号是随机的,因为端口随机,如果关了防火墙还好说,啥都可以过,但是一旦开启呢?你总不能在使用服务之前先查一下端口号再来配置防火墙规则吧,这是不现实的,所以我们就需要把随机端口给固定了。可以更改配置文件固定NFS服务相关端口。这样设置固定端口以后即便重启机器也很方便挂载,如果不设置固定端口,机器或服务重启后之前添加的iptables规则就失效了,当然你也可以systemctl stop iptables.service,systemctl stop firewalld.service来临时关闭防火墙,重启之后就会失效。那如何配置nfs的效果端口配置文件呢?
vim /etc/sysconfig/nfs
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
添加这几条规则,就把端口限制了。
systemctl restart rpcbind.service
systemctl restart nfs.service
重启rpc,nfs服务,配置生效
rpcinfo -p查看服务端口
你会发现,全都是你设定的端口号
接下来就需要给防火墙设置规则,开窗户了:
添加iptables规则
iptables -A INPUT -s 192.168.214.0/24 -p tcp –dport 111 -j ACCEPT
iptables -A INPUT -s 192.168.214.0/24 -p udp –dport 111 -j ACCEPT
iptables -A INPUT -s 192.168.214.0/24 -p tcp –dport 2049 -j ACCEPT
iptables -A INPUT -s 192.168.214.0/24 -p udp –dport 2049 -j ACCEPT
iptables -A INPUT -s 192.168.214.0/24 -p tcp –dport 30001:30004 -j ACCEPT
iptables -A INPUT -s 192.168.214.0/24 -p udp –dport 30001:30004 -j ACCEPT
保存退出后,重启防火墙
systemctl restart iptables.service
添加firewall规则
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=111/udp
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --permanent --add-port=30001/tcp
firewall-cmd --permanent --add-port=30001/udp
firewall-cmd --permanent --add-port=30002/tcp
firewall-cmd --permanent --add-port=30002/udp
firewall-cmd --permanent --add-port=30003/tcp
firewall-cmd --permanent --add-port=30003/udp
firewall-cmd --permanent --add-port=30004/tcp
firewall-cmd --permanent --add-port=30004/udp
保存退出后,重启防火墙
systemctl restart iptables.service
重启服务器
reboot
重启之后执行"rpcinfo -p"命令
就发现全部都OK了
这两种选其一即可,看你电脑是开启的哪种防火墙
这些都弄完之后,就可以配置NFS的配置文件了
如果还有报错的话,学会使用/var/log/secure日志文件,查看报错原因,再进行谷歌。