選擇在網絡上共享文件的協議時,您通常會在軟件界面和文檔中遇到SMB和CIFS詞語。一些用戶認為SMB和CIFS是相同的東西,清楚地辨認出它們之間的區別可能會很困難。但是,讓我們來看看為什麼CIFS不能被用作SMB的同義詞。了解SMB與CIFS協議之間的區別以及如何使用這些術語。
什麼是SMB?
SMB,或者Server Message Block,是一種工作在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 Server 版本不同,客戶端 Windows 版本對能連接到主機的用戶數量有限制。
- Windows XP 和 Vista – 最多 10 個並發連接
- Windows 7 和 Windows 10 – 最多 20 個並發連接
在 Linux 上安裝 SMB 服務器是通過配置 Samba 實現的,這是 Linux 的免費 SMB 服務器實現。請注意,Samba 還允許您將 Linux 加入到活動目錄域中,並允許 Linux 充當域控制器。SMB 客戶端軟件也可在 Linux(免費)和其他操作系統上使用。
什麼是 CIFS?
CIFS,即通用互聯網文件系統,是由 Microsoft 在 1996 年 Windows 95 發布後開發的 SMB 的特定實現或方言。方言是一個版本,而不是獨立的獨立協議。方言是一組消息封包,用於在主機之間通信的傳遞/接收定義了特定的協議版本。CIFS 不是一個文件系統,與名稱所暗示的不同。
CIFS 協議規範基於原始 SMB 協議,但微軟添加了一些額外的功能。微軟實現了通過 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 3.1(Windows for Workgroups)開始可用的 Windows 中提供 SMB。表格中解釋了不同 Windows 版本的 SMB 版本和兼容性。
列和行包含可以運行 SMB 客戶端或 SMB 服務器的 Windows 版本(列和行可以互換)。列和行交叉處的單元格顯示了相應 Windows 版本之間通信所使用的 SMB 協議版本。
Windows 10
伺服器 2016 及更新版本 |
Windows 8.1
伺服器 2012 R2 |
Windows 8
伺服器 2012 |
Windows 7
伺服器 2008 R2 |
Windows Vista
伺服器 2008 |
Win XP、伺服器 2003 及更舊版本 | |
Windows 10
伺服器 2016 及更新版本 |
SMB 3.1.1 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows 8.1
伺服器 2012 R2 |
SMB 3.02 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows 8
伺服器 2012 |
SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows 7
伺服器 2008 R2 |
SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows Vista
伺服器 2008 |
SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 1.0 |
Win XP、伺服器 2003 及更舊版本 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
CIFS 與 SMB:混淆的可能源頭
讓我們使用一個例子來找出為什麼 CIFS 和 SMB 這兩個術語仍然會讓使用者感到困惑。為此,假設我們正在使用一台配置了 SMB 共享的檔案伺服器Windows Server 2019,並且一台 Linux 機器通過 SMB 協議連接到這台檔案伺服器。在這個例子中,我們使用的是 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 年,全球大規模勒索軟件攻擊(WannaCry 和 NotPetya)利用 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 不是 samba 的一部分。
我們將使用 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 vs SMB – 在目前的連線中,用於連接到檔案伺服器的是哪一個?使用 PowerShell 命令在 Windows Server 2019 上檢查連接到 Windows Server 上的 SMB 共享的用戶端的 SMB 版本:
Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect
如我們在 PowerShell 輸出中所看到的,從 Ubuntu Linux 到我們的連接中使用了 SMB 3.1.1。當我們使用 cifs-utils 和 mount.cifs 命令連接到配置在 Windows Server 2019 上的檔案伺服器時,並未使用 SMB 1.0/CIFS。
我們也可以在 Linux 中使用 /proc/mounts 中的 cat /proc/mounts 命令來檢查 SMB 協議版本。我們可以使用以下命令僅篩選所需的結果:
cat /proc/mounts | grep cifs
如我們在輸出中所見,連接到檔案共用的協議版本標記為 cifs,但顯示的版本是 3.1.1 (vers=3.1.1),這並非 CIFS 的版本。這是另一個顯示 SMB 與 CIFS 術語可能混淆的例子。
事實上,使用的是 SMB 3.1.1 而非 CIFS。我們可以通過使用 nmap 進行另一種方法來證明這一點,該工具是用於分析和故障排除的免費網絡發現工具。
在 Ubuntu 中安裝 nmap,運行以下命令作為 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。雖然在Linux配置文件和命令中仍然使用CIFS術語,但沒有SMB 1.0/CIFS。
我們可以通過在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 vs CIFS調查的先前結果相符。我們的Windows Server上未使用CIFS,並且已禁用SMB 1.0/CIFS。
如果我們將其設置為至少使用SMB 2.0,那麼我們可以連接到伺服器(請記住我們的Windows Server 2019顯示在nmap中支援的SMB方言列表):
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。