Samba服务搭建与配置

Catalogue
  1. 1. Samba服务搭建与配置
    1. 1.1. samba介绍
    2. 1.2. samba安装
    3. 1.3. samba配置&使用
      1. 1.3.1. Windows连接Samba文件服务器
      2. 1.3.2. Linux连接Samba文件服务器
      3. 1.3.3. 使用场景1:共享文件服务器
      4. 1.3.4. 使用场景2:专享文件服务器
  2. 2. 参考资料

Samba服务搭建与配置

本文主要介绍Samba文件服务器的搭建与配置。

samba介绍

Samba服务是SMB的一个开源实现,SMB(Server Message block)协议是window下所使用的文件共享协议,我们在linux系统或者其类unix系统当中可以通过samba服务来实现SMB功能。

Samba实现了CIFS的四个基本功能:

  • 文件和打印服务
  • 认证和授权
  • 名称解析
  • 服务宣告

Samba服务是由两个进程组成,分别是nmbd和smbd:

  • nmbd:使用137、138端口,其功能是进行NetBIOS名解析,并提供浏览服务显示网络上的共享资源列表。
  • smbd:使用139、445端口,其主要功能就是用来管理Samba服务器上的共享目录、打印机等,主要是针对网络上的共享资源进行管理的服务。当要访问服务器时,要查找共享文件,这时我们就要依靠smbd这个进程来管理数据传输。

Samba的工作流程主要为四个阶段:(本段来自知乎文章《Samba协议简介》)

  1. 协议协商

    客户端在访问Samba服务器时,首先由客户端发送一个SMB negprot请求数据报,并列出它所支持的所有SMB协议版本。服务器在接收到请求信息后开始响应请求,并列出希望使用的协议版本,选择最优的SMB类型。如果没有可使用的协议版本则返回oXFFFFH信息,结束通信。

  2. 建立连接

    当SMB协议版本确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送SesssetupX请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器,然后服务器通过发送一个SesssetupX请应答数据报来允许或拒绝本次连接。

  3. 访问共享资源

    当客户端和服务器完成了协商和认证之后,它会发送一个Tcon或SMB TconX数据报并列出它想访问网络资源的名称,之后服务器会发送一个SMB TconX应答数据报以表示此次连接是否被接受或拒绝。

  4. 断开连接

    连接到相应资源,SMB客户端就能够open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。

samba安装

这里我使用的环境是:

  • 服务器:Ubuntu 20.04 LTS
  • 客户机:Windows 10

这里安装使用apt包管理器进行:

1
2
$ sudo apt update && sudo apt upgrade
$ sudo apt install samba

samba配置&使用

Samba 服务在使用之前需要我们为系统已有的用户创建 Samba的账号(密码与登录系统的密码不一样):

pdbedit命令用于管理SMB服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。在第一次把账户信息写入到数据库时需要使用-a参数,以后执行修改密码、删除账户等操作时就不在需要该参数。

1
2
3
4
5
# pdbedit使用说明
pdbedit -a username # 创建账号
pdbedit -x username # 删除账号
pdbedit -L # 列出账号列表
pdbedit -Lv username # 列出账号详细信息

创建账号过程:

1
2
3
4
5
6
selph@ubuntu:~/samba$ sudo useradd user01
selph@ubuntu:~/samba$ sudo id user01
uid=1001(user01) gid=1001(user01) groups=1001(user01)
selph@ubuntu:~/samba$ sudo pdbedit -a -u user01
new password:
retype new password:

Samba 的配置文件在/etc/samba/smb.conf,使用之前我们需要对配置文件进行编辑

最基本的配置内容以及格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 大致可以分为一个全局设置,若干个共享设置
[global]
map to guest = Bad User
log file = /var/log/samba/%m
log level = 1

[guest]
# This share allows anonymous (guest) access
# without authentication!
path = /srv/samba/guest/
# 共享路径
read only = yes
guest ok = yes
guest only = yes

全局设置的属性有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[global]
workgroup = MYGROUP
#工作组名称

server string = Samba Server Version %v
#服务器介绍信息,参数%v为显示SMB版本号

log file = /var/log/samba/log.%m
#定义日志文件的存放位置与名称,参数%m为来访的主机名

max log size = 50
#定义日志文件的最大容量为50KB

security = user
#安全验证的方式,总共有4种
#share:来访主机无需验证口令;比较方便,但是安全性很差
#user:需验证来访主机提供口令后才可以访问;提高了安全性
#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
#domain:使用域控制器进行身份验证

passdb backend = tdbsam
#定义用户后台的类型,共有3种
#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
#ldapsam:基于LDAP服务进行账户验证

load printers = yes
#设置在Samba服务启动时是否共享打印机设备

cups options = raw
#打印机的选项

用户控制类属性有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public = yes
# 所有用户都可以访问
# 等价于 guest ok =yes/no
map to guest = Bad User
# 匿名访问
browsable = yes
# 可浏览(设置共享是否可游览,如果是no表示隐藏,通过ip+共享名进行访问)
writable = yes
# 可写,还要看目录权限
writable list = maomao,@GROUPNAME,+GROUPNAME
readonly = yes
# 只读设置
create mask = 0644
# 客户机创建文件权限
directory mask = 0744
# 客户机创建目录的权限
valid users = user1,user2,@group1
# 禁止登录用户,用户用逗号隔开,组用@ //禁止
invalid =
# 允许访问控制
max connections =
# 最大连接数目
deadtime =
# 断掉连接时间(分钟,0为不限制
hosts allow =
# 允许主机
hosts deny =
# 拒绝主机(允许优先)

更多详细设置属性可以参考官方文档

配置完成后,我们可以通过客户端连接Samba服务器进行使用。

Windows连接Samba文件服务器

  • Windows +R 打开 运行
  • 键入\\ip\diectory,敲击回车即可

image-20200606183724982

通过cmd命令行可以关闭连接:

1
2
3
4
net use 
# 查看已挂在会话
net use \\ip\directory /del
# 删除连接

Linux连接Samba文件服务器

Linux系统需要下载一个Samba服务的客户端:

1
sudo apt install smbclient

使用客户端进行登录访问示例:

1
2
3
4
5
6
smbclient -L \\192.168.193.161 
# 查看该地址的Samba服务提供了哪些目录
smbclient \\192.168.193.161\Public --no-pass
# 匿名访问Public目录
smbclient \\192.168.193.161\Private -U selph
# 使用selph账号登录访问Private目录

使用场景1:共享文件服务器

任何人都能访问文件服务器的Public目录,且都有写入权限:

创建目录并给写入权限:

1
2
mkdir ~/samba/public
chmod 0766 ~/samba/public

编辑配置文件:

1
2
3
4
5
6
7
8
9
10
11
[Public]
comment = public share folder
# 描述
path = /home/selph/samba/public
# 共享路径
browseable = yes
# 是否可以被发现
writable = yes
# 可读写,需要只读的话用:read only = yes
guest ok = yes
# 允许匿名访问 public = yes

重启Samba服务:

1
sudo systemctl restart smbd.service

使用场景2:专享文件服务器

只有selph用户可写入,其他用户为只读:

1
2
3
4
5
6
7
8
9
[Private]
comment = folder of selph
path = /home/selph/samba/private
writable = yes
write list = selph
readonly = yes
create mask = 0644
directory mask = 0744
public = yes

重启Samba服务:

1
sudo systemctl restart smbd.service

image-20200606181815307

参考资料

Linux使用Samba实现文件共享

https://www.cnblogs.com/DevonL/p/11178674.html

samba wiki

https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Standalone_Server

samba docs pdbedit

https://www.samba.org/samba/docs/4.11/man-html/pdbedit.8.html

linux基础&Samba服务、SMB协议

https://blog.csdn.net/csdn10086110/java/article/details/89174589

Samba 协议简介

https://zhuanlan.zhihu.com/p/41449862

Ubuntu Server 从入门到精通

https://study.163.com/course/introduction/1005266046.htm