#######################

####### nfs ############

########################

一 NFS概念

   网络文件系统(NFS)是Unix系统和网络附加存储文件管理器常用的网络文件系统,允许多个客户端通过网络共享文件访问。它可用于提供对共享二进制目录的访问,也可用于允许用户在同一工作组中从不同客户端访问其文件。


   NFS协议有多个版本:Linux支持版本4、版本3和版本2, 而大多数系统管理员熟悉的是NFSv3。默认情况下,该协议并不安全,但是更新的版本(如NFSv4)提供了对更安全的身份验证的支持,甚至可以通过kerberos进行加密。


二 NFS服务器配置


    若要配置基本NFS服务器,您应该安装nfs-utils软件包。然后,您应该编辑/etc/exports以列出您希望通过网络与客户端系统共享的文件系统,并指出哪些客户端对导出具有何种访问权限。例如:

/var/ftp/pub  192.168.0.0/24(ro,sync)

    将目录/var/ftp/pub导出至192.168.0.0/24网络上的所有主机(对目录具有只读权限)。

/export/homes *.example.com(rw,sync)

    将目录/export/homes导出至exmaple.com中的所有主机(对目录具有读写权限)。


    当NFS服务器运行时,每次您编辑/etc/exports后,都应通过在保存更改后执行exportfs -r来确保应用这些更改。您可以使用exportfs -v显示所有导出。


    NFSv4还导出pseudo-root(所有导出的文件系统的root)。如果客户端挂载nfs-server:/ ,这将在NFS服务器上的/下面相对于其位置挂载所有导出文件系统。这对于浏览从客户端的服务器导出的所有文件系统有用。您仍可单独挂载文件系统。默认情况下,NFS服务器将NFS客户端上的root视为用户nfsnobody。即,如果root尝试访问挂载的导出中的文件,服务器会将其视作用户nfsnobody访问。在NFS导出被无磁盘客户端用作/和root需要被视作root的情况中,这种安全措施存在隐患。若要禁用此保护,服务器需要将no_root_squash添加到在/etc/exports中导出设置的选项列表:

/exports/root 192.168.0.1(rw,no_root_squash)

对于NFSv4,必须在服务器上打开端口2049/TCP(对于nfsd)。对于NFSv3和更早版本,必须为rpcbind、rpc.mountd、lockd和rpc.rquotad打开更多端口,而在“随机”选择的端口上启动其中许多服务这一事实又增加了复杂性。此外,NFSv2和NFSv3支持UDP传输,还要求打开相应的端口。


三 Demo

1.启动服务

yum install nfs-utils 

systemctl enbale nfs-server

systemctl start nfs-server 

firewall-cmd --permanent --add-service=nfs

firewall-cmd --permanent --add-service=rpc-bind

firewall-cmd --permanent --add-service=mountd


   95 yum install nfs-utils 

   96  systemctl status firewalld

   97  systemctl start firewalld

   98  systemctl status firewalld

   99  firewall-cmd --list-all

  100  systemctl status nfs-server

  101  systemctl start nfs-server

  102  systemctl status nfs-server

  103  firewall-cmd --permanent --add-service=nfs

  104  firewall-cmd --permanent --add-service=rpc-bind

  105  firewall-cmd --permanent --add-service=mountd

  106  firewall-cmd --reload

 nfs_其他

 nfs_nfs_02

 nfs_nfs_03

[student@localhost mnt]$ showmount -e 172.25.254.244

Export list for 172.25.254.244:


2.共享目录

server:

systemctl  start nfs-server  ###开启服务

mkdir /public   ###建立共享目录

chmod 777 /public ####给共享目录设置权限


 vim /etc/exports  配置文件   ###man 5 exportfs 查看exports怎么写

 exportfs -rv   ###使/etc/exports文件生效


(1)/public   *(sync)    ####public共享给所有人并且数据同步

(2)/public   172.25.254.0/24(sync)  ####public共享给172.25.254.0网段并且数据同步

(3)/public   *.example.com(sync)###public共享给example.co域的所有主机

(4)/public   172.25.254.144(ro,sync)   172.25.254.44(rw,sync)

###public共享给144是只读。44是读写。

(5)/public   *(rw,sync,no_root_squash) #####public共享给所有人,当客户端使用root挂载不改变用户身份。

(6)/public   *(sync,anonuid=1001,anongid=1000) ###public共享给所有人以1001为uid,以1000为gid。


(1-3)操作

server:

   16  vim /etc/exports

/public   *(sync)  ###public共享给所有人并且数据同步

   17  exportfs -rv

   18  mkdir /public

   19  exportfs -rv

   20  touch /public/file{1..4}

   21  vim /etc/exports

/public   172.25.254.0/24(sync)  ####public共享给172.25.254.0网段并且数据同步

   22  exportfs -rv

   23  vim /etc/exports

/public   *.example.com(sync)###public共享给example.co域的所有主机

   24  exportfs -rv

 nfs_其他_04

desktop:测试

   mount 172.25.254.244:/public /mnt  ####临时挂载

    2  mount 172.25.254.244:/public /mnt  ###public共享给所有人并且数据同步

    3  cd /mnt

    4  ls

    5  touch westos

    9  umount /mnt

   10  mount 172.25.254.244:/public /mnt####public共享给172.25.254.0网段并且数据同步

   11  df

   12  umount /mnt

   13  mount 172.25.254.244:/public /mnt#####public共享给example.co域的所有主机

   14  df

   15  hostname

 nfs_其他_05

 nfs_nfs_06

 nfs_其他_07

(4)

[root@server ~]# vim /etc/exports

[root@server ~]# exportfs -rv

exporting 172.25.254.144:/public

exporting 172.25.254.44:/public###public共享给144是只读。44是读写

[root@server ~]# chmod 777 /public 

测试:

[root@desktop ~]# mount 172.25.254.244:/public /mnt

[root@desktop ~]# cd /mnt

[root@desktop mnt]# ls

file1  file2  file3  file4

[root@desktop mnt]# touch westos

touch: cannot touch ‘westos’: Read-only file system

[root@foundation44 ~]# mount 172.25.254.244:/public /mnt

[root@foundation44 ~]# cd /mnt

[root@foundation44 mnt]# ls

file1  file2  file3  file4

[root@foundation44 mnt]# touch westos

[root@foundation44 mnt]# ls

file1  file2  file3  file4  westos

[root@foundation44 mnt]# ll

total 0

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file1

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file2

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file3

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file4

-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun  8 23:39 westos

(5)

[root@server ~]# vim /etc/exports

/public   *(rw,sync,no_root_squash) #####public共享给所有人,当客户端使用root挂载不改变用户身份

[root@server ~]# exportfs -rv

exporting *:/public  


[root@desktop ~]# mount 172.25.254.244:/public /mnt

[root@desktop ~]# cd /mnt

[root@desktop mnt]# ll

total 0

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file1

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file2

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file3

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file4

-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun  8 11:39 westos

[root@desktop mnt]# touch westos1

[root@desktop mnt]# ll

total 0

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file1

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file2

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file3

-rw-r--r--. 1 root      root      0 Jun  8 10:52 file4

-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun  8 11:39 westos

-rw-r--r--. 1 root      root      0 Jun  8 11:51 westos1

(6)

[root@server ~]# vim /etc/exports

/public   *(sync,anonuid=1001,anongid=1000) ###public共享给所有人以1001为uid,以1000为gid。

[root@server ~]# exportfs -rv

exporting *:/public

[root@server ~]# useradd westoos

[root@server ~]# id student

uid=1000(student) gid=1000(student) groups=1000(student),10(wheel

[root@server ~]# id westoos

uid=1001(westoos) gid=1001(westoos) groups=1001(westoos)


[root@foundation44 ~]# mount 172.25.254.244:/public /mnt

[root@foundation44 ~]# cd /mnt

[root@foundation44 mnt]# ll

total 0

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file1

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file2

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file3

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file4

-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun  8 23:39 westos

-rw-r--r--. 1 root      root      0 Jun  8 23:51 westos1

[root@foundation44 mnt]# touch file

[root@foundation44 mnt]# ll

total 0

-rw-r--r--. 1 westos    kiosk     0 Jun  9 00:13 file

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file1

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file2

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file3

-rw-r--r--. 1 root      root      0 Jun  8 22:52 file4

-rw-r--r--. 1 nfsnobody nfsnobody 0 Jun  8 23:39 westos

-rw-r--r--. 1 root      root      0 Jun  8 23:51 westos1


四 保护NFS输出

Demo:

在serverx和desktopx上运行脚本,加入kerberos认证域:

# lab nfskrb5 setup

安装kerberos服务所需的keytab:(以下操作都在server0上进行)

# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/server0.keytab

激活NFS v4.2版本,可以输出selinux标签,编辑/etc/sysconfig/nfs修改如下选项:

RPCNFSDARGS="-V 4.2"

启动nfs-secure-server服务:

# systemctl start nfs-secure-server; systemctl enable nfs-secure-server

配置NFS输出:

# mkdir /securenfs

# echo '/securenfs desktop0(sec=krb5p,rw)' >> /etc/exports

# exportfs -r

安装kerberos服务所需keytab:(以下操作都在dekstop0进行)

# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/desktop0.keytab

启动nfs-secure服务:

# systemctl start nfs-secure; systemctl enable nfs-secure

配置客户端挂载:

# mkdir /mnt/secureshare

# echo 'server0:/securenfs /mnt/secureshare

/etc/fstab

nfs defaults,v4.2,sec=krb5p 0 0' >>

# mount -a


在server上;

(1)开启kerberos认证,得到ldap用户

 nfs_nfs_08

 nfs_nfs_09

 nfs_nfs_10

 nfs_其他_11


 nfs_nfs_12

(2)wegt http://172.25.254.254./pub/keytabs/server0.keytab -O  

/etc/krb5.keytab 

ktutil

 nfs_其他_13

激活NFS v4.2版本,可以输出selinux标签,编辑/etc/sysconfig/nfs修改如下选项:

RPCNFSDARGS="-V 4.2"

 nfs_其他_14

systemctl start nfs-secure-server;

systemctl enable nfs-secure-server


vim /etc/exports

/public    *(rw,sec=krb5p)

exportfs -rv


在desktop上:

开启kerberos认证,得到ldap用户

 nfs_其他_15

 nfs_nfs_16

 nfs_其他_17

wegt http://172.25.254.254./pub/keytabs/server0.keytab -O  

/etc/krb5.keytab 

ktutil

systemctl start nfs-secure-server;

systemctl enable nfs-secure-server

 nfs_nfs_18

mount 172.25.254.244:/public /mnt  -o  sec=krb5p

su - kiosk/student

cd /mnt

su - ldapuser1

klist

 nfs_其他_19

 nfs_nfs_20