第八章 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日志文件,查看报错原因,再进行谷歌。