CIFS 與 SMB 檔案分享協定:差異解析
在選擇用於網路檔案分享的協定時,您通常會在軟體介面和文件中看到 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)——這是現代的做法。
- 透過 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 充當網域控制器。此外,Linux 及其他作業系統上亦可取得(免費的)SMB 客戶端軟體。
什麼是 CIFS?
CIFS(即通用網際網路檔案系統)是微軟於 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 中的 SMB 以及 Microsoft Server
SMB 自 Windows 3.1(Windows for Workgroups)起即已內建於 Windows 系統中。下表說明了各 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 |
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 版本(方言)的客戶端相容。
在 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 不屬於 桑巴舞.
我們將透過 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。當我們連線時,並未使用 SMB 1.0/CIFS cifs-utils 以及 mount.cifs 命令傳送至配置於 Windows Server 2019 上的檔案伺服器。
我們也可以在 /proc/mounts 與 cat /proc/mounts Linux 中的指令。我們可以使用以下指令來篩選僅顯示所需的結果:
cat /proc/mounts | grep cifs
如輸出結果所示,用於連線至檔案分享的協定版本已標示為 cifs,但顯示的版本是 3.1.1 (vers=3.1.1),這並非 CIFS 的版本。這再次說明了 SMB 與 CIFS 這兩項術語為何容易令人混淆。
事實上,使用的是 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。雖然 Linux 的設定檔和指令中仍使用 CIFS 一詞,但並未包含 SMB 1.0/CIFS。
我們可以透過新增 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
在 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 檔案伺服器上的資料進行增量備份。





