一、介绍:
在早期的网络世界中,文件数据在不同主机之间的传输大多是使用ftp,但是使用ftp服务传输档案使得我们无法直接修改主机上面的档案数据。NFS服务可以实现在客户端的机器上直接使用服务器上面的文件,但是NFS主要在unix系列操作系统上使用。windows上面也有类似的文件系统,那就是cifs(Common Internet File system,通用internet文件系统),cifs的最简单的用途就是“网上邻居”,但是cifs只能让windows机器沟通。所以,为了实现windows和unix系列系统之间能够相互沟通,就产生了samba服务。
samba是架构在NetBIOS(Network Basic Input/Output System,网上基本输入输出系统)这个通信协议上面所开发出来的。NetBIOS是由IBM发展出来,目的是要让局域网络内少数计算机进行网络连接的一个通信协议,因此NetBIOS是无法跨越路由的,而现在Samba不仅能与局域网主机分享资源,还能与全世界的电脑分享资源,就是由NetBIOS ove TCP/IP技术解决。由于NetBIOS在局域网内实在是很好用,所以微软的网络架构就使用了这个协议。而samba最早发展的时候,其实是想要让linux系统可以加入windows的系统当中来共享使用彼此的文件数据,所以samba就架构在NetBIOS发展出来了。
samba的主要功能如下:
- 进行文件共享。
- 可以提供使用者登入samba主机时的身份认证,以提供不同身份的个别资料。
- 可以进行windows网络上的主机名称解析(NetBIOS name)。
NetBIOS当初发展就着眼在局域网内的快速数据交流,而因为是定义在局域网内,因此它并没有使用类似TCP/IP之类的传输协议,也就不需要IP的设置。这样一来数据如何在两台主机间交流呢?其实主机在NetBIOS协议当中的定义为使用“NetBIOS Name”,每一台主机必须要有不同的NetBIOS Name才行。假设使用网上邻居来设置文件数据的访问,想要登录某台计算机使用它所提供的文件数据时,必须要加入该计算机的工作组,并且需要给自己的机器设置一个NetBIOS Name,在同一个组中,NetBIOS Name是独一无二的。是否能登录对方主机或者是使用对方主机所提供的资源,还要看对方主机有没有提供我们使用的权限。
Samba通过两个服务来控制管理工作组和Samba主机共享的目录,分别是:
- nmbd:这个服务是来管理工作组、NetBIOS Name等的解析。主要利用UDP协议开启port137、port138来负责名称解析的任务。
- smbd:这个服务的主要功能是用来管理samba主机共享的目录、文件与打印机等。主要利用可靠的TCP协议来传输数据,开放的端口为139和445(不一定存在)。
Samba服务的相关软件包说明:
- Samba:该软件主要提供了smb服务器所需的各项服务程序(smbd及nmbd)、相关的文件。
- Samba-client:这个软件提供了当linux作为samba client时,所需要的工具命令。例如挂载samba文件格式的mount.cifs。
- Samba-common:这个软件提供的则是服务器与客户端都会使用到的数据,包括samba的主要配置文件(smb.conf)等。
Samba服务的主配置文件:/etc/samba/smb.conf //在该文件中,“#”和“;”都是注释符号;且不区分大小写。
主配置文件的内容:
1、[global]定义全局性配置:
[global]
workgroup = MYGROUP //设定 Samba Server 所要加入的工作组或者域
server string = Samba Server Version %v //主机的简易说明
; netbios name = MYSERVER //主机的NetBIOS名称
; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 //设置samba服务器监听的网卡,可以写网卡名称或ip地址
; hosts allow = 127. 192.168.12. 192.168.13. //设置允许连接到samba服务器的客户端
【hosts deny = 可以设置不允许连接到samba服务器的客户端】
log file = /var/log/samba/log.%m //产生日志文件的命名
max log size = 50 //定义日志文件最大容量(单位是KB,如果是0表示不限制)
security = user //设置用户访问samba服务器的验证方式,一共四种,他们的验证方式如下:
share:用户访问samba server不需要提供用户名和密码,安全性能较低,deprecated(已弃用)
user:samba server共享目录只能被授权的用户访问,由samba server负责检查账号和密码的正确性。账号和密码要在samba server中建立
server:和user安全级别类似,但用户名和密码是递交到另外的server去验证,如果递交失败,就退到user安全级别,deprecated(已弃用)
domain:这个安全级别要求网络上存在一台windows的主域控制器,samba把用户名和密码递交给它去验证。
passdb backend = tdbsam //密码文件已经转为使用数据库了,默认的数据库格式为tdbsam,默认的文件放置到/var/lib/samba/private/passwd.tdb。
load printers = yes //设置在samba服务启动时是否共享打印机设备
cups options = raw //打印机的选项
2、[homes] 定义对用户家目录的共享配置(由于在linux上面每位用户均有家目录,例如user1的用户主目录为/home/user1,当user1使用samba时,就会发现多了个//127.0.0.1/user1/的资源可用,由于设置的不可浏览,除了自己能看见自己的家目录,别人是不可以浏览的):
[homes]
comment = Home Directories
browseable = no
writable = yes
3、[printers] 定义打印机共享配置:
[printers]
comment = All Printers
path = /var/spool/samba //打印的文件队列暂时放到该目录下
browseable = no
guest ok = no //游客是否能打印
writable = no
printable = yes
为了简化设置,samba提供很多不同的变量供我们使用:
符号 | 释义 | 符号 | 释义 |
%m | 客户端主机的NetBIOS名 | %M | 客户端主机的FQDN |
%H | 当前用户家目录路径 | %U | 当前登录的用户的用户名 |
%g | 当前登录的用户所属组 | %h | samba服务器的主机名 |
%L | samba服务器的NetBIOS名 | %I | 客户端主机的IP |
%T | 当前的日期和时间 | %S | 取代当前的[]里面的内容 |
共享文件设置参数:
[share] //自定义共享名称
comment = this is share text //共享描述
path = 所共享的目录路径
public = yes/no //设置共享是否允许guest账号访问
guest ok = yes/no //功能同public一样
browseable = yes/no //是否让所有用户看到这个项目,如果是no就表示隐藏
writable = yes/no //用户是否具有可写权限
read only = yes/no //设置共享是否具有只读权限read only=no和writable = yes等价,如与以上设置发生冲突, 放在后面的设置生效
admin user = root //设置共享的管理员,多用户之间使用逗号隔开。
valid users = username //设置允许访问共享的用户,如果为空,将允许所有用户访问。例如valid users = user1,user2,@group1(多用户和组用逗号分开,@group表示组)
invalid users = username //设置不允许访问共享的用户
write list = username //如果writable=no,该字段中用户或组可读写,例如write list = user1,@group1
create mask = 0700 //创建文件的权限为700
directory mode = 0700 //创建的目录权限为700
实验一:用户家目录共享
要求:你的SMB服务器必须是work工作组的一个成员,任何用户均可以通过samba共享使用密码redhat读取自己的家目录的文件,无法访问其他人的家目录。测试用户为xiaoming和xiaohong。
服务端IP地址:192.168.9.131
客户端IP地址:192.168.9.132
服务端:
[root@server ~]# systemctl stop firewalld
注意:如果防火墙开启,需要添加防火墙规则 firewall-cmd --permanent --add-service=samba
[root@server ~]# setenforce 0
注意:
- Selinux开启的状态下,需要对共享的目录执行:chcon -t samba_share_t /public
- Selinux开启的情况下,需要执行setsebool -P samba_enable_home_dirs on 否则,用户不能进入自己的家目录
装包:
[root@server ~]# yum install samba -y
[root@server ~]# vim /etc/samba/smb.conf
[global]
workgroup = work
security = user
[homes]
browseable = no
writeable = yes
重启服务:
[root@server ~]# systemctl restart smb nmb
添加普通用户
[root@server ~]# useradd xiaoming
[root@server ~]# useradd xiaohong
添加samba用户
1、smbpasswd:使用SMB服务的smbpasswd命令给系统用户设置SMB密码
smbpasswd -a 增加用户
smbpasswd -x 删除用户
2、管理samba用户的数据库
pdbedit -a username //新建samba账户
pdbedit -x username //删除samba账户
pdbedit -L //列出samba用户列表,读取passdb.tdb数据库文件
[root@server ~]# smbpasswd -a xiaoming
[root@server ~]# pdbedit -a xiaohong
[root@server ~]# pdbedit -L
[root@server ~]# touch /home/xiaoming/xiaoming
[root@server ~]# touch /home/xiaohong/xiaohong
客户端测试:
[root@client ~]# yum install samba-client -y
[root@client ~]# smbclient -L //192.168.9.131 //访问被拒绝
Enter root's password:
session setup failed: NT_STATUS_LOGON_FAILURE
[root@client ~]# smbclient -L //172.24.8.151 -U xiaoming //使用xiaoming和xiaohong可以登录
[root@client ~]# smbclient -L //172.24.8.151 -U xiaohong
[root@client ~]# smbclient //172.24.8.151/xiaoming -U xiaoming //可以查看服务端的文件
smb: \> ls
使用不同的用户查看家目录时访问会被拒绝:
[root@client ~]# smbclient //172.24.8.151/xiaohong -U xiaohong
smb: \> mget 文件名(可将文件下载到当前的工作目录)
挂载两个用户的家目录并使用
[root@client ~]# mkdir -pv /share/xiao{hong,ming}
[root@client share]# mount //172.24.8.151/xiaoming /share/xiaoming -o username=xiaoming,password=redhat
[root@client share]# mount //172.24.8.151/xiaohong /share/xiaohong -o username=xiaohong,password=redhat
使用windows访问samba共享:\\服务器ip地址
注:以点开头的都是隐藏文件
实验二:共享自定义目录
要求:你的SMB服务器必须是work工作组的一个成员,共享/public目录,共享名必须为public,任何人都可以浏览,读取该目录下的文件,但是不能删除别人创建的文件,可删除自己创建的文件。
服务端:
[root@server samba]# vim /etc/samba/smb.conf
[public]
path = /public
browseable = yes
writeable = yes
[root@server samba]# mkdir /public/
[root@server samba]# chmod o=rwxt /public
[root@server samba]# systemctl restart smb nmb
客户端测试:
[root@client ~]# smbclient -L //172.24.8.151
Enter root's password:
session setup failed: NT_STATUS_LOGON_FAILURE
[root@client ~]# smbclient //172.24.8.151/public -U xiaoming
[root@client ~]# mkdir /share/public/
分别使用两个已有的用户去挂载测试能否删除别人创建的文件
[root@client ~]# mount //172.24.8.151/public /share/public/ -o username=xiaoming,password=redhat
使用xiaoming挂载并创建xixi文件
[root@client share]# mount //172.24.8.151/public /share/public/ -o username=xiaohong,password=redhat
在使用xiaohong挂载并删除文件,权限不够;最后切回xiaoming能够删除文件
实验三:
要求:你的SMB服务器必须是work工作组的一个成员,共享目录为/tech,共享名为tech,所有人都可以访问,但是只有用户manager和jishubu的人可以向该目录写入文件。jishubu的人员有tech1,密码为redhat。
服务端:
[root@server samba]# vim smb.conf
[tech]
path = /tech
browseable = yes
write list = manager,@jishubu
[root@server samba]# systemctl restart smb nmb
[root@server samba]# useradd manager //添加一个manager用户
[root@server samba]# smbpasswd -a manager
[root@server samba]# groupadd jishubu //加一个jishubu组
[root@server samba]# useradd -g jishubu tech1
[root@server samba]# smbpasswd -a tech1
[root@server samba]# mkdir /tech
[root@server samba]# chown manager:jishubu /tech //修改/tech文件的所属用户和所属组
[root@server samba]# chmod u=rwx,g=rwx,o=r-x /tech //设置权限
客户端测试:
[root@client share]# mkdir -p /share/tech/
[root@client share]# mount //172.24.8.151/tech /share/tech/ -o username=tech1,password=redhat
//manager用户和jihshubu组的人可以创建和删除文件
[root@client share]# umount tech
[root@client share]# mount //172.24.8.151/tech /share/tech -o username=xiaoming,password=redhat
//xiaoming等其他用户只能查看文件
自动挂载:
[root@localhost ~]# vim /etc/fstab
//172.24.8.151/tech /share/tech cifs defaults,username=xiaoming,password=redhat 0 0
cifs(Common Internet File system,通用互联网文件系统)
实验四:多用户挂载
将实验三的共享永久挂载在客户端的目录,并使用用户 xiaoming 作为认证用户,可以通过用户manager和jishubu的人来临时获取写的权限
客户端:
[root@localhost ~]# yum install cifs-utils -y
[root@localhost ~]# vim /etc/fstab //自动挂载的相关文件
//172.24.8.128/tech /share/tech cifs defaults,multiuser,username=xiaoming,password=redhat,sec=ntlmssp 0 0
multiuser:表示提供对客户端多个用户身份的区分支持
sec=ntlmssp:提供NT局域网管理安全支持
[root@localhost ~]# mount -a
[root@localhost ~]# cd /share/tech/
[root@localhost tech]# ll
total 0
-rw-r--r--. 1 1002 1002 0 Jul 21 14:05 file
[root@localhost tech]# touch file2
touch: cannot touch ‘file2’: Permission denied
[root@localhost ~]# useradd tech1
[root@localhost ~]# su - tech1
[tech1@localhost ~]$ cd /share/tech
[tech1@localhost tech]$ touch file
touch: cannot touch ‘file’: Permission denied
[tech1@localhost tech]$ cifscreds add 192.168.9.132 //添加需要指定的服务器
Password:
[tech1@localhost tech]$ ll
total 0
-rw-r--r--. 1 1002 1002 0 Jul 21 14:05 file
[tech1@localhost tech]$ touch file2 //可以创建和删除文件
[tech1@localhost tech]$ ll
total 0
-rw-r--r--. 1 1002 1002 0 Jul 21 14:05 file
-rw-r--r--. 1 1002 1002 0 Jul 21 14:11 file2