# NFS 网络文件系统
# 一、NFS 基本概述
NFS 是 Network File System 的缩写及网络文件系统。
NFS 的主要功能是通过” 局域网 “络让不同主机系统之间可以共享目录。
# 二、NFS 实现原理
本地文件操作方式
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.6 | NFS 服务端 | eth0:10.0.0.32 | eth1:172.16.1.32 |
CentOS7.6 | NFS 客服端 | eth0:10.0.0.31 | eth1: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 |