Linux 搭建Samba服务

Samba 介绍

SMB最开始是windows开发的一种协议,用于在Windows系统中实现文件和打印服务的共享。后来有一个叫作 Andrew Tridgell 的人在1992年开发了一个叫作samba的开源软件,该软件实现了windows的SMB/CIFS网络协议,可以用来在类Unix和windows之间文件共享。

Samba的出现是为了提供跨平台的文件和打印共享服务,特别是在以Windows为主的网络环境中,使得Unix和Linux系统可以无缝地集成进来。


CIFS:common internet file system的缩写,译为通用网络文件系统,基于smb协议开发而来的文件系统,可以理解为SMB协议的升级版。


因为Samba实现的是SMB/CIFS协议,所以自然Samba服务端使用的是445和139端口。

139端口:主要用于支持基于NetBIOS(Network Basic Input/Output System)的SMB会话。NetBIOS是一种较老的网络协议,用于提供本地网络内的计算机名称解析和会话服务。所以在一些网络中还有依赖NetBIOS的设备环境中,可能需要使用139端口

445端口:随着时间的推移,SMB协议得到了改进,发展出一种直接在TCP/IP上运行的方式,不再依赖于NetBIOS。这就是端口445的用途。它用于“直接SMB”(Direct SMB),即SMB协议直接通过TCP/IP进行通信。在现代网络中,基本上用的多是445端口,因为它直接基于TCP/IP,更加高效且不依赖于NetBIOS。


不同端口的使用场景:

139端口:windows95、windows2000还有一些很早很早的Unix或Linux系统会用到139端口。

445端口:window7、Windows XP以及后面一些版本,还有一些现代Linux发行版,主要使用端口445进行SMB通信。

所以,由此可知Samba同时监听了139和445端口并不是两个端口都用了,同时监听两个端口是为了兼容一些老系统、老设备。但是现在大多数网络配置中,用的都是445端口共享资源,139端口没使用。

Linux 搭建Samba服务端

1、安装服务

一般通过软件管理工具,例如yum、apt这些进行安装就行了,也可以去官网下载源码包编译安装。

samba官网:https://www.samba.org/

例如:ubuntu安装samba

sudo apt install samba -y

2、添加用户

一般情况下,系统上已经存在对应的系统用户,需要访问存储在Samba服务器上的共享资源时,可以通过 smbpasswd 命令将系统用户添加到samba的用户数据库中,并且为该用户在Samba中设置密码。

samba的用户数据库是: /var/lib/samba/private/passdb.tdb


(1)创建系统用户

useradd -r -s /sbin/nologin  smb1

(2)将系统用户添加到samba数据库中并设置密码

smbpasswd -a smb1

(3)通过pdbedit -L可以查看samba数据库中的用户有哪些,只有在samba数据库中的用户才能访问samba服务端共享资源。

# 需要root权限,不然会出现错误提醒
pdbedit -L

说明: 如果要删除一个samba用户的话,使用 smbpasswd 的 -x 选项可以实现;

例如:删除smb1这个用户

smbpasswd -x  smb1

3、共享配置

通过软件包管理工具安装的samba服务,配置文件一般是 /etc/samba/smb.conf 文件。可以通过编辑这个配置文件来指定需要共享的目录。


配置共享目录时的格式大致是这样的

[xxxx]              # 共享模块的名称,这里的xxxx是共享名,可以自定义
comment = xxxx      # 共享模块的描述信息
path = /path        # 共享目录的具体路径,应替换为实际路径
available = yes     # 指定该共享是否可用,yes表示可用
browseable = yes    # 是否在网络邻居中显示此共享,yes表示显示,no则隐藏
public = yes        # yes表示共享是公开的,任何人都可以访问。如果设置为 no,则需要通过身份验证才能访问。
writable = yes      # 是否允许用户写入数据到共享目录,yes表示可写
valid users = smb1  # 指定哪些用户或用户组可以访问该共享,不指定表示所有用户,如果指定用户,可以是单个用户或多个用户,用空格分隔

例如:需要共享/home/share目录,但是客户端只能读不能写,可以这样配置

[share]
comment = Shared Folder
path = /home/share
available = yes
browseable = yes
public = no
writable = no
valid users = smb1

例如:共享/home/share1目录,客户端可以修改共享目录中的数据,可以这样配置

[share]
comment = Shared Folder
path = /home/share
available = yes
browseable = yes
public = no
writable = yes
valid users = smbuser
create mask = 0664
directory mask = 0775

4、配置检验

一般通过smbclient这个工具可以检查配置是否成功

smbclient -L  server_hsot -U user%passwd

windows 搭建samba服务端

1、设置共享目录

2、设置共享用户

3、验证配置

在 网络驱动器映射 使用UNC格式的路径输入路径即可。

UNC 格式说明

UNC:(Universal Naming Convention)通用命名规则。由微软公司发明,是一种用于在网络上指定文件或文件夹位置的命名约定,允许用户通过网络共享访问文件和文件夹。


UNC格式广泛使用在windows中,Linux中也支持这种格式,例如使用Samba软件包来实现文件和打印机的共享。

UNC的格式如下:

\\主机名或者主机地址\共享资源的名称

例如:

\\192.168.16.238\monitor

说明:

UNC格式不允许指定端口号,因为端口号不是共享资源的一部分

例如,对于SMB/CIFS服务,默认端口通常是445。如果服务端的端口号变了,就需要另想他法了。

Samba 客户端工具

windows 图形工具

Windows操作系统自带了对SMB/CIFS协议的支持,因此可以直接连接到Samba服务器。


需要在 控制面版 中可以启用相关功能:


勾选对SMB的支持


用户可以通过映射网络驱动器(输入\服务器地址\共享名称)来访问Samba共享。


也可以通过win+r快捷键打开“运行”(输入\服务器地址\共享名称)来访问Samba共享。

Linux 命令行工具

Linux操作系统中常用的命令行可以端工具是 smbclient ,通过该工具可以显示指定服务器端所分享出来的所有资源或者连接道samba服务端。


例如:列出服务器共享的模块名称

smbclient -L 10.0.0.22 -U smb3%redhat

	Sharename       Type      Comment
	---------       ----      -------
	share           Disk
	IPC$            IPC       IPC Service (Samba 4.7.6-Ubuntu)

例如:进入到samba服务器

smbclient //10.0.0.22/share -U smb3%redhat
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Mar 16 23:30:36 2023
  ..                                  D        0  Thu Mar 16 20:37:15 2023
  3.txt                               N        0  Thu Mar 16 20:46:26 2023
  5.txt                               N        0  Thu Mar 16 20:46:45 2023
  2.txt                               N        0  Thu Mar 16 20:46:39 2023
  6.txt                               N        0  Thu Mar 16 20:47:05 2023
  7.txt                               A        0  Thu Mar 16 23:30:32 2023

说明:

使用该工具登录到samba服务端的时候,使用的也是UNC格式,但是在Linux操作系统中,需要将反斜线()换为斜线(/)

Samba 自定义端口

因为以前永恒之蓝病毒和smb1的漏洞,运营商直接把139和445这两个端口给屏蔽了,即使手动在防火墙打开这两个端口也没法使用。所以可以在smaba的配置文件中通过 smb ports 指令在 [global] 部分 或者自己定义的模块部分指定。

[global]
# 可以指定多个端口,用空格隔开
smb ports = 4450

但是这样就存在了一个问题,因为是通过UNC格式来发现共享路径的,但是UNC格式不支持指定端口号。

Linux 解决方案

在Linux上,如果服务端的端口不是默认的,可以通过mount -t cifs命令指定端口

例如:

sudo mount -t cifs //192.168.252.155/share /mnt/share -o port=4450,username=Orchid,password=redhat

Windows 解决方案

在windows上,如果服务端的端口不是默认的,有两种方法解决这个问题:


方法一:配置本地端口映射转发

缺点:这个方法不是每个windows客户端都能配置成功:

netsh interface portproxy add v4tov4
listenport=445 listenaddress=127.0.0.1 connectport=4450 connectaddress=116.204.122.151

# 将所有发送到本机IP(127.0.0.1)的445端口的流量转发到IP地址为116.204.122.151的远程服务器的4450端口上。

说明:

  • netsh interface portproxy add v4tov4:这是告诉 netsh 工具添加一个新的端口代理规则,用于IPv4到IPv4的通信

  • listenport=445:指定本地计算机上的监听端口。设置为监听标准的SMB端口445

  • listenaddress=127.0.0.1:这指定了监听地址。127.0.0.1 是本地主机的IP地址,表明该规则仅适用于针对本机的连接请求

  • connectport=4450:指定了远程Samba服务器上的自定义端口4450

  • connectaddress=116.204.122.151:远程Samba服务器的IP地址


方法二:使用端口转发驱动。

缺点:开启端口转发后,本地的其它一些网络流量可能会收到一些影响。

官网: https://tubecast.webrox.fr/landrive/portmapping.html

官网: https://www.verigio.com/products/multi-port-forwarder/default

使用 CIFS

上面我们说了CIFS是SMB协议的升级版,叫作通用网络文件系统。CIFS的有一个重要特性就是跨平台性,不仅在Windows环境中得到广泛应用,也被Linux、macOS等系统支持,使得不同操作系统的用户可以轻松地共享文件和资源。

Linux挂载windows共享目录

1、Linux中安装 cifs-utils 工具包可以启用系统CIFS的支持,这个工具包提供了必要的用户空间工具来挂载和操作CIFS文件系统。此时便可以通过标准的挂载命令将CIFS共享挂载为本地文件系统。

sudo apt install  cifs-utils

2、使用mount命令进行挂载测试

sudo mount -t cifs //host/share  mount_point

例如:

//192.168.16.238/monitor   /home/vsftpd

3、编辑/etc/fstab配置文件实现持久化挂载

//192.168.252.155/G  /data/samba  cifs  username=Orchid,password=redhat,file_mode=0666,dir_mode=0777,_netdev 0 0

说明:

挂载CIFS共享时,通常是在挂载点设置权限和所有权,而不是在共享上直接更改权限。这是因为CIFS共享(通常是Windows共享)遵循的权限模型与Linux不同。在Linux中,对文件和目录的权限更改通常是基于文件系统级别的,而CIFS共享的权限通常由远程服务器(如Windows服务器)控制。

所以造成的后果就是挂载之后没法用chown 、chmod等命令来更改权限。为了解决这个问题需要在挂载共享目录的时候,通过设置 file_mode 和 dir_mode 选项来控制访问权限,些选项允许您指定挂载的共享中所有文件和目录的默认权限。(共享的实际权限由服务器端控制,需要服务端开放了相关权限才可以通过这个参数设置)


例如:

ile_mode=0666,dir_mode=0777 会使所有文件可读写,所有目录可读写执行。

注意:

  • 192.168.252.155/G是Windows Server共享的路径,挂载点使用UNC格式指定,使用斜线(/)来表示路径,而不是Windows中常用的反斜线(\)

  • 挂载选项需要指定username和password,如果windows共享目录时候没有设置用户名和密码,就随便在fstab文件里指定一个。

  • 在/etc/fstab文件中添加_netdev选项的主要目的是告诉系统这是一个网络文件系统。这样,系统会在网络服务可用后再尝试挂载这个文件系统,可以避免在网络尚未准备好时挂载失败的情况。

例如:windows共享目录时没有设置用户名和密码的配置

//192.168.16.238/monitor     /home/vsftpd  cifs   username=root,password=12345,file_mode=0666,dir_mode=0777,_netdev   0 0

4、使用mount工具进行挂载

mount -a

5、输入df -h命令进行检查

df -h

windows挂载Linux共享模块

1、选择网络驱动器


2、输入相关凭证


3、检查是否挂载成功

使用场景

在企业环境中,常常需要跨平台共享数据。


Linux挂载windows共享目录使用场景:

例如,当客户使用Windows Server服务器共享了一定大小的目录时,可能需要将此目录挂载到Linux系统上。在这种场景下,Windows服务器先创建一个共享目录。

随后,Linux系统可以通过CIFS协议将这个共享目录挂载到本地的一个指定目录中,从而使得Linux系统内的特定数据能够被存储并同步到这个Windows共享目录。

说明: 在这个场景下,为了保证安全,不想直接将密码暴漏在配置文件中

//192.168.252.155/G  /data/samba  cifs  username=Orchid,password=redhat,_netdev 0 0

可以通过在本地创建一个存放密码的文件,然后配置600权限后,通过cred或credentials指令来指定密码文件位置。

sudo vim /etc/smb.txt
username=Orchid  # 或 user=Orchid
password=redhat  # 或 pass=redhat

sudo chmod 600 /etc/smb.txt

sudo vim /etc/fstab
//192.168.252.155/G  /data/samba  cifs  cred=/etc/smb.txt,_netdev 0 0


Linux共享目录映射到Windows使用场景:

将Linux系统中的数据实时更新到Windows系统上。这可以通过在Linux上使用Samba工具来搭建服务端并共享特定目录实现。

一旦这个共享目录在Linux上设置好后,Windows用户便可以通过网络驱动器映射功能将其映射为本地的一个硬盘。这样,Windows用户就可以直接访问和同步Linux中的共享数据。

posted on 2023-11-11 23:46  背对背依靠  阅读(700)  评论(0编辑  收藏  举报