Samba服务器,功能主要就是unix机器与windows机器的文件共享,也可以是共享打印机,samba软件整合了SMB协议及Netbios协议,使其运行在TCP/IP上。
SMB协议:Server Message Block(服务信息块),可以看作是局域网上的共享文件的一种协议。
Samba服务它有两个进程:smbd(SMB服务器)、nmbd(NetBIOS名称服务器)
smbd:它使用的端口是139、445
nmbd:它使用的端口是137、138
一般禁止Samba服务,我们控制的是这两个端口
序号 | 特点 |
---|---|
1 | 在网络上共享目录,就好像一台文件服务器一样 |
2 | 在网络上共享打印机 |
3 | 决定共享目录的访问权限,可以让一个人、某些人、组和所有人访问 |
4 | 决定打印机的访问权限,可以让一个人、某些人、组和所有人使用 |
如果配置好了Samba服务器后,Linux就可以使用Windows网络中的文件和打印服务器了。
相关 | 注解 |
---|---|
SMB的启动脚本 | /usr/lib/systemd/system/smb.service |
SMB的主配置文件位于:/etc/samba/smb.conf
它由两部分构成:
(1)Global Settings:
该设置都是与samba服务整体运行环境有关的选项,它的设置项目是针对所有共享资源的。
(2)Share Definitions:
该设置针对的是共享目录个别的设置,只对当前的共享资源起作用。
以下是它的配置文件,我这里只摘出来使用的可能性比较大的一些,前面是它的行号。
25 # setsebool -P samba_domain_controller on(关于域的一个sebool)
30 # setsebool -P samba_enable_home_dirs on(当访问用户的家目录时,该安全值需要打开)
42 # chcon -t samba_share_t /path/to/directory
43
63 #======================= Global Settings =====================================
89 workgroup = MYGROUP(工作组为MYGROUP)
90 server string = Samba Server Version %v (制定服务器版本)
92 ; netbios name = MYSERVER(默认SMB提供的域名解析)
94 ; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 (信任的接口)
95 ; hosts allow = 127. 192.168.12. 192.168.13. (允许哪一个网段,注意写法)
97 ; max protocol = SMB2(支持最大版本为SMB2)
98
99 # --------------------------- Logging Options -----------------------------
107 # log files split per-machine:
108 log file = /var/log/samba/log.%m (日志文件存放位置)
109 # maximum size of 50KB per log file, then rotate:
110 max log size = 50(日志大小最大路径为50KB)
111
112 # ----------------------- Standalone Server Options -----------------------
123 security = user(指定默认安全级别)
124 passdb backend = tdbsam
125
240 # --------------------------- Printing Options ----------------------------
254 load printers = yes(是否加载打印机配置文件)
255 cups options = raw
257 ; printcap name = /etc/printcap
258 # obtain a list of printers automatically on UNIX System V systems:
259 ; printcap name = lpstat
260 ; printing = cups
261
280 #============================ Share Definitions ==============================
281
282 [homes]
283 comment = Home Directories
284 browseable = no
285 writable = yes
286 ; valid users = %S
287 ; valid users = MYDOMAIN\%S
288
289 [printers]
290 comment = All Printers
291 path = /var/spool/samba
(指明打印的文件队列暂时放到/var/spool/samba目录下)
292 browseable = no(不可以浏览)
293 guest ok = no(客户访问)
294 writable = no
295 printable = yes(打印机可以打印)
296
297 # Un-comment the following and create the netlogon directory for Domain Logons:
298 ; [netlogon]
299 ; comment = Network Logon Service
300 ; path = /var/lib/samba/netlogon
301 ; guest ok = yes
302 ; writable = no
303 ; share modes = no
304
305 # Un-comment the following to provide a specific roving profile share.
306 # The default is to use the user's home directory:
307 ; [Profiles]
308 ; path = /var/lib/samba/profiles
309 ; browseable = no
310 ; guest ok = yes
311
312 # A publicly accessible directory that is read only, except for users in the
313 # "staff" group (which have write permissions):
314 ; [public]
315 ; comment = Public Stuff (描述)
316 ; path = /home/samba (指定分享文件路径)
317 ; public = yes(是否允许匿名登录)
318 ; writable = yes(可写)
319 ; printable = no(不可打印)
320 ; write list = +staff(这个相当于白名单、+表示组也可以用@用来指定可以在该共享下写入文件的用户或组)
有关安全级别的配置详解:
123 security = user(指定默认安全级别)
前面我们说到这时Samba的安全级别,Samba的安全级别按从低到高分为四级:
share < user < server
安全级别 | 注解 |
---|---|
share | 没有安全性的级别,任何用户都可以不要用户名和口令访问服务器上的资源 |
user | Samba的默认配置,要求用户在访问共享资源之前资源必须先提供用户名和密码进行验证 |
server | 安全级别类似,但用户名和密码是递交到另外一个服务器去验证,比如递交给一台NT服务器。如果递交失败,就退到user安全级 |
domain | 这个安全级别要求网络上存在一台Windows的主域控制器,samba把用户名和密码递交给它去验证 |
整个Samba的工作过程可以看作是以下4个部分构成:
(1)版本(协议)协商:
客户端发送一个SMB negprot请求数据报,并列出它所支持的所有SMB协议版本。服务器收到请求信息后响应请求,并列出希望使用的协议版本。如果没有可使用的协议版本则返回0xFFFFH,之后结束通信。
(2)用户认证:
协议确定后,客户端进程向服务器发出一个用户或共享的认证,这个过程是通过发送SesssetupX请求数据报实现的,具体是这样的:
客户端发送一对用户名和密码或一个简单密码到服务器,然后服务器通过发送一个SesssetupX应答数据报来允许或拒绝本次连接。
(3)权限认证:
当客户端和服务器完成磋商和认证之后,它会发送一个Tcon或TconX SMB数据报并列出它想访问网络资源的名称,之后服务器会发送一个TconX应答数据报以表示此次连接是否被接收或拒绝
(4)访问、写入、关闭:
连接到相应资源后,SMB客户端就能够通过 open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。
这里我用了两个案例来演示Samba服务器是如何搭建的,我使用的镜像是Redhat7.2,虚拟机用的是VmwarePro14.0。
(1)首先挂载镜像:mount /dev/sr0 /mnt
(2)然后配置yum:
(3)Samba服务器上两个服务都要安装:yum install samba samba-client -y
(4)关闭防火墙:systemctl stop firewalld.service
(5)开启SeLinux:setenforce 1
案例一:创建一个公共的文件服务器,都可以访问并写入,但是不可以删除、修改其它用户的文件。
(1)创建共享目录:/samba
(2)编辑配置文件:
使用命令:vim /etc/samba/smb.conf 编辑著配置文件
①修改95行的hosts allow = 127. 192.168.0.
②修改254行打印机设置load printers = yes
③之后在文件末尾添加下面这段话,表示共享的目录是 /samba
④之后再复制安全值:**# chcon -t samba_share_t **
(3)给/samba目录赋安全值:chcon -t samba_share_t /samba
(4)为其它人增加可读写权限:chmod 777 /samba/,为/samba目录增加冒险位,让只有创建它的用户和组才能进行删除: chmod o+t /samba
(5)创建访问用户:
(6)设置他们为smb用户:
(7)之后重启服务:
systemctl restart smb.service nmb.service
(8)windows客户端进行测试:
在资源管理处输入\192.168.0.35,之后会看到以下界面:
输入用户名和密码之后,我们就可以看到以下界面:
(9)我们尝试在test目录中创建一个文件,试一试:没有问题,而且还可以删除。
(10)我们试着打开xiaoli目录来看一下,结果报错:
这是为什么呢?
这是因为在有一项SELinux中的布尔规则在关闭着,我们需要打开一下:
使用命令: setsebool -P samba_enable_home_dirs on
(11)之后我们重启一下服务: systemctl restart smb nmb
就可以进入我们创建的xiaoli用户了:
(12)用xiaozhang测试时需要在cmd命令中清除连接:
(13)用xiaozhang用户进行测试一下:我们删除不了别人的文件,但是可以创建自己的文件。
=========================================================================================================================
以上是Windows来测试的,接下来我们用Linux来测试一下,这里开启另一台名字叫做Client的客户机。
(1)yum install samba-client -y 安装客户端软件
(2)yum install cifs-utils.x86_64 -y 安装Samba冗余系统
(3)使用smbclient -L 192.168.0.35进行访问,不输入密码直接回车进行访问。
(4)在当前Client用户中根下创建public目录,用来挂载:
挂载:mount -o username=xiaozhang //192.168.0.35/test /public
(5)切换到挂载目录,然后写入一个文件试试,OK没问题。
案例2:技术部门需要一个文件服务器,存放常用的软件工具,所有人都可以访问,但是只有技术部的人可以写入。
(1)创建目录/software:mkdir /software,chmod 775 /software,chgrp jishubu /software
(2)使该目录生效:chcon -t samba_share_t /software
(3)添加组、组用户:
(4)指定这俩人儿为smb用户
(5)编辑配置文件:vim /etc/samba/smb.conf
(6)重启服务:systemctl restart nmb smb,之后就可以了。
(7)使用这个命令可以建立连接: net use \192.168.0.35\soft “redhat” /user:user1
redhat是该user1用户的密码,可以解决 “不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接” 的问题。
我们创建一个文件:
smbpasswd -x user1 就是取消smb用户user1
RH7版本有些问题,Share好像用不了,我们现在用user的访问模式。
案例3:案例2我们是使用用户进行登录的,我们现在要求不使用任何任何用户和密码直接登录。‘
(1)编辑配置文件:vim /etc/samba/smb.conf
(2)重启之后,我们就可以不使用用户名和密码进行登录了
(3)对于Linux中的挂载,可以使用命令: mount //192.168.0.35/test /public
自动挂载:
编辑该文件:vim /etc/fstab
添加这句话://192.168.xxx.xxx/(文件夹名) /mnt/dev cifs defaults,multiuser,username=xixi,password=xixi,sec=ntlmssp,_netdev 0 0