• Linux友人帐之网络编程基础Samba服务器


    一、概述

    1.1Samba介绍

    SMB协议

    SMB(Server Message Block,服务信息块)协议是一个高层协议,它提供了在网络上的不同计算机之间共享文件、打印机和不同通信资料的手段。


    SMB使用NetBIOS API3实现面向连接的协议,该协议为Vindows客户程序和服务提供了一个通过虚电路按照请求-响应方式进行通信的机制。

    CIFS协议

    通用网际文件系统(CIFS)是微软服务器消息块协议(SMB):的增强版本,提供计算机用户在企业内部网和因特网上共享文件的标准方法。


    CIFS在TCP/IP上运行,利用因特网上的全球域名服务系统(DNS)增强其可扩展性,同时为因特网上普遍存在的慢速拨号连接优化。

    1.2Samba的主要功能

    • 文件和打印机共享:文件和打印机共享是Samba的主要功能,通过SB进程实现资源共享,将文件和打印机发布到网络中,供用户可以访问。
    • 身份验证和权限设置:smbd服务支持user mode和domain mode等身份验证和权限设置模式,通过加密方式可以保护共享的文件和打印机。
    • 名称解析:Samba通过nmbd服务可以搭建NBNS(NetBIOS Name Service)服务器,提供名称解析,将计算机的NetBIOS名解析为P地址。
    • 浏览服务:局域网中,Samba服务器可以成为本地主浏览服务器(LMB),保存可用资源列表,当使用客户端访问Windows网上邻居时,会提供浏览列表,显示共享日录、打印机等资源。

    1.3工作原理

    客户端在访问Samba服务器时,发送negprot指令数据包,告知目标计算机其支持的SMB类型。Samba服务器根据客户端的情况,选择最优的SMB类型,并做出回应。

    当SMB类型确认后,客户端会发送session setup指令数据包,提交帐号和密码,请求与Samba服务器建立连接,如果客户端通过身份验证,Samba服务器会对session setup报文作出回应,并为用户分配唯一的UID,在客户端与其通信时使用。

    客户端访问Samba共享资源时,发送tree connect指令数据包,通知服务器需要访问的共享资源名,如果设置允许,Samba服务器会为每个客户端与共享资源连接分配TID,客户端即可访问需要的共享资源。

    步骤4:断开连接
    共享使用完毕,客户端向服务器发送tree disconnect报文关闭共享,与服务
    器断开连接。 

    1.4 Samba的守护进程

    1.5Samba的配置文件

    二、实验

    2.1安装Samba服务软件

    任务描述

    Samba是在LinuxUNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。

    本关任务:我们学会如何在Linux系统上搭建一个Samba服务器。

    相关知识

    Samba是在LinuxUNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMBServer Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

    SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置NetBIOS over TCP/IP使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

    Linux系统安装软件和Windows系统上安装软件不太一样,在Windows上我们只需要下载需要安装的软件二进制文件(常见的格式是.exe),然后双击即可进行安装。而Linux系统上安装软件的常见方式有如下几种:

    1. 源码编译安装
    2. 软件包安装
    3. 在线安装

    源码安装步骤是下载源码到本机,然后对源码进行编译,生成可执行文件,然后将生成的可执行文件拷贝到对应的安装目录即可,常见的软件源码包格式为.tar.gz.tar.bz2等;

    软件包安装步骤是下载好已经编译好的可执行文件包,然后使用对应的包管理工具进行安装,不同的Linux系统使用不同的包管理工具,常见包管理工具如下所示:

    1. Ubuntu/Debian 系统使用 dpkg 进行管理软件包(软件包的后缀为.deb);
    2. Redhat/CentOS 系统使用 rpm 进行管理软件包(软件包的后缀为.rpm);

    在线安装是指不需要用户亲自下对应软件的包,但是需要对应系统能够访问互联网,不同的Linux系统使用不同的工具进行在线安装软件,常见的在线安装软件的工具如下所示:

    1. Ubuntu/Debian 系统使用 apt-get 进行在线安装软件;
    2. Redhat/CentOS 系统使用 yum 进行在线安装软件;

    建议使用在线安装软件,离线安装软件常见的问题是软件间的依赖问题,如果离线安装软件,则必须要手动安装依赖的库,而在线安装则只需要一条命令完成所有的操作,在线安装会自动去安装依赖库;

    源码安装Samba

    Samba软件依赖如下多个软件包,所以在安装Samba软件前,需要先安装如下依赖包。

    1. python-dev: sudo apt-get install python-dev
    2. libgnutls-dev: sudo apt-get install libgnutls-dev
    3. libacl1-dev: sudo apt-get install libacl1-dev
    4. libldap2-dev: sudo apt-get install libldap2-dev

    首先下载源码包,此处使用的是samba-4.8.2.tar.gz

    具体安装步骤如下所示:

    1. 解压源码包:tar zxvf samba-4.8.2.tar.gz
    2. 进入源码文件夹:cd samba-4.8.2/
    3. 配置(生成Makefile):./configure --prefix=/usr/local/samba --without-pam
    4. 编译源码:make
    5. 安装源码:sudo make install

    [./configure --prefix=/usr/local/samba --without-pam成功执行结果]

    [make成功执行结果]

    [sudo make install成功执行结果]

    至此源码安装Samba软件结束,如果正确安装,则可以执行如下命令启动服务:

    1. sudo /usr/local/samba/sbin/smbd –D
    2. sudo /usr/local/samba/sbin/nmbd –D

    在线安装Samba

    本实验环境使用的系统是Ubuntu,所以使用apt-get工具来在线安装软件,具体步骤如下所示:

    1. 更新软件源:sudo apt-get update
    2. 安装samba:sudo apt-get install samba

    如果安装成功则会出现如下界面:

    注意:如果当前用户是root,则执行以上安装命令时不需要加sudo

    编程要求

    本关任务是学会如何在线安装samba软件。

    具体编程要求如下:

    • 在线安装samba软件(实验环境使用的是Ubuntu系统)。

    2.2Samba服务器启动/关闭

    任务描述

    通过上一关的学习,我们学会如何在Linux系统上安装samba软件,当我们安装好后,我们接下学会如何开启/关闭samba服务。

    本关任务:介绍在Linux系统上如何开启、关闭和重启samba服务。

    相关知识

    当我们安装成功samba软件后,Ubuntu 12.04系统默认samba服务是开启的。

    本实验环境使用的系统是Ubuntu,当我们使用apt-get在线安装软件后,通常会在/etc/init.d/目录下生成一个启动该服务软件的脚本。例如,我们使用apt-get安装samba软件后,我们可以看到在/etc/init.d/目录下生成一个名为smbd的脚本文件,该脚本可以用来控制samba服务的启动与关闭等信息。

    [samba服务脚本文件]

    Linux service 命令

    Linux系统中使用service命令来控制系统服务,它可以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。

    service命令的使用格式:

    service 服务名 控制命令

    • 服务名:自动要控制的服务名,即/etc/init.d目录下的脚本文件名;
    • 控制命令:系统服务脚本支持的控制命令。

    常见的控制命令:

    1. start:启动该服务;
    2. stop:关闭该服务;
    3. restart:重新启动该服务;
    4. status:查看该服务状态;

    注意并不是所有的服务都支持以上4种控制命令,不同的服务提供不同的控制命令,大多数服务都支持以上4种常用的控制命令。

    samba服务管理

    当我们成功安装samba后,接下来,我们使用service命令来管理samba服务。

    我们将在以下案例演示中分别介绍如何启动、关闭、重新启动samba服务,以及查看samba服务状态。

    案例演示1

    查看samba服务状态,可以使用如下命令:

    sudo service smbd status

    [请在右侧“命令行”里直接体验]

    可以看到当前samba服务处于running状态,也就是运行状态,其运行进程的ID54244

    案例演示2

    关闭samba服务并且查看是否关闭成功,可以使用如下命令:

    1. sudo service smbd stop
    2. sudo service smbd status

    [请在右侧“命令行”里直接体验]

    可以看到samba服务处于waiting状态。

    案例演示3

    启动samba服务并且查看是否启动成功,可以使用如下命令:

    1. sudo service smbd start
    2. sudo service smbd status

    [请在右侧“命令行”里直接体验]

    可以看到samba服务处于running状态,也且运行进程ID54408

    案例演示4

    重启samba服务并且查看是否重启成功,可以使用如下命令:

    1. sudo service smbd restart
    2. sudo service smbd status

    [请在右侧“命令行”里直接体验]

    可以看到当前samba服务先被stop后,紧接着被start

    注意:如果当前用户是root,则执行以上命令时不需要加sudo

    编程要求

    本关任务是学会如何启动/关闭samba服务器。

    具体编程要求如下:

    • 开启samba服务(实验环境使用的是Ubuntu系统)。

    2.3Samba客户端

    任务描述

    通过以上关卡的学习,我们学会了如何安装和启动samba服务器软件,接下来我们来学习如何利用samba客户端软件进行远程登录服务器。

    本关任务:学会如何使用samba客户端软件进行远程登录服务器。

    相关知识

    Linux系统上samba客户端软件有smbclient

    smbclient命令属于samba套件,它提供一种命令行使用交互式方式访问samba服务器的共享资源。这里详细介绍Linux smbclient命令的一些经常使用的命令。

    在线安装smbclient软件

    本实验环境使用的系统是Ubuntu,所以使用apt-get工具来在线安装软件,具体步骤如下所示:

    1. 更新软件源:sudo apt-get update
    2. 安装smbclient:sudo apt-get install smbclient

    如果安装成功则会出现如下界面:

    注意:如果当前用户是root,则执行以上安装命令时不需要加sudo

    samba用户管理

    smbpasswd命令属于samba套件,能够实现添加或删除samba用户和为用户修改密码。

    smbpasswd命令格式:

    smbpasswd 选项 用户名

    常见选项如下:

    1. -a:向smbpasswd文件中添加用户;
    2. -c:指定samba的配置文件;
    3. -x:从smbpasswd文件中删除用户;
    4. -d:在smbpasswd文件中禁用指定的用户;
    5. -e:在smbpasswd文件中激活指定的用户;
    6. -n:将指定的用户的密码置空;

    用户名:指定要修改smb密码的用户。

    注意:这里使用的用户是系统中已经存在的用户。

    案例演示1:

    添加一个samba用户sambaUser,可以使用如下命令:

    1. sudo useradd sambaUser
    2. sudo smbpasswd -a sambaUser

    [请在右侧“命令行”里直接体验]

    smbclient命令常见用法

    smbclient 命令格式:

    smbclient 选项 smb服务器

    常见选项如下:

    1. -L:显示服务器端所分享出来的所有资源;
    2. -p:指定服务器端 TCP 连接端口编号;
    3. -s<目录>:指定 smb.conf 所在的目录;
    4. -U<用户名称>:指定用户名称;
    5. -N:不用询问密码;

    smb服务器:指定要连接的smb服务器。

    常见smbclient命令如下所示:

    1. smb: \> ? 或 help [command] 提供关于帮助或某个命令的帮助;
    2. smb: \> ![shell command] 执行所用的 SHELL 命令,或让用户进入 SHELL 提示符;
    3. smb: \> cd [目录] 切换到服务器端的指定目录,如未指定,则 smbclient 返回当前本地目录;
    4. smb: \> lcd [目录] 切换到客户端指定的目录;
    5. smb: \> dir 或 ls 列出服务器端当前目录下的文件;
    6. smb: \> exit 或 quit 退出smbclient;
    7. smb: \> get file1 file2 从服务器上下载 file1,并以文件名 file2 存在本地机上;如果不想改名,可以把 file2 省略;
    8. smb: \> mget file1 file2 file3 filen 从服务器上下载多个文件;
    9. smb: \> md 或 mkdir 目录 在服务器上创建目录;
    10. smb: \> rd 或 rmdir 目录 删除服务器上的目录;
    11. smb: \> put file1 [file2] 向服务器上传一个文件 file1,传到服务器上改名为 file2;
    12. smb: \> mput file1 file2 filen 向服务器上传多个文件;

    注意:smbclient的很多命令和ftp的命令用法相似。

    案例演示环境初始化:执行如下操作:向文件/etc/samba/smb.conf结尾追加如下内容,并且重新启动Samba服务器,下一关讲解为什么要这样做。

    1. [homes]
    2. comment = smbclient homes
    3. path = /tmp
    4. browseable = no
    5. writable = yes
    6. create mask = 0664
    7. directory mask = 0775

    [修改后的配置文件]

    列出某个IP地址所提供的共享文件夹

    案例演示1:

    使用smbclient客户端列出本地所提供的共享文件夹(使用sambaUser用户去登录服务器,密码为fzm),可以使用如下命令:

    smbclient -L 127.0.0.1 -U sambaUser%fzm

    [请在右侧“命令行”里直接体验]

    可以看到本地共享的文件夹有3个,分别是:print$IPC$sambaUser

    远程连接Samba服务器

    案例演示2:

    使用smbclient客户端去连接sambaUser共享文件夹(使用sambaUser用户去登录服务器,密码为fzm),可以使用如下命令:

    smbclient //127.0.0.1/testUser -U testUser%123

    [请在右侧“命令行”里直接体验]

    其它操作

    案例演示3:

    显示远程主机的当前目录,并且显示客户端当前工作目录,显示远程主机的当前目录下的所有文件信息,显示客户端当前工作目录下的所有信息,可以使用如下命令:

    1. pwd
    2. ! pwd
    3. ls
    4. ! ls

    [请在右侧“命令行”里直接体验]

    案例演示4:

    在远程主机上新创建一个文件夹newDir,然后将本地的/home/fzm/testFile上传到newDir目录下,将远程主机上的sambaUser/fzm文件下载到/home/fzm目录下,并重命名为newFzm,最后退出smbclient客户端,可以使用如下命令:

    1. mkdir newDir
    2. put /home/fzm/testFile newDir/testFile
    3. get sambaUser/fzm /home/fzm/newFzm
    4. exit

    [请在右侧“命令行”里直接体验]

    案例演示5:

    Windows系统上通过samba服务器去访问Linux系统共享的文件夹,可以使用如下步骤:

    • Windows主机上打开"运行"(快捷键win+r)输入需要访问的LinuxIP地址(格式为:\\IP);

    [请在Windows主机上进行验证]

    • 回车后即可看到Linux主机上所共享的文件夹(fzm);

    [请在Windows主机上进行验证]

    • 打开fzm文件夹进行访问即可(有时需要输入samba的用户名和密码才能访问)。

    [请在Windows主机上进行验证]

    编程要求

    本关任务是学会如何使用smbclient命令访问samba服务器的共享资源。

    注意:在执行本关任务前,首先执行如下命令来初始化任务环境。

    1. apt-get update
    2. apt-get install smbclient
    3. useradd testUser
    4. smbpasswd -a testUser(输入新设置的密码)
    5. touch testFile
    6. 向文件`/etc/samba/smb.conf`结尾追加如下内容,并且重新启动`Samba`服务器,并且重新启动服务
     
     
    1. [homes]
    2. comment = smbclient homes
    3. path = /tmp
    4. browseable = no
    5. writable = yes
    6. create mask = 0664
    7. directory mask = 0775

    具体编程要求如下:

    • 启动samba服务;
    • 使用smbclient命令连接本机testUser共享文件夹(将本机作为远程服务器,并且使用testUser用户去访问);
    • 在远程服务器上新建一个目录Dir
    • 将本地的一个文件(/root/testFile)上传到远程主机的Dir目录下并重命名为upLoadFile

    2.4 Samba服务器配置

    任务描述

    通过以上关卡的学习,我们学会了使用smbclient命令来登录远程主机,并进行文件的上传和下载操作。接下来我们来学习如何配置samba服务器。

    本关任务:学会samba服务器的常见配置。

    相关知识

    上一关卡中,我们在案例演示前进行了一系列环境的初始化,现在我们详细的介绍为什么我们要做那些环境的配置。

    samba服务器提供了很多的配置项,每个配置项都有不同的功能,接下来,我们介绍samba常见的配置项功能,samba服务器的配置文件存放路径为:/etc/samba/smb.conf目录下。

    smb.conf结构

    smb.conf文件中包括4种结构,[Global]、[Homes]、[printers]、[Userdefined_shareName],其中:

    1. Globa:用于定义全局参数和缺省值;
    2. Homes:用于用户的home目录共享;
    3. Printers:用于定义打印机共享;
    4. Userdefined_ShareName:用于自定义共享(可有多个)。
    全局配置参数[Global]

    全局配置参数常用的主要有以下几个:

    1. Workgroup:设置 samba 要加入的工作组;
    2. server string:指定浏览列表里的机器描述;
    3. netbios name:设 置samba 的 NetBIOS 名字(需要自己添加);
    4. Intterface:设置接口 IP 地址;
    5. Host allow:设置允许访问的主机 IP;
    6. log file:指定日志文件的名称;
    7. Max log size:指定日志文件的最大尺寸(KB);
    8. security:是定义 samba 的安装等级。

    案例演示1:

    修改浏览列表里的机器描述为This is My Samba Server,具体使用如下步骤:

    1. 修改 smb.conf 文件中的 server string 值(sudo vim /etc/samba/smb.conf)
    2. sudo service smbd restart
    3. smbclient -L 127.0.0.1 -U sambaUser%fzm

    [修改配置文件]

    [请在右侧“命令行”里直接体验]

    配置home共享[homes]

    home共享默认将用户的宿主目录进行了共享,这是十分危险的。为了安全考虑,我们需要自己指定共享的目录,使用home共享的好处是不同的登录用户看到的共享目录名称是本身用户名。

    常见的设置共享目录的属性有如下几个:

    1. comment :描述该共享的名称;
    2. path:定义该共享的目录;
    3. browseable :指定共享的目录是否可浏览;
    4. Writable:指定共享的目录是否有写入权限;
    5. read only:指定共享的目录为只读权限;
    6. Public:指定是否可以允许 Guest 帐户访问;
    7. Guest ok:通 public 相同,yes 为允许 guest 访问;
    8. create mask:创建文件的默认权限;
    9. directory mask:创建目录的默认权限。

    我们现在讲解为什么我们在上一关中要向配置文件添加如下属性:

    [上一关配置文件]

    可以看到我们将home的共享目录指定为/tmp,并且设置可以有写权限,以及创建文件和目录的默认权限。

    案例演示1:

    home设置为可浏览,具体使用如下步骤:

    1. 修改 smb.conf 文件中的 server string 值(sudo vim /etc/samba/smb.conf)
    2. sudo service smbd restart
    3. smbclient -L 127.0.0.1 -U sambaUser%fzm

    [修改配置文件]

    [请在右侧“命令行”里直接体验]

    可以看到现在本机共享文件夹又多了一个homes的文件夹。

    自定义共享

    自定义共享文件夹可以设置多个,设置方式与home的设置方式相似,并且共享文件夹的名字随便起。

    案例演示1:

    自定义一个共享文件夹,将共享名字设置为MyShare,指定共享目录为/tmp,并且设置其可写属性以及创建文件和目录的默认权限分别是06440755,具体使用如下步骤:

     
     
    1. 修改 smb.conf 文件中的 server string 值(sudo vim /etc/samba/smb.conf)
    2. sudo service smbd restart
    3. smbclient -L 127.0.0.1 -U sambaUser%fzm

    [追加配置文件]

    [请在右侧“命令行”里直接体验]

    可以看到新创建的共享文件夹MyShare成功的显示出来,如果登录的只需要输入:smbclient //127.0.0.1/MyShare -U userName%passwd

    编程要求

    本关任务是学会如何配置samba服务器。

    注意:在执行本关任务前,首先执行如下命令来初始化任务环境。

    1. mkdir /testDir
    2. chmod 777 /testDir
    3. useradd testUser
    4. smbpasswd -a testUser(输入新设置的密码)
    5. touch testFile

    具体编程要求如下:

    • 自定义一个共享文件夹,将共享名字设置为TestShare,指定共享目录为/testDir,同时设置其可浏览,并且设置其可写属性以及创建文件和目录的默认权限分别是06440755
    • 使用smbclient命令连接本机TestShare共享文件夹(将本机作为远程服务器,并且使用testUser用户去访问);
    • 在远程服务器上新建一个目录Dir;
    • 将本地的一个文件(/root/testFile)上传到远程主机的Dir目录下并重命名为upLoadFile

  • 相关阅读:
    【Linux系统编程】——深度理解5种IO模型
    ⽤nginx做负载均衡服务器,配置动静分离
    无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离
    远程存储访问授权
    OpenSSF发布npm 最佳实践指南,应对开源依赖风险
    【计算机基础知识】字符的编码表示
    青岛大学数据结构与算法——第3章
    linux安装CUDA、cuDNN以及ytorch-gpu
    分布式id生成(1)
    WMCTF2022 WEB
  • 原文地址:https://blog.csdn.net/qq_62377885/article/details/134451432