SMB(Server Messages Block,信息服务块)是一种在局域网中实现共享文件和打印机的通信协议,能为局域网内的不同计算机之间提供文件及打印机等资源的共享服务,但SMB协议是Windows的私有协议,无法直接在Linux中使用。利用SAMBA,可在Linux系统中模拟Windows的共享服务,提供SMB协议。

    笔者准备了两台虚拟机,其中CentOS8虚拟机作为SAMBA服务器,取名samba;CentOS7作为客户端,取名client。

  1. SAMBA服务器端

1.1 安装samba

    samba主机安装samba服务端包,安装完毕,包里会有两个service文件,其中smb.service是与共享服务相关的文件,nmb.service是与名称解析有关的,如果要使用域名来进行访问需开启此服务。本次实验不涉及名称解析,直接访问ip,故只启用smb.service服务,开启服务后,会发现多出了139端口和445端口。

配置SAMBA共享,实现/www目录共享_共享文件

配置SAMBA共享,实现/www目录共享_共享文件_02

1.2 创建登录账号

    与上一篇vsftpd服务类似,SAMBA服务也需使用专有账号进行登录,并且SAMBA服务中的虚拟用户必须首先是Linux用户,同时建议将shell类型设为/sbin/nologin。给SAMBA登录账号添加密*码要用到smbpasswd -a username命令(删除SAMBA账号用smbpasswd -x username命令,删除密*码用pdbedit  -x -u username命令,修改密*码用smbpasswd username命令)pdbedit -L命令可查看已有的SAMBA登录账号。

配置SAMBA共享,实现/www目录共享_共享文件_03

1.3 修改SAMBA共享配置文件

    SAMBA共享服务的配置文件为/etc/samba/smb.conf,因为是指定/www目录共享,所以需先创建该目录,笔者这边顺便在该目录下创建一个test1.txt文件看效果。同时在共享服务配置文件中定义共享相关的内容,添加共享名和真实文件夹的路径。

配置SAMBA共享,实现/www目录共享_共享文件_04


  1. SAMBA客户端

2.1 安装SAMBA客户端包

    SAMBA服务的客户端端包为samba-client,安装完毕后,执行smbclient -L ip -U user%password 命令可查看共享目录的相关情况,例如共享目录名、SAMBA版本、使用哪个账号查看等。

配置SAMBA共享,实现/www目录共享_共享文件_05

配置SAMBA共享,实现/www目录共享_上传_06

2.2 下载及上传测试

    客户端执行smbclient //ip/share-file-name -U user%password命令可登录SAMBA服务,可以查看到test1.txt文件,也可以下载文件,在实际生产中,如果只是想让共享目录提供查阅和下载功能,以上设置已经能满足需求。但如果涉及到写操作,例如进行文件的上传等,以上设置则无法实现该功能。

配置SAMBA共享,实现/www目录共享_客户端_07


  1. 共享目录权限相关

3.1 给予所有账号写权限

    要想实现基于网络的写操作,需要文件系统自身和SAMBA服务都具有写权限。笔者这边直接将权限改为777,使haha和heihei都有写权限;同时修改/etc/samba/smb.conf配置文件,在之前添加的内容下方加一条“writable=yes”或者“read only=no”。

配置SAMBA共享,实现/www目录共享_上传_08

    此时客户端再次登录SAMBA服务,已经可以进行写操作,进行文件的上传。

配置SAMBA共享,实现/www目录共享_共享文件_09

配置SAMBA共享,实现/www目录共享_上传_10

配置SAMBA共享,实现/www目录共享_客户端_11

3.2 给予特定账号写权限

    如果只是想给予部分用户写权限,SAMBA服务器端可在/etc/samba/smb.conf配置文件中将上面添加的“writable=yes”改为“writable=no”,或者删除此行,同时添加可进行写操作的账号列表,如果是多个用户,中间用逗号隔开,如果是授权组具有写权限,组名前加上@符号或者+符号。例如笔者希望只有haha有写权限,而heihei没有写权限。

配置SAMBA共享,实现/www目录共享_客户端_12

    客户端使用haha账号登录后,依旧可以进行文件的上传,但heihei账号已经无法进行上传的操作了。

配置SAMBA共享,实现/www目录共享_共享文件_13

配置SAMBA共享,实现/www目录共享_上传_14

3.3 所有人均可登录访问

    如果想让所有人在不使用登录名和密*码的情况下都能访问,SAMBA服务器端可在/etc/samba/smb.conf添加“public=yes”一行。此时客户端执行smbclient //ip/share-file-name命令即可登录,提示输入密*码部分直接按空格键跳过。匿名登录后,可查看、可下载,由于SAMBA服务未给其他用户写权限,故不可进行上传操作。

配置SAMBA共享,实现/www目录共享_共享文件_15

配置SAMBA共享,实现/www目录共享_客户端_16

3.4 特定账号可访问

    SAMBA服务器端在/etc/samba/smb.conf中添加“valid users”列表,可设置指定账号能访问共享目录。例如笔者这边设置只有haha账号可访问,使用haha账号登录时是正常的,但使用heihei账号登录则会报错。

配置SAMBA共享,实现/www目录共享_客户端_17

配置SAMBA共享,实现/www目录共享_客户端_18

3.4 隐藏共享文件名

    客户端执行smbclient -L ip命令是可以看到目标主机上的共享文件名的。

配置SAMBA共享,实现/www目录共享_共享文件_19

    从安全角度出发,SAMBA服务器端可修改/etc/samba/smb.conf配置文件,添加“browsable=no”一行,即任何人都无法查看共享文件名,此时客户端再次执行smbclient -L ip命令已经不显示共享文件名。

配置SAMBA共享,实现/www目录共享_客户端_20

配置SAMBA共享,实现/www目录共享_客户端_21

    共享文件名隐藏了,不代表登录时不需要加,只有知道共享文件名,并使用账号和密*码的情况下才可登录,相对也更加安全。

配置SAMBA共享,实现/www目录共享_上传_22


  1. SAMBA服务永久挂载

    上述的实验相当于通过临时性的挂载来进行SAMBA服务器中/www目录的访问,要想实现SAMBA服务的永久挂载,客户端需要安装cifs-utils包,并将永久挂载写入到/etc/fstab中。/etc/fstab文件中,需写明目标主机的ip和共享文件名、本机的挂载点,为了安全起见,可将登录名和密*码放到其他文件中,并修改为600权限,如果想简单点,也可将credentials部分改为“username=haha,password=123456”。

配置SAMBA共享,实现/www目录共享_客户端_23

配置SAMBA共享,实现/www目录共享_共享文件_24

    添加完目标主机在本机的挂载信息,执行mount -a命令进行挂载,此时查看挂载相关的信息,目标主机上的共享文件夹已经挂载到本机/mnt/share目录下。在不登录账号的情况,可直接查看或者拷贝挂载点下的文件(即SAMBA服务器/www目录下文件),由于未登录,相当于匿名账号,故无法进行写操作。

配置SAMBA共享,实现/www目录共享_共享文件_25

配置SAMBA共享,实现/www目录共享_共享文件_26