RH358提供基于文件的网络存储–导出NFS文件系统
本章节介绍如何提供基于文件的网络存储。包括NFS和Samba,但在我眼中,Samba已经成为鸡肋服务,因为勒索病毒的出现,很多政企都会在网络层面封禁135、137、138、139和445端口,而Samba协议就是使用这几个高风险端口,因此,是否用Samba真的好好考虑了。在我看来,还是别用。
RH358专栏地址:https://blog.csdn.net/qq_41765918/category_11532281.html
1. 描述 NFS
Network File System (NFS) 是⼀种基于文件的存储协议,通常由 UNIX 系统和网络附加存储 network-attached storage(NAS) 设备使用。它提供跨网络对共享文件系统的透明远程访问。
Redhat Enterprise Linux 8默认使用NFS 4.2版本,支持使用NFSv4或NFSv3协议。不再支持NFSv2协议。NFS版本4 (NFSv4)只使用TCP传输,但是早期的NFS版本可以使用UDP或TCP。
NFS服务器导出文件系统目录及其内容,并与客户端共享。NFS客户端系统将导出的文件系统挂载到本地挂载点。
2. 启用NFS服务器
在服务器上,nfs-utils包提供了与NFS共享目录所需的工具。
启用并启动nfs-server服务。
[root@host ~]# systemctl enable --now nfs-server
服务器端的NFS协议版本为4.1及以上,端口为2049/TCP。配置防火墙,允许访问nfs服务,以打开该端口。
[root@host ~]# firewall-cmd --permanent --add-service=nfs
[root@host ~]# firewall-cmd --reload
早期版本的NFS需要允许访问其他端口。
3. 配置 NFS 导出
用于共享的主配置文件为/etc/exports。/etc/exports.d/*.exports 文件作为额外的配置读取,都使用相同的语法
在配置文件中,每一行声明一个导出点。第一个字段是导出目录的名称,其余部分列出访问共享目录的客户端及访问权限
**注意:**不要使用 NFS 导出同时是 SMB 共享的目录。可能会造成文件损坏或文件完整性或一致性问题
在配置文件中可以通过几种方式指定客户机系统。
- dns可解析的主机名,如client1.example.com。在下面的例子中,client1.example.com系统可以挂载/srv/myshare目录。
/srv/myshare client1.example.com
- 带有*通配符的dns可解析主机名。下面的示例允许example.com域中的所有系统访问NFS共享。
/srv/myshare *.example.com
- IPv4地址。下面使用192.168.0.12的IP地址访问NFS共享为例。
/srv/myshare 192.168.0.12
- IPv4网络。下面以192.168.0.0/24网络为例进行说明。也可以使用192.168.0.0/255.255.255.0表示法。
/srv/myshare 192.168.0.0/24
- IPv6地址。以IPv6地址为fde2:6494:1e09:2::20的客户端系统访问NFS共享为例。
/srv/myshare fde2:6494:1e09:2::20
- IPv6网络。例如使用fde2:6494:1e09:2::/64 IPv6网络访问NFS共享。
/srv/myshare fde2:6494:1e09:2::/64
若要与多个客户端系统共享一个目录,请在目录名称后使用空格分隔的列表:
/srv/myshare 192.168.0.0/24 client1.example.com *.example.net
默认情况下,目录以只读方式与客户端共享。在每个客户端定义之后,可以在圆括号中指定导出选项以覆盖默认值。
**重要:**客户端定义的结尾和开括号之间不能有空格。
下面是最常见的选项。
rw
此选项允许对指定的客户端进行读/写访问。没有这个选项(或者如果使用ro代替),NFS只授予读访问权。以下示例中,client1.example.com具有读写权限,而client2.example.com具有只读权限
/srv/myshare client1.example.com(rw) client2.example.com
no_root_squash
默认情况下,当客户机上的root用户访问NFS导出时,服务器将其视为nobody用户的访问。这意味着,如果客户机上的root用户在导出中创建了一个文件,那么该文件将属于nobody用户。这也意味着,如果客户机上的root试图读取用户nobody无法读取的导出文件,则访问将失败。
您可以通过添加no_root_squash选项来禁用该安全保护。下面的示例允许使用client1.example.com系统读写权限和真实root用户对/srv/myshare导出目录的访问权限。
/srv/myshare client1.example.com(rw,no_root_squash)
**注意:**在Red Hat Enterprise Linux 7及更早的版本中,用户是nfsnobody而不是nobody。
4. 检查 NFS 导出
使用exportfs命令列出NFS服务器当前导出的目录。
[root@host ~]# exportfs
/srv/myshare client1.example.com
缺省情况下,该命令不显示导出选项。使用-v选项列出这些选项,包括默认选项。
[root@host ~]# exportfs -v
/srv/myshare client1.example.com(sync,…,rw,secure,no_root_squash,…)
当修改/etc/exports或/etc/exports.d/*.exports文件中的导出点时。对于NFS服务,执行exportfs -r命令以考虑这些更改。作为一种替代方法,您还可以运行systemctl reload nfs-server。
5. 课本练习
[student@workstation ~]$ lab filestorage-nfs start
该命令确保servera、serverb和serverd在网络上可用。
在本练习中,您将配置serverd使用NFS共享/nfsshare目录。将servera配置为将这个NFS挂载到/share目录下。
1. 将服务器准备为NFS服务器。
为此,安装nfs-utils包,启动nfs-server服务,然后打开防火墙端口。
[root@serverd ~]# yum -y install nfs-utils
[root@serverd ~]# systemctl enable --now nfs-server
[root@serverd ~]# firewall-cmd --permanent --add-service=nfs
success
[root@serverd ~]# firewall-cmd --reload
success
2. 创建/nfsshare目录并对其进行保护,以便只有student用户具有写访问权限。
[root@serverd ~]# mkdir /nfsshare
[root@serverd ~]# chown student /nfsshare
[root@serverd ~]# ls -ld /nfsshare
drwxr-xr-x. 2 student root 6 Jul 1 13:55 /nfsshare
# 注意:学生用户具有读/写访问权限,而其他所有用户只有读访问权限。
3. 导出/nfsshare目录。
# 以便仅servera.lab.example.com可以读/写挂载它。确保lab.example.com DNS域中的所有其他系统都可以只读地挂载共享导出。
[root@serverd ~]# vim /etc/exports.d/exercise.exports
/nfsshare servera.lab.example.com(rw) *.lab.example.com(ro)
[root@serverd ~]# systemctl reload nfs-server
[root@serverd ~]# exportfs -v
/nfsshare servera.lab.example.com(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/nfsshare *.lab.example.com(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
4. 将来自serverd的NFS导出挂载到servera的/share挂载点上。
[root@servera ~]# mkdir /share
[root@servera ~]# echo "serverd.lab.example.com:/nfsshare /share nfs defaults 0 0" >> /etc/fstab
[root@servera ~]# mount /share
[root@servera ~]# df /share
Filesystem 1K-blocks Used Available Use% Mounted on
serverd.lab.example.com:/nfsshare 10474496 2534912 7939584 25% /share
5. 对文件系统的访问权限进行认证。
[root@servera ~]# su - student -c "echo Hello World > /share/test.txt"
[root@servera ~]# ls /share
test.txt
# 这个测试验证了在读写模式下可以访问导出。
[root@servera ~]# echo Hello World > /share/root_test.txt
-bash: /share/root_test.txt: Permission denied
# serverd上的NFS服务器将来自root的请求映射到nobody用户帐户。系统拒绝权限,原因是nobody用户对服务器上的/nfsshare目录没有写权限。
6. 确认lab.example.com DNS域中的其他系统可以以只读方式挂载导出。
[root@serverb ~]# mount serverd.lab.example.com:/nfsshare /mnt
[root@serverb ~]# df /mnt
Filesystem 1K-blocks Used Available Use% Mounted on
serverd.lab.example.com:/nfsshare 10474496 2534656 7939840 25% /mnt
[root@serverb ~]# ls /mnt
test.txt
[root@serverb ~]# cat /mnt/test.txt
Hello World
[root@serverb ~]# su - student -c "echo Hello World > /mnt/from_serverb.txt"
-bash: /mnt/from_serverb.txt: Read-only file system
# 命令失败是因为文件系统是只读的。
完成实验
[student@workstation ~]$ lab filestorage-nfs finish
总结
- 介绍NFS。
- 如何部署和配置NFS。
- 导出NFS并挂载使用。
- 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。