# NFS 网络文件系统

# 一、NFS 基本概述

NFS 是 Network File System 的缩写及网络文件系统。

NFS 的主要功能是通过” 局域网 “络让不同主机系统之间可以共享目录。

# 二、NFS 实现原理

1.png

本地文件操作方式

1. 当用户执行 mkdir 命令,BashShell 无法完成该命令操作,会将其翻译给内核。

2.Kernel 内核解析完成后会驱动对应的磁盘设备,完成创建目录的操作。

NFS 创建文件方式

1.NFS 客户端执行增、删等操作,客户端会使用不同的函数对该操作进行封装。

2.NFS 客户端会通过 TCP/IP 的方式传递给 NFS 服务端。

3.NFS 服务端接收到请求后,会先调用 portmap 进程进行端口映射。

4.nfsd 进程用于判断 NFS 客户端是否拥有权限连接 NFS 服务端。

5.Rpc.mount 进程判断客户端是否有对应的权限进行验证。

6.idmap 进程实现用户映射和压缩。

7. 最后 NFS 服务端会将客户端的函数转换为本地能执行的命令,由内核驱动硬件完成操作。

注意:rpc 是一个远程过程调用,那么使用 nfs 必须有 rpc 服务

# 三、NFS 服务实践

# 3.1 环境准备
服务器系统角色外网 IP内网 IP
CentOS7.6NFS 服务端eth0:10.0.0.32eth1:172.16.1.32
CentOS7.6NFS 客服端eth0:10.0.0.31eth1:172.16.1.31
# 3.2 NFS 服务安装
[root@nfs ~]# yum -y install nfs-utils
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs ~]# systemctl enable nfs-server
[root@nfs ~]# systemctl restart nfs-server
# 3.3 NFS 服务挂载

安装 nfs-utils 会自动启动 rpcbind 服务,执行 showmount -e 查看远程服务器 rpc 提供的可挂载 nfs 信息。

#1. 查询挂载
[root@nfs-client ~]# yum -y install nfsutils
[root@nfs-client ~]# showmount -e 172.16.1.32
Export list for 172.16.1.32:
/data 172.16.1.0/24
#2. 执行挂载
[root@nfs-client ~]# mkdir /nfsdir
[root@nfs-client ~]# mount -t nfs 172.16.1.32:/data /nfsdir
[root@nfs-client ~]# df –h
#3. 永久挂载
[root@nfs-client ~]# vim /etc/fstab
172.16.1.32:/data /nfsdir nfs defaults 0 0
#4. 执行卸载
[root@nfs-client ~]# umount /nfsdir
#注意:卸载的时候如果提示”umount.nfs: /nfsdir:device is busy”
#1. 切换至其他目录,然后在进行卸载。
#2.NFS Server 宕机,强制卸载 umount -lf /nfsdir

在企业工作场景,通常情况 NFS 服务器共享的只是普通静态数据(图片、附件、视频),不需要执行 suid、exec 等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。

例如:很多木马篡改站点文件都是由上传入口上传的程序到存储目录,然后执行。

#通过 mount -o 指定挂载参数,禁止使用 suid,exec,增加安全性能
[root@nfs-client ~]# mount -t nfs -o nosuid,noexec 172.16.1.31:/data /mnt
# 3.4 NFS 配置详解

执行 man exports 命令,然后切换到文件结尾,可以快速查看如下样例格式:

rw:读写权限

ro:只读权限

root_squash:当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户 (不常用)

no_root_squash:当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的 root 管理员 (不常用)

all_squash:无论 NFS 客户端使用什么账户访问,均映射为 NFS 服务器的匿名用户 (常用)

sync:同时将数据写入到内存与硬盘中,保证不丢失数据

async:优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据

anonuid:配置 all_squash 使用,指定 NFS 的用户 UID,必须存在系统

anongid:配置 all_squash 使用,指定 NFS 的用户 GID,必须存在系统

# 3.5 验证 ro 权限

1. 服务端修改 rw 为 ro 参数

[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs ~]# systemctl restart nfs-server

2. 客户端验证

[root@nfs-client ~]# mount -t nfs 172.16.1.32:/data /mnt
[root@nfs-client ~]# df -h
# 发现无法正常写入文件
[root@backup mnt]# touch file
touch: cannot touch ‘file’: Read-only file system
# 3.6 验证 all_squash 权限

验证 all_squash、anonuid、anongid 权限

#1.NFS 服务端配置,然后进行初始化操作
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u 666 -g 666 www
[root@nfs ~]# chown -R www.www /data/
#2. 客户端验证,会发现客户端文件的权限为 666,但可以正常写入数据
[root@backup ~]# umount /mnt/
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@backup mnt]# touch fff
[root@backup mnt]# mkdir 111
[root@backup mnt]# ll
drwxr-xr-x 2 666 666 6 Sep 3 03:05 111
-rw-r--r-- 1 666 666 0 Sep 3 03:05 fff
#3. 建议,客户端也创建一个 uid 为 666,gid 为 666,统一身份,避免后续出现权限不足的情况
[root@backup mnt]# groupadd -g 666 www
[root@backup mnt]# useradd -g 666 -u 666 www
[root@backup mnt]# id www
uid=666(www) gid=666(www) groups=666(www)
[root@backup mnt]# ll /mnt/
total 4
drwxr-xr-x 2 www www 6 Sep 3 03:05 111
-rw-r--r-- 1 www www 0 Sep 3 03:05 fff
此文章已被阅读次数:正在加载...更新于

请我喝[茶]~( ̄▽ ̄)~*

Xu Yong 微信支付

微信支付

Xu Yong 支付宝

支付宝