Linux 中网络文件系统(samba nfs 和 iscsi)

Posted 123坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 中网络文件系统(samba nfs 和 iscsi)相关的知识,希望对你有一定的参考价值。

1. samba

1.1 samba 服务简介

  1. smb = Server Message Block(服务器消息块);
  2. cifs = Common Internet File System(通用因特网文件系统);
  3. Windows系统共享文件时用到的协议是smb;
    Linux使用的协议是cifs;
  4. smb服务主要的作用是是使客户机可以通过该服务访问服务器上的文件共享系统;
  5. cifs 客户端可以访问服务器上的文件并要求服务器提供服务,cifs是 smb 的一种特殊实现,所以 smb 和 cifs 的客户端之间可以相互访问,但是 ntf 客户端是无法直接和 smb 服务器交互的;
  6. nfs用于linux系统和客户端之间的连接,而windows和linux客户端混合使用时,就应该用samba;
  7. apache和ftp的文件共享都需要依赖于客户端使用工具去访问,不能在客户端直接挂载。要实现挂载就需要把整个文件系统共享,samba 和 nfs 可以实现文件系统共享,而 iscsi 可以实现整个设备的共享。这就是企业中的存储分离,举个简单的例子,就像是我们在某台主机上注册了账号等信息,若这台主机突然宕机,我们依旧可以实现在另一台主机上使用之前注册的账号登陆。

1.2 samba 基本信息

基本信息含义
smb.service服务启动脚本
/etc/samba主配置目录
/etc/smb.conf主配置文件
samba_share_t安全上下文
139、445端口
samba、samba-common安装包

1.3 samba 的安装与启用

做本节实验时,selinux 是开启的强制状态。

  1. samba 服务端、客户端以及工具包安装
[root@kkk ~]# getenforce
Enforcing
[root@kkk ~]# dnf install samba.x86_64 samba-common.noarch samba-client.x86_64 -y
##安装
  1. 服务的开启以及将 samba 服务添加到火墙策略中
[root@kkk ~]# systemctl enable --now smb.service 
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.
[root@kkk ~]# firewall-cmd --permanent --add-service=samba
success
[root@kkk ~]# firewall-cmd --reload 
success
[root@kkk ~]# firewall-cmd --list-all 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: cockpit dhcpv6-client samba ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

1.4 samba用户的建立

samba 用户必须是本机用户;

命令含义
smbpasswd -a zxk添加用户
pdbedit -L查看用户列表
pdbedit -x westos删除用户
  1. 创建
[root@kkk ~]# id zxk
uid=1000(zxk) gid=1000(zxk) groups=1000(zxk)
[root@kkk ~]# id westos
uid=1001(westos) gid=1001(westos) groups=1001(westos)
[root@kkk ~]# id kkk
id: ‘kkk’: no such user
[root@kkk ~]# smbpasswd -a kkk		##不是本地用户创建不了
New SMB password:
Retype new SMB password:
Failed to add entry for user kkk.
[root@kkk ~]# smbpasswd -a zxk
New SMB password:
Retype new SMB password:
Added user zxk.
[root@kkk ~]# smbpasswd -a westos
New SMB password:
Retype new SMB password:
Added user westos.
  1. 列出
[root@kkk ~]# pdbedit -L
zxk:1000:zxk
westos:1001:
  1. 删除
[root@kkk ~]# pdbedit -L
zxk:1000:zxk
westos:1001:
[root@kkk ~]# pdbedit -x westos
[root@kkk ~]# pdbedit -L
zxk:1000:zxk

1.5 samba 用户访问家目录

先用命令来列出:

在这里插入图片描述
从上图中可以看出,当不添加用户时,此时没有可用的信息,当用 zxk 用户访问时,有可用的信息;

此时来访问用户的家目录,ip 后面的目录,就是该smb用户的家目录,可以直接登陆查看;

[root@kkk ~]# smbclient  //172.25.254.150/zxk -U zxk
Enter SAMBA\\zxk's password: 
Try "help" to get a list of possible commands.
smb: \\> ls
NT_STATUS_ACCESS_DENIED listing \\*
smb: \\> 

进入后可以看到在列出文件时,受到了权限限制,无法访问加目录,这是因为 selinux 默认不允许samba访问自己的家目录,需要设定为开启;

在这里插入图片描述

1.6 samba 服务共享目录

默认情况下用户的家目录是共享出去的,此时如果需要共享自己新建的目录,就需要做如下设定;

  1. 共享自己创建的目录
    (1)建立新的共享目录,并在文件中写入一定的内容;
[root@kkk ~]# mkdir /westos
[root@kkk ~]# cd /westos/
[root@kkk westos]# touch westosfile{1..5}
[root@kkk westos]# ls
westosfile1  westosfile2  westosfile3  westosfile4  westosfile5

(2)此时 selinux 处于开启状态时,若想共享自己建立的目录,必须修改安全上下文支持 smb 服务,修改完成后刷新/westos目录:

[root@kkk westos]# semanage fcontext -a -t samba_share_t '/westos(/.*)?'
[root@kkk westos]# restorecon -RvvF /westos
Relabeled /westos from unconfined_u:object_r:default_t:s0 to system_u:object_r:samba_share_t:s0
Relabeled /westos/westosfile1 from unconfined_u:object_r:default_t:s0 to system_u:object_r:samba_share_t:s0
Relabeled /westos/westosfile2 from unconfined_u:object_r:default_t:s0 to system_u:object_r:samba_share_t:s0
Relabeled /westos/westosfile3 from unconfined_u:object_r:default_t:s0 to system_u:object_r:samba_share_t:s0
Relabeled /westos/westosfile4 from unconfined_u:object_r:default_t:s0 to system_u:object_r:samba_share_t:s0
Relabeled /westos/westosfile5 from unconfined_u:object_r:default_t:s0 to system_u:object_r:samba_share_t:s0

(3)修改完安全上下文后,进入主配置目录,将smb.conf主配置文件复制成smb.conf.bak,再将将模板复制成 smb.conf 主配置文件,防止想恢复时不好恢复:

[root@kkk westos]# cd /etc/samba/
[root@kkk samba]# ls
lmhosts  smb.conf  smb.conf.example
[root@kkk samba]# mv smb.conf smb.conf.back
[root@kkk samba]# ls
lmhosts  smb.conf.back  smb.conf.example
[root@kkk samba]# mv smb.conf.example samba.conf
[root@kkk samba]# ls
lmhosts  smb.conf  smb.conf.back

(4)编辑配置文件
其中 ’[ ]’ 里的内容是共享时可以被客户端看到的名称;comment 是对该目录的说明;path是共享目录的路径:

[root@kkk samba]# vim samba.conf
315         [WESTOS]
316         comment = local dir westos
317         path = /westos

在这里插入图片描述
在这里插入图片描述

(5)重启服务
使用之前添加的 smb 用户查看服务器共享的目录;然后再进入该共享目录查看内容:

[root@kkk samba]# systemctl restart smb.service 
[root@kkk samba]# smbclient  -L //172.25.254.150  -U zxk

在这里插入图片描述

  1. 共享系统中存在的目录

编辑配置文件,添加一个系统级的共享目录:

[root@kkk samba]# vim smb.conf
319         [MNT]
320         comment = /mnt dir
321         path = /mnt
[root@kkk samba]# ls /mnt/
[root@kkk samba]# touch /mnt/zxkll{1..4}
[root@kkk samba]# ls /mnt/
zxkll1  zxkll2  zxkll3  zxkll4
[root@kkk samba]# ls -Z /mnt/
unconfined_u:object_r:mnt_t:s0 zxkll1  unconfined_u:object_r:mnt_t:s0 zxkll3
unconfined_u:object_r:mnt_t:s0 zxkll2  unconfined_u:object_r:mnt_t:s0 zxkll4

在这里插入图片描述
访问测试:
(1)重启服务后,查看共享目录:

[root@kkk samba]# systemctl restart smb.service 
[root@kkk samba]# smbclient  -L //172.25.254.150  -U zxk
[root@kkk samba]# smbclient   //172.25.254.150/MNT  -U zxk

可以看到如图所示,可以看到 MNT 共享目录名,但是进入后无显示内容;
这也是因为 selinux 造成的原因,但是由于是系统目录,不能修改目录安全上下文,会造成一些系统问题;

在这里插入图片描述
解决方法是打开 selinux 的 samba_export_all_ro 功能,表示smb开启对所有文件读的功能,不管是否符合安全上下文,开启后 samba 服务将不再受安全上下文的影响;

[root@kkk samba]# getsebool -a | grep samba
[root@kkk samba]# setsebool -P samba_export_all_ro on

在这里插入图片描述
此时再次查看 /MNT 内容时,便可以看到:

在这里插入图片描述

1.7 samba 的访问控制

在生产环境中,默认情况下 samba 服务允许任何用户访问,这是不合理的;通过对对不同 ip 进行访问控制,用设置用户的黑白名单的方式来进行限制;
此处用用另一台 samba 客户端进行测试,客户端需要安装 samba-client 软件。

  1. 全局访问控制
    (1)可以使用不同 ip 的主机去访问smb服务器共享出来的目录,在没有设置访问控制前默认任何主机都是可以访问到的:
[root@localhost ~]# dnf install samba-client -y
[root@localhost ~]# smbclient -L //172.25.254.150 
Enter SAMBA\\root's password: 
Anonymous login successful

	Sharename       Type      Comment
	---------       ----      -------
	WESTOS          Disk      local dir westos
	MNT             Disk      /mnt dir
	IPC$            IPC       IPC Service (Samba Server Version 4.11.2)
SMB1 disabled -- no workgroup available
[root@localhost ~]# smbclient  //172.25.254.150/MNT -U zxk
Enter SAMBA\\zxk's password: 
Try "help" to get a list of possible commands.
smb: \\> ls
  .                                   D        0  Tue May  4 15:57:51 2021
  ..                                  D        0  Tue May  4 15:04:19 2021
  zxkll1                              N        0  Tue May  4 15:57:51 2021
  zxkll2                              N        0  Tue May  4 15:57:51 2021
  zxkll3                              N        0  Tue May  4 15:57:51 2021
  zxkll4                              N        0  Tue May  4 15:57:51 2021

		19936256 blocks of size 1024. 15425480 blocks available
smb: \\> 

(2)编辑主配置文件
在全局配置部分,写入如图所示的内容,表示所有 smb 共享只允许在该主机上访问,然后重启服务;若有多个想要设置的用户,就输入空格,将 ip 写在后面;

白名单

[root@kkk samba]# pwd
/etc/samba
[root@kkk samba]# vim smb.conf		##全局配置,白名单

 91         hosts allow = 172.25.254.150

此时再次访问时,只有该主机可以访问,其他的不能访问;

[root@kkk samba]# smbclient   //172.25.254.150/MNT  -U zxk
Enter MYGROUP\\zxk's password: 
Try "help" to get a list of possible commands.
smb: \\> ls
  .                                   D        0  Tue May  4 15:57:51 2021
  ..                                  D        0  Tue May  4 15:04:19 2021
  zxkll1                              N        0  Tue May  4 15:57:51 2021
  zxkll2                              N        0  Tue May  4 15:57:51 2021
  zxkll3                              N        0  Tue May  4 15:57:51 2021
  zxkll4                              N        0  Tue May  4 15:57:51 2021

		19936256 blocks of size 1024. 15425464 blocks available
		
[root@localhost ~]# smbclient  //172.25.254.150/MNT -U zxk	
Enter SAMBA\\zxk's password: 
tree connect failed: NT_STATUS_ACCESS_DENIED

黑名单

[root@kkk samba]# pwd
/etc/samba
[root@kkk samba]# vim smb.conf		##全局配置,白名单
 91         hosts deny = 172.25.254.150

在这里插入图片描述

[root@kkk samba]# smbclient   //172.25.254.150/MNT  -U zxk
Enter MYGROUP\\zxk's password: 
tree connect failed: NT_STATUS_ACCESS_DENIED

[root@localhost ~]# smbclient  //172.25.254.150/MNT -U zxk
Enter SAMBA\\zxk's password: 
tree connect failed: NT_STATUS_ACCESS_DENIED
[root@localhost ~]# smbclient  //172.25.254.150/MNT -U zxk
Enter SAMBA\\zxk's password: 
Try "help" to get a list of possible commands.
smb: \\> ls
 .                                   D        0  Tue May  4 15:57:51 2021
 ..                                  D        0  Tue May  4 15:04:19 2021
 zxkll1                              N        0  Tue May  4 15:57:51 2021
 zxkll2                              N        0  Tue May  4 15:57:51 2021
 zxkll3                              N        0  Tue May  4 15:57:51 2021
 zxkll4                              N        0  Tue May  4 15:57:51 2021

   	19936256 blocks of size 1024. 15425396 blocks available
smb: \\> 

此时再次访问时,其他主机都可以访问,只有写入的 ip 用户不能访问;

  1. 局部访问控制
    以上的控制都是针对全局的共享限制;当将访问权限写到单独共享处时,则只对此目录共享生效,将之前全局部分写入的内容注释掉;
[root@kkk samba]# vim smb.conf
316         [WESTOS]
317         comment = local dir westos
318         path = /westos
319         hosts allow = 172.25.254.150
320         [MNT]
321         comment = /mnt dir
322         path = /mnt

在这里插入图片描述表示只对 westos 目录做了限制,只允许 150 号主机访问 westos,其他主机都不可以;

在这里插入图片描述
在这里插入图片描述
除了以上的权限设定之外还有对于用户的限定 valid users = zxk 以及针对组的限定 valid users = +zxk

1.8 samba 的常用配置参数

配置参数含义
writable = yes可写(建立、删除)
write list = westos指定用户可写
write list = +westos/@westos指定组可写
valid users = lee指定访问用户
valid users = +lee/@lee前面加+/@符号,表示指定访问组
browseable = yes/no是否隐藏共享,不需要重启服务
map to guest = bad user允许匿名用户访问,写到全局设定中
guest ok = yes允许匿名用户访问,写在某个设定的目录中
admin users = westos指定此共享的超级用户身份
  1. 基于用户的权限
    在系统级共享目录下写入 valid users = zxk,表示基于用户的共享,也就是只有该用户可以访问该共享,其他用户不能访问:
[root@kkk samba]# vim smb.conf
316         [WESTOS]
317         comment = local dir westos
318         path = /westos
319 ;       hosts allow = 172.25.254.150    
320         valid users = zxk
321         [MNT]
322         comment = /mnt dir
323         path = /mnt

重启服务,使用 zxk 用户访问 WESTOS 目录,可以访问,使用其他 smb 用户无法访问该目录的;

[root@localhost ~]# smbclient  //172.25.254.150/WESTOS -U zxk
Enter SAMBA\\zxk's password: 
Try "help" to get a list of possible commands.
smb: \\> ls
  .                                   D        0  Tue May  4 15:04:38 2021
  ..                                  D        0  Tue May  4 15:04:19 2021
  westosfile1                         N        0  Tue May  4 15:04:38 2021
  westosfile2                         N        0  Tue May  4 15:04:38 2021
  westosfile3                         N        0  Tue May  4 15:04:38 2021
  westosfile4                         N        0  Tue May  4 15:04:38 2021
  westosfile5                         N        0  Tue May  4 15:04:38 2021

		19936256 blocks of size 1024. 15425464 blocks available
smb: \\> quit
[root@localhost ~]# smbclient  //172.25.254.150/WESTOS -U westos
Enter SAMBA\\westos's password: 
tree connect failed: NT_STATUS_ACCESS_DENIED
  1. 基于用户组的权限
    编辑主配置文件,在系统级共享目录下写入valid users = +zxk 或者valid users = @zxk,都表示只有该组的用户可以访问该共享,其他组用户不能访问。
[root@kkk samba]# vim smb.conf
316         [WESTOS]
317         comment = local dir westos
318         path = /westos
319 ;       hosts allow = 172.25.254.150    
320         valid users = +zxk
321         [MNT]
322         comment = /mnt dir
323         path = /mnt

如图,当 zxk 组不属于 westos用户时,此时没有访问权限;当为其增加附加组身份之后,此时便可以成功访问;

在这里插入图片描述

修改权限,为了说明 samba 服务的问题,排除本地文件系统的干扰。

[root@kkk ~]# ls -ld /mnt/
drwxr-xr-x. 2 root root 62 May  4 15:57 /mnt/
[root@kkk ~]# ls -ld /westos/
drwxr-xr-x. 2 root root 101 May  4 15:04 /westos/
[root@kkk ~]# chmod 777 /westos/
[root@kkk ~]# ls -ld /westos/
drwxrwxrwx. 2 root root 101 May  4 15:04 /westos/
  1. 写的权限

虽然文件系统的权限已经设定为了 777,但此时还是不能写;

在这里插入图片描述
编辑主配置文件,设定“writable = yes ”所有用户对/westos目录可写;
:可写指的是smb用户可写,目录本身是否可写要看本地文件系统的权限。

[root@kkk samba]# vim smb.conf
        [WESTOS]
        comment = local dir westos
        path = /westos
;       hosts allow = 172.25.254.150    
;       valid users = +zxk
        writeable = yes
        [MNT]
        comment = /mnt dir
        path = /mnt

修改之后,此时在重新挂载之后,便可写;如图所示:

在这里插入图片描述

  1. 指定用户写的权限
    编辑主配置文件,设定“write list = westos”表示 westos 目录对指定用户可写,其他用户不可以;
[root@kkk samba]# vim smb.conf
        [WESTOS]
        comment = local dir westos
        path = /westos
;       hosts allow = 172.25.254.150    
;       valid users = +zxk
;       writeable = yes
        write list = westos
        [MNT]
        comment = /mnt dir
        path = /mnt

如图所示,当用 zxk 用户写入时不可以,只有 westos 用户可写;

在这里插入图片描述
除了指定用户写的权限外,和上面类似还有指定用户组写的权限。

  1. 隐藏共享资源
    在 samba 服务中,默认是不会隐藏共享资源的;编辑主配置文件,设定"browseable = no"表示隐藏共享资源;

        [WESTOS]
        comment = local dir westos
        path = /westos
;       hosts allow = 172.25.254.150    
;       valid users = +zxk
;       writeable = yes
        write list = westos
        [MNT]
        comment = /mnt dir
        path = /mnt
        browseable = no

如图所示,再没有更改文件之前,是可以访问所有的;当加入内容之后,就隐藏了 /MNT 目录;

在这里插入图片描述

  1. 允许匿名用户访问
    编辑主配置文件,在[global]全局里面输入 “map to guest = bad user”,表示所有匿名身份指向为 guest,不能在非全局处写该参数,否则会出现问题无法挂载。在 WESTOS 共享资源处输入 “guest ok = yes”,表示允许匿名用户访问,当这两个参数设置后,才表示匿名用户允许访问;

在这里插入图片描述

在这里插入图片描述

此时便可用匿名用户进行挂载;

在这里插入图片描述

1.9 samba 的多用户挂载

在客户端如果用以上的挂载方式,没有j经过 samba 服务认证的其他用户也可以访问已认证用户挂载的 samba 中的内容,而且smb用户的用户名和密码也直接显示在外面,这种方式不安全;
所以就需要通过设置特殊参数,使用户名密码等信息不会被直接看到,并且其他用户在没有 samba 认证时不能看已认证用户挂载的samba 内容。

在这里插入图片描述

恢复前面的配置,此处来观察效果;

在这里插入图片描述

  1. 挂载安全设定
    (1)在客户端安装 samba 认证的安全插件
[root@localhost ~]# dnf install cifs-utils -y

用命令 man mount-cifs查看帮助
(2)编辑文件 /root/smb_auth,该文件名可自定义,将用户名和密码存入;

如图所示,将用户名和密码写入文件,给文件修改权限,只有文件的所有人有权限,在挂载的时候便可以用参数来指定文件来挂载,而不用将用户名和密码显示在 history 中;

在这里插入图片描述

(3)但是这种方法还是没有解决挂载用户只能浏览自己挂载的问题,那么接下来就要设定多用户挂载

[root@localhost ~]# umount /media 
[root@localhost ~]# mount //172.25.254.150/WESTOS /media  -o credentials=/root/smb_auth,multiuser
[root@localhost ~]# df
[root@localhost ~]# su - zxk
[zxk@localhost ~]$ cd /media 
[zxk@localhost media]$ ls
[zxk@localhost media]$ exit
logout
[root@localhost ~]# cd /media/
[root@localhost media]# ls
westosfile1  westosfile2  westosfile3  westosfile4  westosfile5  zxk111  zxk222

用参数 multiuser 进行多用户挂载之后,此时只有挂载的用户可以访问信息,其他用户访问不到信息;

在这里插入图片描述
以上设定虽然其他用户访问不到信息,其他用户有账号时也无法挂载,所以应该在加一个参数,让其他用户也可以认证;

[root@localhost ~]# mount //172.25.254.150/WESTOS /media  -o credentials=/root/smb_auth,multiuser,sec=ntlmssp
[root@localhost ~]# su - zxk
[zxk@localhost media]$ cifscreds add -u westos 172.25.254.150

在这里插入图片描述

当认证错误时,需要删除时用 cifscreds clear -u westos 172.25.254.150

多用户认证结束之后,当有写的权限时,用那个用户新建的文件,在服务端查看时就属于那个用户。

2 NFS

Net File System

2.1 nfs 基本信息

基本信息含义
nfs-utils安装包
nfs-server服务脚本
/etc/exports共享配置文件

2.2 nfs 的启用

  1. 在服务端安装nfs软件
    在系统中默认是已经安装过的;

在这里插入图片描述

  1. 开启
[root@kkk ~]# systemctl enable --now nfs-server.service 
[root@kkk ~]# showmount -e 172.25.254.150

在这里插入图片描述

  1. 在火墙策略中添加 rpc-bind、mountd、nfs服务。
    rpc-bind 是分发端口,mountd 来挂载,nfs 来共享;
linux 简单记录11 --使用 Samba 或 NFS 实现文件共享

第四阶段 11_Linux NFS Linux之间文件共享

linux初学者-NFS网络文件系统篇

nfs 和samba

Linux如何详细搭建samba服务

NFS 网络共享文件服务搭建