CIFS vs SMB 文件共享协议: 解释区别

在选择在网络上共享文件的协议时,您通常会在软件界面和文档中遇到SMB和CIFS这两个术语。一些用户认为SMB和CIFS是相同的东西,清楚地区分它们可能会有困难。然而,让我们看看为什么CIFS不能被用作SMB的同义词。了解SMB与CIFS协议之间的区别以及如何使用这些术语。

什么是SMB?

SMB,或者服务器消息块,是一种工作在OSI通信模型的应用层的网络协议。SMB用于在网络上提供共享资源的访问。SMB协议被广泛用于在文件服务器上共享文件,在用户计算机之间共享文件以及在计算机之间复制文件。

除了操作文件之外,SMB的另一个用例是消息传递和打印(通用远程事务),以及浏览网络中的计算机。IBM于1983年开发了SMB,自那以后该协议已多次改进。

什么是SMB文件共享?

SMB文件共享是通过SMB协议提供的远程主机上的目录。它们在文件服务器上进行配置,并且可以对这些共享进行读写访问的配置。一个文件服务器可以有多个SMB共享。

SMB的工作原理:SMB是如何工作的?

SMB基于客户端-服务器网络原则工作。该协议使用一组包含客户端发送的请求或服务器发送的回复的数据包。客户端可以通过使用IP地址或主机名连接到服务器。这些SMB数据包可以分类为:

  • 会话控制数据包,用于建立/终止与文件共享的连接
  • 文件访问数据包,顾名思义,用于访问文件共享并操作文件
  • 一般消息数据包

在建立连接并完成身份验证后,SMB会话打开一个会话。然后SMB消息可以在此会话之间传输。在初始化会话时,SMB客户端会发送其能力列表(能力取决于客户端的SMB版本)

SMB协议可以通过以下方式工作:

  • 直接通过TCP使用端口445(无NetBIOS)-这是现代方法。
  • 通过使用UDP端口137和138以及TCP端口137和139的NetBIOS API-这是使用至Windows 2000的传统方法。最初的SMB版本使用NetBIOS over TCP/IP进行传输。

SMB协议支持批处理,即将多个消息分组并在一次传输中发送它们,以提高性能。

附加功能包括文件锁定机制,用于在多个用户打开同一文件时保护共享文件。锁定文件可以避免多个用户同时写入数据,并导致文件中的数据不一致。

IPC(进程间连接)也称为空会话连接。Windows创建的IPC$共享用于客户端和服务器之间的临时连接。此隐藏共享用于共享不能分类为文件/目录和打印机的数据,例如用户和共享枚举。

Windows系统包含本地SMB客户端和服务器。然而,客户端的Windows版本对于可以连接到主机的用户数量有限制,而服务器版本则没有此类限制。

  • Windows XP和Vista – 最多10个并发连接
  • Windows 7和Windows 10 – 最多20个并发连接

Linux上的SMB服务器通过配置Samba安装,Samba是Linux的免费SMB服务器实现。请注意,Samba还允许您将Linux加入到Active Directory域,并允许Linux充当域控制器。SMB客户端软件也可在Linux(免费)和其他操作系统上使用。

什么是CIFS?

CIFS,即通用Internet文件系统,是Microsoft在1996年发布Windows 95后开发的SMB的一种特定实现或方言。方言是一个版本而不是独立的协议。方言是一组用于在主机之间通信的消息包,定义了特定的协议版本。CIFS不是文件系统,与名称所暗示的不同。

CIFS协议规范基于原始SMB协议,但Microsoft添加了一些额外功能。Microsoft实现了通过TCP和端口445进行直接连接,而不是使用NetBIOS over TCP(在第一个SMB 1实现中使用)。CIFS是SMB 1的一种实现,而不是单独的文件共享协议。

SMB协议方言

当我们谈论微软的SMB1实现时,我们可以使用CIFS术语。在所有其他情况下,以及一般情况下,SMB是指代这种网络协议的正确术语。让我们更仔细地看看在CIFS之后发布的SMB版本,以更好地了解CIFS和其他(更新的)SMB方言(版本)之间的区别。

SMB 2.0

微软在2006年推出了SMB 2.0(或SMB2),它随Windows Vista发布。这个SMB版本比SMB 1.0/CIFS更可靠,它不是CIFS。传输文件所需的命令数量从100多个减少到20个。性能更高,因为有流水线处理机制,即在获得先前请求的回复之前发送附加请求的能力。将多个操作打包到一个请求中可以减少对客户端的请求数量,从而提高性能。

SMB 2.1

SMB 2.1与SMB 2.0相比,在性能和阻塞机制方面提供了微不足道的改进。这个协议版本是与Windows 7和Windows Server 2008 R2一起发布的。

SMB 3.0

最初,这个协议版本被称为SMB 2.2,但随后在Windows 8时被重命名为SMB 3.0。SMB 3.0版本:

  • 添加了SMB Direct(直接访问内存)、SMB Multichannel和SMB Transport Failover
  • 提高了安全性
  • 添加了端到端加密的支持
  • 通过减少延迟来提高网络效率

SMB 3.0.2

SMB 3.0.2 或 3.02 自 Windows 8.1 和 Windows Server 2012 R2 起已可用。在此版本中,可以关闭 SMB 1.0 兼容性以提高安全性。

SMB 3.1.1

此版本从 Windows 10 和 Windows Server 2016 起可用。改进包括更好的加密(AES 128 GCM 和 AES 128 CCM)以及用于预身份验证完整性检查的 SHA-512 哈希。

Windows 和 Microsoft Server 中的 SMB

Windows 从 Windows 3.1(Windows for Workgroups)起即可使用 SMB。表格中解释了不同 Windows 版本的 SMB 版本和兼容性。

列和行包含可运行 SMB 客户端或 SMB 服务器的 Windows 版本(列和行可互换)。列和行交叉处的单元格显示了相应 Windows 版本之间通信所使用的 SMB 协议版本。

Windows 10

Server 2016 及更高版本

Windows 8.1

Server 2012 R2

Windows 8

Server 2012

Windows 7

Server 2008 R2

Windows Vista

Server 2008

Win XP、Server 2003 及更早版本
Windows 10

Server 2016 及更高版本

SMB 3.1.1 SMB 3.02 SMB 3.0 SMB 2.1 SMB 2.0 SMB 1.0
Windows 8.1

Server 2012 R2

SMB 3.02 SMB 3.02 SMB 3.0 SMB 2.1 SMB 2.0 SMB 1.0
Windows 8

Server 2012

SMB 3.0 SMB 3.0 SMB 3.0 SMB 2.1 SMB 2.0 SMB 1.0
Windows 7

Server 2008 R2

SMB 2.1 SMB 2.1 SMB 2.1 SMB 2.1 SMB 2.0 SMB 1.0
Windows Vista

Server 2008

SMB 2.0 SMB 2.0 SMB 2.0 SMB 2.0 SMB 2.0 SMB 1.0
Win XP、Server 2003 及更早版本 SMB 1.0 SMB 1.0 SMB 1.0 SMB 1.0 SMB 1.0 SMB 1.0

CIFS与SMB:混淆的可能来源

让我们通过一个示例来找出为什么用户仍然混淆CIFS和SMB术语。为此,假设我们正在使用一个在Windows Server 2019上配置了SMB共享的文件服务器,以及一台通过SMB协议连接到该文件服务器的Linux机器。在本示例中,我们使用的是Ubuntu 20.04 Linux发行版。请注意,Ubuntu 22的配置相同。

我们在环境中有以下配置:

  • Windows Server 2019:192.168.101.209
  • Linux Ubuntu 20.04:192.168.101.210
  • Windows Server上的SMB共享:\\192.168.101.209\share

在Windows Server 2019中,默认情况下禁用了SMB 1.0/CIFS协议。要检查此设置并手动启用/禁用SMB1.0/CIFS客户端和服务器,请转到服务器管理器>添加角色和功能>功能

我们在Windows Server 2019机器上保持SMB 1.0/CIFS禁用。这意味着默认情况下使用SMB 3,并具有切换到SMB 2以与使用SMB 2版本(方言)的客户端兼容的能力。

在现代Windows版本(如Windows 10)中,默认情况下禁用了CIFS协议,以提高安全性,如果需要,可以手动启用。

注意:2017年,全球范围内发生了大规模勒索软件攻击(WannaCryNotPetya),利用了SMB 1漏洞的漏洞。这些漏洞被称为EternalBlue、EternalRomance和EternalChampion。微软发布了针对其操作系统的安全补丁,从Windows XP和Windows Server 2003开始,尽管这些操作系统当时并未得到官方支持。微软建议使用SMB 2和SMB 3(支持预身份验证完整性),而不是使用SMB 1.0/CIFS。

如上所述,Linux的SMB服务器名称为Samba(samba是软件包名称)。我们在Windows上使用SMB服务器。因此,在此示例中,我们不需要Samba,而是需要Ubuntu Linux的SMB客户端。

Linux CIFS Utils(cifs-utils是软件包名称)包含了Linux的SMB客户端。这就是混淆的根源。Linux的这个SMB客户端的第一个版本是在SMB 1.0/CIFS广泛使用的时候创建的。SMB协议进行了更新,发布了SMB版本2和3,但Linux SMB客户端的名称仍然保持不变,包含SMB客户端的软件包仍然被称为CIFS Utils。软件包cifs-utils不是的一部分。

我们将使用CIFS Utils从Linux连接到位于Windows Server 2019上的SMB共享,以查看CIFS是否仍在使用。要安装CIFS Utils,请以root权限运行以下命令:

sudo apt-get install cifs-utils

创建一个目录,用作SMB共享的挂载点:

mkdir /mnt/share

连接到位于远程Windows文件服务器上的SMB文件共享:

mount.cifs //192.168.101.209/share /mnt/share -o user=administrator

在我们的示例中,出于教育目的,我们使用Windows管理员用户帐户。

CIFS与SMB – 在当前会话中连接到文件服务器时使用哪一个?使用Windows Server 2019上的PowerShell命令检查连接到Windows Server上的SMB共享的客户端的SMB版本:

Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect

如我们在PowerShell输出中所看到的,从Ubuntu Linux连接时使用了SMB 3.1.1。当我们使用命令连接到配置在Windows Server 2019上的文件服务器时,不使用SMB 1.0/CIFS。

我们还可以使用Linux中的cat /proc/mounts命令来检查SMB协议版本。我们可以使用以下命令仅过滤所需结果:

cat /proc/mounts | grep cifs

如我们在输出中所见,连接到文件共享的协议版本标记为,但显示的版本为<3.1.1>(vers=3.1.1),这不是CIFS的版本。这是另一个显示SMB与CIFS术语可能混淆的例子。

事实上,使用的是SMB 3.1.1而不是CIFS。我们可以通过使用nmap>来证明这一点,这是一种用于分析和故障排除的免费网络发现工具。

在Ubuntu中安装,请以root身份运行以下命令:

sudo apt-get install nmap

要扫描所有在线并连接到我们的<192.168.101.0/24>网络的主机,我们使用以下命令:

nmap --script smb-protocols 192.168.101.0/24

我们对查看192.168.101.209的结果感兴趣,这是我们的Windows Server 2019的IP地址,它作为文件服务器运行。 Linux连接到此服务器上的文件共享。 在输出中,我们看到我们的Windows Server支持的SMB协议的方言为2.02、2.10、3.00、3.02和3.11。 没有SMB 1.0/CIFS,尽管CIFS术语仍然在Linux配置文件和命令中使用。

我们可以通过在Linux(客户端)的mount命令中添加vers=1.0参数来强制手动使用CIFS,仅在连接到远程服务器上的文件共享时使用SMB 1.0/CIFS协议。

mount -t cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0

mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0

结果如下:

服务器突然关闭了连接。 如果服务器不支持您尝试使用的SMB版本,则可能会发生这种情况。 默认的SMB版本最近从SMB1更改为SMB2.1及以上

此结果与我们在现代操作系统中进行的SMB与CIFS调查的先前结果相匹配。 不使用CIFS,并且我们的Windows Server上已禁用SMB 1.0/CIFS。

如果我们将其设置为至少使用SMB 2.0,则可以连接到服务器(请记住我们的Windows Server 2019中支持的SMB方言列表在nmap中显示):

mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=2.0

在Linux或其他操作系统中使用图形用户界面时,在定义用于连接到远程服务器上的文件共享的网络协议时,请在地址栏中使用

输入SMB文件共享地址时,应使用:

smb://server-name/share-name

不要使用:

cifs://server-name/share-name

因为客户端将尝试使用SMB1.0/CIFS协议进行连接,而服务器可能已禁用该协议(如果客户端甚至支持语法)。

结论

现在CIFS协议已过时,SMB是用于连接到文件服务器和NAS上的共享存储的协议之一(另一个常用的是NFS)。由于共享存储特别容易受到数据损坏、勒索软件和其他可能轻易在网络上传播的威胁,确保备份存储在共享资源上的文件和文件夹,以避免数据丢失。即使感染了具有对共享文件写入权限的一个用户的计算机,也可能导致所有用户的数据丢失。

NAKIVO备份与复制是一种数据保护解决方案,支持对存储在NAS和Windows/Linux文件服务器上的数据进行增量备份,使用SMB和NFS。

Source:
https://www.nakivo.com/blog/cifs-vs-smb/