前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转企业常见应用与服务系列(五):网络文件共享服务 Samba 原理与实践

玩转企业常见应用与服务系列(五):网络文件共享服务 Samba 原理与实践

作者头像
民工哥
发布2023-11-20 16:01:37
1.4K0
发布2023-11-20 16:01:37
举报

samba简介

Samba 是一个能让 Linux 系统应用 Microsoft 网络通讯协议的软件,而 SMB 是 Server Message Block 的缩写,即为服务器消息块,SMB 主要是作为Microsoft 的网络通讯协议,后来 Samba 将 SMB 通信协议应用到了 Linux 系统上,就形成了现在的 Samba 软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,并且加入了许多新的功能,这样一来,使得Samba具有了更强大的功能。

Samba 最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享,Samba既可以用于windows与Linux之间的文件共享,也可以用于Linux与Linux之间的资源共享,由于NFS(网络文件系统)可以很好的完成Linux与Linux之间的数据共享,因而 Samba较多的用在了Linux与windows之间的数据共享上面。

使用samba和windows共享文件时候,请确保windows的NetBIOS(就是网上邻居功能)开启了。

Samba组成

一个samba服务器实际上包含了两个服务器程序:smbd和nmbd

  • Smbd是samba的核心。它负责建立对话进程、验证用户身份、提供对文件系统和打印机的访问机制,只有smb服务启动,才能实现文件的共享。【TCP 445】。
  • Nmbd实现了“Network Brower”(网络浏览服务器)的功能,实现NETBIOS(本地名称解析)功能【UDP137/138TCP 139】,如果该服务没有启动,则客户端不能通过Linux系统共享的工作组名称访问共享文件,而只能通过IP地址来访问共享的文件。

Samba还包含了一些实用工具。Smbclient是一个SMB客户工具,有shell-based用户界面并同FTP有些类似。应用它可以复制其它的SMB服务器资源,还可以访问其它SMB服务器提供的打印机资源。

SAMBA软件安装(服务器搭建)

代码语言:javascript
复制
yum -y install samba -y

查看相关软件包

代码语言:javascript
复制
[root@samba ~]# rpm -qa | grep ^samba
samba-common-libs-4.10.16-19.el7_9.x86_64
samba-common-tools-4.10.16-19.el7_9.x86_64
samba-common-4.10.16-19.el7_9.noarch
samba-client-libs-4.10.16-19.el7_9.x86_64
samba-libs-4.10.16-19.el7_9.x86_64
samba-4.10.16-19.el7_9.x86_64
[root@samba ~]# 
smb配置文件

通过命令:vim /etc/samba/smb.conf查看配置文件

代码语言:javascript
复制
[global] #全局选项
        workgroup = SAMBA #定义samba服务器所在的工作组
        security = user #认证模式:share匿名|user用户密码|server外部服务器用户密码
        
        passdb backend = tdbsam #密码格式
 
        load printers = yes #加载打印机
        cups options = raw #打印机选项

[homes] #局部选项(共享名称)
        comment = Home Directories #描述
        valid users = %S, %D%w%S #有效用户
        browseable = No #隐藏共享名称
        read only = No #是否只读
        inherit acls = Yes #继承ACL
        writable = yes      #可读可写

[printers] #共享名称
        comment = All Printers #描述
        path = /var/tmp #本地的共享目录
        printable = Yes #可打印
        guest ok = no ——>(等价于) public = no #需要帐号和密码访问
        writable = no  ——>(等价于)  read only =yes #不可写 
        browseable = No #隐藏

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

SAMBA使用案例

搭建一个SAMBA服务,共享一个目录/samba/share,客户端使用user01/123通过windows或者Linux可以在该目录里创建文件删除文件。

环境准备
配置静态ip
代码语言:javascript
复制
vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.44.170
NETMASK=255.255.255.0
GATEWAY=192.168.44.2
DNS1=8.8.8.8
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
关闭防火墙和SELinux

关闭防火墙

代码语言:javascript
复制
systemctl stop firewalld
#开机不自启
systemctl disable firewalld

关闭SELinux:

代码语言:javascript
复制
setenforce 0 
#开机不自启  
vim /etc/selinux/config`
SELINUX=disabled
在服务端创建一个共享目录并创建文件
代码语言:javascript
复制
mkdir -p /samba/share

[root@samba share]# touch /samba/share/test.txt
[root@samba share]# echo "hello word" >> test.txt 
[root@samba share]# ll
total 4
-rw-r--r--. 1 root root 11 Jul 18 16:18 test.txt
[root@samba share]#
修改配置文件
代码语言:javascript
复制
vim /etc/samba/smb.conf

[samba_share] 共享名称
        comment = samba service 描述
        path = /samba/share 本地的共享目录
        guest ok = no 需要帐号和密码访问
        writable = yes 可读可写

或者可以修改成:因为 guest ok = no 等价于 public = no。

代码语言:javascript
复制
[samba_share]
        path = /samba/share
        public = no
        writable = yes
配置文件选项说明
代码语言:javascript
复制
workgroup = WORKGROUP
#设定 SambaServer 所要加入的工作组或者域。
 
server string = Samba Server Version %v
#设定 SambaServer 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。
 
netbios name = smbserver
#设置SambaServer的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分。netbios name和workgroup名字不要设置成一样了。
 
interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
#设置SambaServer监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。
 
hosts allow = 127. 192.168.1. 192.168.10.1
#表示允许连接到SambaServer的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。hosts deny 与hosts allow 刚好相反。例如:hostsallow=172.17.2.EXCEPT172.17.2.50表示容许来自172.17.2.*的主机连接,但排除172.17.2.50。hosts allow=172.17.2.0/255.255.0.0表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接。hosts allow=M1,M2表示容许来自M1和M2两台计算机连接。hosts allow=@pega表示容许来自pega网域的所有计算机连接。
 
max connections = 0
#maxconnections用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
 
deadtime = 0
#deadtime用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
 
time server = yes/no
#timeserver用来设置让nmdb成为windows客户端的时间服务器。
 
log file = /var/log/samba/log.%m
#设置SambaServer日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。如果pc1、pc2访问过Samba Server,就会在/var/log/samba目录下留下log.pc1和log.pc2两个日志文件。

max log size = 50
#设置SambaServer日志文件的最大容量,单位为kB,0代表不限制。
代码语言:javascript
复制
security = user
#设置用户访问SambaServer的验证方式,一共有四种验证方式。
  • share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
  • user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
  • server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用 Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
  • domain:域安全级别,使用主域控制器(PDC)来完成认证。
代码语言:javascript
复制
passdb backend = tdbsam
#passdbbackend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。
  • smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。
  • tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。

pdbedit命令的参数很多,我们列出几个主要的。

代码语言:javascript
复制
pdbedit –a username:新建Samba账户。
pdbedit –x username:删除Samba账户。
pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。
pdbedit –Lv:列出Samba用户列表的详细信息。
pdbedit –c “[D]” –u username:暂停该Samba用户的账号。
pdbedit –c “[]” –u username:恢复该Samba用户的账号。
  • ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”。
代码语言:javascript
复制
encrypt passwords = yes/no
#是否将认证密码加密。因为现在windows操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启。
 
smb passwd file = /etc/samba/smbpasswd
#用来定义samba用户的密码文件。smbpasswd文件如果没有那就要手工新建。
 
username map = /etc/samba/smbusers
#用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆SambaServer,更贴近windows用户的习惯。
 
guest account = nobody
#用来设置guest用户名。
 
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
#用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度。
 
domain master = yes/no
#设置Samba服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务。
 
local master = yes/no
#localmaster用来指定Samba Server是否试图成为本地网域主浏览器。如果设为no,则永远不会成为本地网域主浏览器。但是即使设置为yes,也不等于该Samba Server就能成为主浏览器,还需要参加选举。
 
preferred master = yes/no
#设置SambaServer一开机就强迫进行主浏览器选举,可以提高Samba Server成为本地网域主浏览器的机会。如果该参数指定为yes时,最好把domain master也指定为yes。使用该参数时要注意:如果在本Samba Server所在的子网有其他的机器(不论是windows NT还是其他Samba Server)也指定为首要主浏览器时,那么这些机器将会因为争夺主浏览器而在网络上大发广播,影响网络性能。如果同一个区域内有多台SambaServer,将上面三个参数设定在一台即可。
 
os level = 200
#设置samba服务器的os level。该参数决定SambaServer是否有机会成为本地网域的主浏览器。os level从0到255,winNT的os level是32,win95/98的os level是1。Windows 2000的os level是64。如果设置为0,则意味着Samba Server将失去浏览选择。如果想让Samba Server成为PDC,那么将它的os level值设大些。
 
domain logons = yes/no
#设置Samba Server是否要做为本地域控制器。主域控制器和备份域控制器都需要开启此项。
 
logon script = %u.bat
#当使用者用windows客户端登陆,那么Samba将提供一个登陆档。如果设置成%u.bat,那么就要为每个用户提供一个登陆档。如果人比较多,那就比较麻烦。可以设置成一个具体的文件名,比如start.bat,那么用户登陆后都会去执行start.bat,而不用为每个用户设定一个登陆档了。这个文件要放置在[netlogon]的path设置的目录路径下。
 
wins support = yes/no
#设置samba服务器是否提供wins服务。
 
wins server = wins服务器IP地址
#设置SambaServer是否使用别的wins服务器提供wins服务。
 
wins proxy = yes/no
#设置SambaServer是否开启wins代理服务。
 
dns proxy = yes/no
#设置SambaServer是否开启dns代理服务。
 
load printers = yes/no
#设置是否在启动Samba时就共享打印机。
 
printcap name = cups
#设置共享打印机的配置文件。
 
printing = cups
#设置Samba共享打印机的类型。现在支持的打印系统有:bsd, sysv, plp, lprng, aix, hpux, qnx
创建用户

创建一个test用户,然后添加到samba认证中,设置密码为123456

代码语言:javascript
复制
[root@samba ~]# useradd test
[root@samba ~]# smbpasswd -a test
New SMB password:
Retype new SMB password:
Added user test.
[root@samba ~]# 
启动nmb和smb服务
代码语言:javascript
复制
systemctl start nmb  
systemctl start smb
测试基于Windows实现文件共享

打开控制面板:

点击程序

进入计算机

192.168.44.170(主机ip)samba_share(SAMBA配置文件的标签名)。输入刚创建并加入到SAMBA数据库中的用户名和密密码 。

最后看到之前创建的共享目录里的文件

解决挂载后目录不可写

问题:主要原因在于/samba/share目录没有写入权限。

解决方案:给用户添加写权限,或者用ACL单独给刚刚创建的test用户添加权限。

代码语言:javascript
复制
setfacl -m u:test:rwx /samba/share

基于Linux或Linux实现文件共享

注意:samb_share参数是配置文件里标签名,现在LInux上安装SAMBA客户端 。

代码语言:javascript
复制
yum -y install samba-client

smbclient -L 192.168.44.170 -U test
代码语言:javascript
复制
[root@samba ~]# smbclient -L 192.168.44.170 -U test
Enter SAMBA\test's password: 

 Sharename       Type      Comment
 ---------       ----      -------
 print$          Disk      Printer Drivers
 samba_share     Disk      samba service
 IPC$            IPC       IPC Service (Samba 4.10.16)
 test            Disk      Home Directories
Reconnecting with SMB1 for workgroup listing.

 Server               Comment
 ---------            -------
 SAMBA                Samba 4.10.16

 Workgroup            Master
 ---------            -------
 SAMBA                SAMBA
[root@samba ~]# 

使用smbclient查看目录信息,命令:smbclient //192.168.44.170/samba_share -U test

通过help命令查看命令使用和NFS类似。

代码语言:javascript
复制
smb: \> help
?              allinfo        altname        archive        backup         
blocksize      cancel         case_sensitive cd             chmod          
chown          close          del            deltree        dir            
du             echo           exit           get            getfacl        
geteas         hardlink       help           history        iosize         
lcd            link           lock           lowercase      ls             
l              mask           md             mget           mkdir          
more           mput           newer          notify         open           
posix          posix_encrypt  posix_open     posix_mkdir    posix_rmdir    
posix_unlink   posix_whoami   print          prompt         put            
pwd            q              queue          quit           readlink       
rd             recurse        reget          rename         reput          
rm             rmdir          showacls       setea          setmode        
scopy          stat           symlink        tar            tarmode        
timeout        translate      unlock         volume         vuid           
wdel           logon          listconnect    showconnect    tcon           
tdis           tid            utimes         logoff         ..             
!              
smb: \>
把SAMBA挂载到Linux系统(类似NFS)

先创建一个目录用来挂载:mkdir /temp,安装cifs:

代码语言:javascript
复制
yum install cifs-utils -y

挂载命令

代码语言:javascript
复制
mount.cifs -o user=test,pass=123456 //192.168.44.170/samba_share /temp

访问权限

代码语言:javascript
复制
#控制读写权限
 writable = yes/no
 readonly = yes/no

#如果资源可写,但只允许某些用户可写,其他都是只读
write list = admin, root, @staff(用户组)
read list = mary, @students

#控制访问对象
 valid users = tom,mary,@itcast
 invalid users = tom
注意:以上两个选项只能存在其中一个

#网络访问控制
hosts deny = 192.168.0.   拒绝某个网段
hosts allow = 192.168.0.254  允许某个IP
hosts deny = all  拒绝所有
hosts allow = 192.168.0. EXCEPT 192.168.0.254  允许某个网段,但拒绝某个单个IP
注意:deny和allow同时存在,allow优先

FTP、NFS、SAMBA的区别

  • ftp 局域网和外网都可以。
  • nfs 局域网 挂载方式访问 mount.nfs 侧重于Linux与Linux之间。
  • samba 局域网 直接访问(smbclinet)挂载的方式mount.cifs 侧重于Windows与Linux之间。

参考链接:https://blog.csdn.net/qq_33442153/ article/details/125517829 https://blog.csdn.net/ weixin_53946852/article/details/125851113

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • samba简介
  • Samba组成
  • SAMBA软件安装(服务器搭建)
    • smb配置文件
    • SAMBA使用案例
      • 环境准备
        • 在服务端创建一个共享目录并创建文件
          • 修改配置文件
            • 创建用户
              • 启动nmb和smb服务
                • 测试基于Windows实现文件共享
                  • 解决挂载后目录不可写
                  • 基于Linux或Linux实现文件共享
                    • 把SAMBA挂载到Linux系统(类似NFS)
                    • FTP、NFS、SAMBA的区别
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档