CIFS 與 SMB 檔案分享協定:差異解析

在選擇用於透過網路進行檔案分享的協定時,您通常會在軟體介面和文件中看到”SMB”和”CIFS”這兩個術語。有些使用者認為 SMB 和 CIFS 是同一回事,而要明確區分兩者的差異可能相當困難。然而,讓我們來探討為何 CIFS 不能作為 SMB 的同義詞。了解 SMB 與 CIFS 協定之間的差異,以及如何正確使用這些術語。

NAKIVO 用於 NAS 資料備份

NAKIVO 用於 NAS 資料備份

針對 NAS設備以及 Windows 和 Linux 檔案分享資料夾中的數 GB 資料,提供快速的備份與還原功能。無論您需要什麼,無論何時需要,都能在數秒內完成還原。

什麼是 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)——這是現代的做法。
  • 透過 NetBIOS API,使用 UDP 埠 137 和 138 以及 TCP 埠 137 和 139 —— 這是 Windows 2000 之前採用的傳統方法。SMB 的早期版本採用 NetBIOS over TCP/IP 作為傳輸協定。

SMB 協定支援批次傳輸,也就是將多則訊息分組,並透過單次傳輸一併發送,以提升效能。

其他功能性還包括檔案鎖定機制,用以在多名使用者同時開啟同一份檔案時保護共享檔案。鎖定檔案可避免多名使用者同時寫入資料,從而防止檔案內產生資料不一致的情況。

IPC(進程間通訊)亦稱為 null 連線。該 IPC$ Windows 建立的共享用於客戶端與伺服器之間的臨時連線。此隱藏共享是用來共用無法歸類為檔案/資料夾或印表機的資料,例如使用者及共享清點。

Windows 系統內建原生 SMB 客戶端與伺服器。然而,Windows 客戶端版本對可連線至主機的使用者數量設有限制,這與 Windows Server 版本不同,後者並無此類限制。

  • Windows XP 和 Vista – 最多 10 個同時連線
  • Windows 7 和 Windows 10 – 最多 20 個同時連線

在 Linux 上安裝 SMB 伺服器,是透過設定 Samba 來實現的,Samba 是一種適用於 Linux 的自由開源 SMB 伺服器實作。請注意,Samba 還允許您將 Linux 加入 Active Directory 網域,並讓 Linux 充當網域控制器。SMB 客戶端軟體在 Linux(免費)及其他作業系統上皆可取得。

什麼是 CIFS?

CIFS(即通用網際網路檔案系統,Common Internet File System)是微軟於 1996 年在 Windows 95 發布後所開發的 SMB 特定實作或方言。所謂”方言”指的是版本,而非獨立的協議。方言是一組用於主機間通訊的傳送/接收訊息封包,用以定義特定的協議版本。與其名稱所暗示的不同,CIFS 並非檔案系統。

CIFS 協定規格是以原始的 SMB 協定為基礎,但由微軟新增了若干特點。微軟透過 TCP 及 445 號埠實作直接連線,而未使用”TCP 上的 NetBIOS”(此機制曾用於最早的 SMB 1 實作中)。CIFS 是 SMB 1 的實作,而非獨立的檔案分享協定。

SMB 通訊協定方言

當我們談論微軟的 SMB1 實作時,可以使用”CIFS”這個術語。在所有其他情況下,以及一般而言,”SMB”才是指稱此網路通訊協定的正確術語。讓我們仔細檢視 CIFS 之後發布的 SMB 版本,以便更深入了解 CIFS 與其他(較新)SMB 變體(版本)之間的差異。

SMB 2.0

微軟於 2006 年隨 Windows Vista 一起發布了 SMB 2.0(或稱 SMB2)。此 SMB 版本比 SMB 1.0/CIFS 更為可靠,且並非 CIFS。傳輸檔案所需的指令數量從 100 多個減少至 20 個。 其效能提升歸功於管線處理機制,也就是在收到前一個請求的回應之前,就能發送額外請求的能力。將多項操作打包成單一請求,可減少發送至客戶端的請求數量,從而提升效能。

SMB 2.1

相較於 SMB 2.0,SMB 2.1 在效能和阻塞機制方面僅有微幅改善。此協定版本隨 Windows 7 及 Windows Server 2008 R2 一併發布。

SMB 3.0

起初,此協定版本稱為 SMB 2.2,但隨後在 Windows 8 推出時更名為 SMB 3.0。SMB 3.0 版本:

  • 新增了 SMB Direct(直接存取記憶體)、SMB 多通道及 SMB 傳輸故障移轉功能
  • 加強了安全性
  • 新增對端對端加密的支援
  • 透過降低延遲來提升網路效率

SMB 3.0.2

自 Windows 8.1 及 Windows Server 2012 R2 起,已提供 SMB 3.0.2 或 3.02 版本。在此版本中,可關閉 SMB 1.0 相容性以提升安全性。

SMB 3.1.1

此版本自 Windows 10 及 Windows Server 2016 起提供。其改進之處包括更強的加密機制(AES 128 GCM 及 AES 128 CCM),以及用於預驗證完整性檢查的 SHA-512 雜湊函數。

Windows 和 Microsoft Server 中的 SMB

SMB 自 Windows 3.1(Windows for Workgroups)起即於 Windows 系統中提供。下表說明了各 Windows 版本的 SMB 版本及相容性。

各欄與各列所列的 Windows 版本皆可執行 SMB 客戶端或 SMB 伺服器(欄與列可互換)。位於欄與列交點的儲存格則顯示,相應的 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

Windows 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
Windows 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 這兩項術語混淆。為此,假設我們正在使用一台檔案伺服器,該伺服器上已設定了 SMB 檔案分享 Windows Server 2019 以及一台透過 SMB 協定連線至此檔案伺服器的 Linux 電腦。本範例中使用的 Linux 發行版為 Ubuntu 20.04。請注意,Ubuntu 22 的設定方式與此相同。

我們的環境中採用以下設定:

  • Windows Server 2019:192.168.101.209
  • Linux Ubuntu 20.04:192.168.101.210
  • Windows Server 上的 SMB 共用: 192.168.101.209 共用資料夾

在 Windows Server 2019 中,SMB 1.0/CIFS 通訊協定預設為停用狀態。若要檢查此設定,並手動啟用或停用 SMB 1.0/CIFS 客戶端與伺服器,請前往 Server Manager > Add Roles and Features > Features.

我們在 Windows Server 2019 伺服器上持續停用 SMB 1.0/CIFS。這表示預設會使用 SMB 3,同時可切換至 SMB 2,以確保與使用 SMB 2 版本(方言)的客戶端相容。

CIFS vs SMB – SMB 1.0/CIFS is disabled by default in Windows Server 2019

在 Windows 10 等現代 Windows 版本中,為提升安全性,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 (桑巴舞 (即套件名稱)。我們在 Windows 上使用 SMB 伺服器。因此,在此範例中我們不需要 Samba,而是需要一個適用於 Ubuntu Linux 的 SMB 客戶端。

Linux CIFS Utils 中包含了一個適用於 Linux 的 SMB 客戶端(cifs-utils (即套件名稱)。這正是造成混淆的根源。此 Linux 版客戶端的首個版本,是在 SMB 1.0/CIFS 廣泛使用的時期所開發的。儘管 SMB 協定已進行更新,並發布了 SMB 2 版與 3 版,但 Linux SMB 客戶端的名稱始終未變,而包含該 SMB 客戶端的套件至今仍稱為 CIFS Utils。該套件 cifs-utils 不屬於 桑巴舞.

我們將從 Linux 系統使用 CIFS Utils 連線至 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 管理員使用者帳戶。

What is SMB file share – connecting to the share from Linux

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。當我們連線至 cifs-utils 以及 mount.cifs 指令傳送至一臺已於 Windows Server 2019 上設定好的檔案伺服器。

What is SMB file share – how to check the SMB dialect used

我們也可以在以下位置檢查 SMB 協定版本: /proc/mounts 與該 cat /proc/mounts Linux 中的指令。我們可以使用以下指令,僅篩選所需的結果:

cat /proc/mounts | grep cifs

從輸出結果中可以看出,用於連線至檔案分享的協定版本已標示為 cifs,但顯示的版本是 3.1.1 (vers=3.1.1),這並非 CIFS 的某個版本。這又是一個例子,顯示”SMB”與”CIFS”這兩個術語為何容易被混淆。

CIFS vs SMB – checking which SMB version is used for the current connection

事實上,使用的是 SMB 3.1.1,而非 CIFS。我們還可以透過另一種方法來證明這一點,方法是使用 nmap,這是一款用於分析和故障排除的免費網路偵測工具。

安裝方法 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,儘管在 Linux 的設定檔和指令中仍會使用”CIFS”一詞。

CIFS vs SMB – checking which SMB dialects are supported on the server

我們可以透過新增 vers=1.0 參數在 mount 在 Linux(客戶端)中,用於在連線至遠端伺服器的檔案分享時,僅使用 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 比較研究結果相符。我們的 Windows Server 並未使用 CIFS,且已停用 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

Connecting to an SMB share using the SMB2 dialect from Linux

在 Linux 或其他作業系統中使用圖形使用者介面時,請使用 smb:// 在定義用於連線至遠端伺服器上檔案分享之網路協定時,請在位址欄中輸入:

。輸入 SMB 檔案分享的位址時,應使用:

smb://server-name/share-name

請勿使用:

cifs://server-name/share-name

因為客戶端會嘗試使用 SMB1.0/CIFS 協定進行連線,而伺服器上可能已停用該協定(假設客戶端甚至支援該協定 cifs:// (語法)。

結論

由於 CIFS 協定已過時,SMB 現已成為用於連線至檔案伺服器及 NAS 上共用儲存空間的協定之一(另一種常用協定則是 NFS)。鑑於共用儲存空間特別容易遭受資料損毀、勒索軟體以及其他可輕易在網路中傳播的威脅,請務必備份儲存於共用資源中的檔案和資料夾,以避免資料遺失。 即使只有一名擁有共用檔案寫入權限的使用者電腦遭到感染,也可能會導致所有使用者都遭受資料遺失。

NAKIVO Backup & Replication 這是一套資料保護解決方案,支援透過 SMB 和 NFS 協定,對儲存於 NAS 及 Windows/Linux 檔案伺服器上的資料進行增量備份。

試試看 NAKIVO Backup & Replication

試試看 NAKIVO Backup & Replication

立即申請免費試用,全面探索本解決方案的所有資料保護功能。15 天免費試用。無任何特點或容量限制。無需提供信用卡資訊。

People also read