1.网络文件系统(NFS)是Unix系统和网络附加存储文件管理器常用的网络文件系统,允许多个客户端通过网络共享文件访问。它可用于提供对共享二进制目录的访问,也可用于允许用户在同一工作组中从不同客户端访问其文件。
2.NFS协议有多个版本:Linux支持版本4、版本3和版本2, 而大多数系统管理员熟悉的是NFSv3。默认情况下,该协议并不安全,但是更新的版本(如NFSv4)提供了对更安全的身份验证的支持,甚至可以通过kerberos进行加密。
若要配置基本NFS服务器,先应该安装nfs-utils软件包。然后,编辑/etc/exports列出通过网络与客户端系统共享的文件系统,并指出哪些客户端对导出具有何种访问权限
具体操作如下:
1.安装服务以及配置防火墙策略
[root@nfs-server ~]# yum install nfs-utils -y
[root@nfs-server ~]# systemctl start nfs-server
[root@nfs-server ~]# systemctl enable nfs-server.service
[root@nfs-server ~]# systemctl start firewalld
[root@nfs-server ~]# firewall-cmd --permanent --add-service=nfs
[root@nfs-server ~]# firewall-cmd --permanent --add-service=rpc-bind
[root@nfs-server ~]# firewall-cmd --permanent --add-service=mountd
[root@nfs-server ~]# firewall-cmd --reload
2.建立一个共享目录
[root@nfs-server ~]# mkdir /public
[root@nfs-server ~]# chmod 777 /public/
[root@nfs-server ~]# touch /public/test{1..3}
[root@nfs-server ~]# ls /public
3.编写/etc/exports 对客户端访问进行设置
[root@nfs-server ~]# vim /etc/exports
/public *(sync) ##将/public共享给所有人并且数据同步 *代表所有人,sync代表数据同步
[root@nfs-server ~]# exportfs -rv ##对配置的文件进行刷新,一定不能重启nfs服务,那样会导致服务卡住,这是已知的bug
4.在客户端进行检测
[root@nfs-client ~]# showmount -e 172.25.254.10
Export list for 172.25.254.10:
/public *
[root@nfs-client ~]# mount 172.25.254.10:/public /mnt
[root@nfs-client ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 7657472 3110484 4546988 41% /
devtmpfs 499700 0 499700 0% /dev
tmpfs 508996 140 508856 1% /dev/shm
tmpfs 508996 7044 501952 2% /run
tmpfs 508996 0 508996 0% /sys/fs/cgroup
/dev/sda1 201388 107392 93996 54% /boot
172.25.254.10:/public 10473984 3384832 7089152 33% /mnt
[root@nfs-client ~]# cd /mnt
[root@nfs-client mnt]# ls
test1 test2 test3
/etc/exports文件的配置可以man 5 exports
只允许172.25.0.0/24网段的ip访问
[root@nfs-server ~]# vim /etc/exports
/public 172.25.0.0/24(sync)
[root@nfs-server ~]# exportfs -rv
exporting 172.25.0.0/24:/public
测试:
[root@nfs-client ~]# showmount -e 172.25.254.10
Export list for 172.25.254.10:
/public 172.25.0.0/24
[root@nfs-client ~]# mount 172.25.254.10:/public /mnt
mount.nfs: access denied by server while mounting 172.25.254.10:/public ##因为客户端为254网段的ip,所以访问被拒
只允许同一个域名的主机访问
[root@nfs-server ~]# vim /etc/exports
/public *.example.com(sync)
[root@nfs-server ~]# exportfs -rv
exporting *.example.com:/public
只允许某一个ip只读访问,或者是读写访问
[root@nfs-server ~]# vim /etc/exports
/public 172.25.254.20(ro,sync) 172.25.254.21(rw,sync) ## 允许20主机只读访问 ,21主机读写访问
[root@nfs-server ~]# exportfs -rv
exporting 172.25.254.20:/public
exporting 172.25.254.21:/public
测试:
[root@nfs-client ~]# mount 172.25.254.10:/public /mnt
[root@nfs-client ~]# cd /mnt
[root@nfs-client mnt]# ls
test1 test2 test3
[root@nfs-client mnt]# touch file
touch: cannot touch ‘file’: Read-only file system ##因为ip是20,所以只读,不能写入
默认情况下,NFS服务器将NFS客户端上的root视为用户nfsnobody。即,如果root尝试访问挂载的导出中的文件,服务器会将其视作用户nfsnobody访问。在NFS导出被无磁盘客户端用作/和root需要被视作root的情况中,这种安全措施存在隐患。若要禁用此保护,服务器需要将no_root_squash添加到在/etc/exports中导出设置的选项列表:
/public *(rw,sync,no_root_squash)
[root@nfs-server ~]# vim /etc/exports
/public 172.25.254.20(rw,sync)
[root@nfs-server ~]# exportfs -rv
exporting 172.25.254.20:/public
测试:
[root@nfs-client ~]# mount 172.25.254.10:/public /mnt
[root@nfs-client ~]# cd /mnt
[root@nfs-client mnt]# ls
test1 test2 test3
[root@nfs-client mnt]# touch file
[root@nfs-client mnt]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun 4 19:54 file
-rw-r--r--. 1 root root 0 Jun 4 19:24 test1
-rw-r--r--. 1 root root 0 Jun 4 19:24 test2
-rw-r--r--. 1 root root 0 Jun 4 19:24 test3
如要在客户端root用户建立文件时,文件的用户名及组都为root
[root@nfs-server ~]# vim /etc/exports
/public 172.25.254.20(rw,sync,no_root_squash)
[root@nfs-server ~]# exportfs -rv
exporting 172.25.254.20:/public
测试:
[root@nfs-client ~]# mount 172.25.254.10:/public /mnt
[root@nfs-client ~]# cd /mnt
[root@nfs-client mnt]# touch file1
[root@nfs-client mnt]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun 4 19:54 file
-rw-r--r--. 1 root root 0 Jun 4 19:59 file1
-rw-r--r--. 1 root root 0 Jun 4 19:24 test1
-rw-r--r--. 1 root root 0 Jun 4 19:24 test2
-rw-r--r--. 1 root root 0 Jun 4 19:24 test3
如要在客户端root用户建立文件时,文件的用户名及组也可以为自己设定的,但必须要存在
[root@nfs-server ~]# vim /etc/exports
[root@nfs-server ~]# exportfs -rv
exporting 172.25.254.20:/public
测试:
[root@nfs-client ~]# useradd westos
[root@nfs-client ~]# id 1001
uid=1001(westos) gid=1001(westos) groups=1001(westos)
[root@nfs-client ~]# mount 172.25.254.10:/public /mnt
[root@nfs-client ~]# cd /mnt
[root@nfs-client mnt]# touch file3
[root@nfs-client mnt]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun 4 19:54 file
-rw-r--r--. 1 root root 0 Jun 4 19:59 file1
-rw-r--r--. 1 westos westos 0 Jun 4 20:04 file3
-rw-r--r--. 1 root root 0 Jun 4 19:24 test1
-rw-r--r--. 1 root root 0 Jun 4 19:24 test2
-rw-r--r--. 1 root root 0 Jun 4 19:24 test3
6.永久挂载NFS文件系统:
将相应的行添加至/etc/fstab:
[root@nfs-client ~]# vim /etc/fstab
172.25.254.10:/public /mnt nfs defaults 0 0
7.客户端NFS挂载选项
rw:挂载可读写的文件系统
ro:挂载只读文件系统
vers=4:尝试只使用指定的NFS版本进行挂载。如果服务器不支持该版本,则挂载请求失败
soft:如果NFS请求超时,三次尝试后返回错误。权衡数据完整性与提高客户端响应性。(默认行为hard,将无限期地重试)
两台主机都得更改主机名 一个server20 一个desktop20,这是因为,我们需要下载对应的keytab。
在两台主机,都加入kerberos认证域,得到ldap用户:
在server机做:
先安装服务
yum install authconfig-gtk.x86_64 sssd krb5-workstation.x86_64
生成认证,classroom.example.com里有可以生成认证的证书,做这个实验需要可以连接到这里。
authconfig-gtk
安装kerberos服务所需的keytab:
wget http://172.25.254.254/pub/keytabs/server20.keytab -O /etc/krb5.keytab
采用ktutil命令检测keytab
ktutil
ktutil: rkt /etc/krb5.keytab
ktutil: list
重启服务:
systemctl start nfs-secure-server
systemctl enable nfs-secure-server.service
编写/etc/exports,让拥有证书的用户才可以访问
vim /etc/exports
/public *(rw,sec=krb5p)
exportfs -rv
在客户机做:
先安装服务
yum install authconfig-gtk.x86_64 sssd krb5-workstation.x86_64
生成认证,classroom.example.com里有可以生成认证的证书,做这个实验需要可以连接到这里。
authconfig-gtk
安装kerberos服务所需的keytab:
wget http://172.25.254.254/pub/keytabs/desktop20.keytab -O /etc/krb5.keytab
采用ktutil命令检测keytab
ktutil
ktutil: rkt /etc/krb5.keytab
ktutil: list
重启服务:(与server主机重启的服务不相同,少了个service)
systemctl start nfs-secure
systemctl enable nfs-secure
做本地解析
vim /etc/hosts
172.25.254.220 server20.example.com
挂载服务:
mount 172.25.254.220:/public /mnt -o sec=krb5p ##
测试:
[root@desktop20 ~]# su - student
Last login: Sat Jun 3 23:37:20 EDT 2017 on pts/1
[student@desktop20 ~]$ cd /mnt
-bash: cd: /mnt: Permission denied ##student用户没有证书所以访问被拒
[student@desktop20 ~]$ su - ldapuser1 ##必须从普通用户过去,输一次密码才可以进去
Password:
Last login: Sat Jun 3 23:54:20 EDT 2017 on pts/0
su: warning: cannot change directory to /home/guests/ldapuser1: No such file or directory
mkdir: cannot create directory '/home/guests': Permission denied
-bash-4.2$ cd /mnt
-bash-4.2$ ls
file file2 file3 test1 test2 test3