Linux 中网络文件系统(samba nfs 和 iscsi)
Posted 123坤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 中网络文件系统(samba nfs 和 iscsi)相关的知识,希望对你有一定的参考价值。
Linux 中网络文件系统
1. samba
1.1 samba 服务简介
- smb = Server Message Block(服务器消息块);
- cifs = Common Internet File System(通用因特网文件系统);
- Windows系统共享文件时用到的协议是smb;
Linux使用的协议是cifs; - smb服务主要的作用是是使客户机可以通过该服务访问服务器上的文件共享系统;
- cifs 客户端可以访问服务器上的文件并要求服务器提供服务,cifs是 smb 的一种特殊实现,所以 smb 和 cifs 的客户端之间可以相互访问,但是 ntf 客户端是无法直接和 smb 服务器交互的;
- nfs用于linux系统和客户端之间的连接,而windows和linux客户端混合使用时,就应该用samba;
- 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 是开启的强制状态。
- samba 服务端、客户端以及工具包安装
[root@kkk ~]# getenforce
Enforcing
[root@kkk ~]# dnf install samba.x86_64 samba-common.noarch samba-client.x86_64 -y
##安装
- 服务的开启以及将 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 | 删除用户 |
- 创建
[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.
- 列出
[root@kkk ~]# pdbedit -L
zxk:1000:zxk
westos:1001:
- 删除
[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)建立新的共享目录,并在文件中写入一定的内容;
[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
- 共享系统中存在的目录
编辑配置文件,添加一个系统级的共享目录:
[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)可以使用不同 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 用户不能访问;
- 局部访问控制
以上的控制都是针对全局的共享限制;当将访问权限写到单独共享处时,则只对此目录共享生效,将之前全局部分写入的内容注释掉;
[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 | 指定此共享的超级用户身份 |
- 基于用户的权限
在系统级共享目录下写入 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
- 基于用户组的权限
编辑主配置文件,在系统级共享目录下写入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/
- 写的权限
虽然文件系统的权限已经设定为了 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
修改之后,此时在重新挂载之后,便可写;如图所示:
- 指定用户写的权限
编辑主配置文件,设定“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 用户可写;
除了指定用户写的权限外,和上面类似还有指定用户组写的权限。
- 隐藏共享资源
在 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 目录;
- 允许匿名用户访问
编辑主配置文件,在[global]全局里面输入“map to guest = bad user”
,表示所有匿名身份指向为 guest,不能在非全局处写该参数,否则会出现问题无法挂载。在 WESTOS 共享资源处输入“guest ok = yes”
,表示允许匿名用户访问,当这两个参数设置后,才表示匿名用户允许访问;
此时便可用匿名用户进行挂载;
1.9 samba 的多用户挂载
在客户端如果用以上的挂载方式,没有j经过 samba 服务认证的其他用户也可以访问已认证用户挂载的 samba 中的内容,而且smb用户的用户名和密码也直接显示在外面,这种方式不安全;
所以就需要通过设置特殊参数,使用户名密码等信息不会被直接看到,并且其他用户在没有 samba 认证时不能看已认证用户挂载的samba 内容。
恢复前面的配置,此处来观察效果;
- 挂载安全设定
(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 的启用
- 在服务端安装nfs软件
在系统中默认是已经安装过的;
- 开启
[root@kkk ~]# systemctl enable --now nfs-server.service
[root@kkk ~]# showmount -e 172.25.254.150
- 在火墙策略中添加 rpc-bind、mountd、nfs服务。
rpc-bind 是分发端口,mountd 来挂载,nfs 来共享;
linux 简单记录11 --使用 Samba 或 NFS 实现文件共享