close
比較幾個網路檔案系統:CIFS、NFS、和 SSHFS

因為最近的需要,在折騰網路檔案分享相關的東西,於是上網搜尋了不少資料。 要讓多位使用者可以互相分享、交換檔案,就需要佈置網路檔案系統, 而網路檔案系統種類繁多,因此很自然的會產生一個問題:「我應該選擇哪一個檔案系統?」 看到網路上對這個問題的討論,絕大部分都集中在檔案傳輸效能上,讓我覺得頗為奇妙! 因為不同的檔案系統存在不同的結構差異,在什麼場景下應該最適合什麼檔案系統這個問題 並不是一個效能屬性就能夠覆蓋的,在不適合的環境下選擇不適合的檔案系統, 甚至會讓你付出數倍的心力來處理這個檔案系統所引發的各種缺陷! 因此接下來我就要分享一些這陣子折騰網路檔案系統的心得, 希望能夠幫助有需要的人在選擇網路檔案系統時能夠更全面的思考。

網路檔案系統就是能夠讓網路上某臺電腦的某個設為分享的資料匣, 把它模擬成使用者自己的電腦上的磁碟的機制。 這樣,使用者就可以用一般的方法讀寫這個看起來像自己電腦裡面的磁碟, 但實際上確是在存取遠端電腦上的檔案。 網路檔案系統種類非常多,這裡只會簡單介紹並分析三個比較知名、也是我這回嘗試過的網路檔案系統: CIFS、NFS、以及 SSHFS。

CIFS/SMB

CIFS 是 Common Internet File System 的縮寫,其又被稱為 Server Message Block (SMB), 其實就是「網路上的芳鄰」一樣的東西,讓數臺區域網路內的電腦能夠彼此分享交換檔案。 SMB 最初由 IBM 發展,然後微軟接手並擴充許多功能後更名為 CIFS, 但因為某些歷史因素,很多場合還是會使用 SMB 稱呼它。

CIFS 其實沒什麼優點,它最大的優點就是 Windows 內建 CIFS 功能 (網路上的芳鄰或 Windows 分享資料匣), 所以在一般的個人電腦上配置 CIFS 通常還蠻容易的。 其它的作業系統對於 CIFS 的支援也算容易,UNIX 家族一般安裝配置 Samba 軟體 即可存取 Windows 的共享資料匣,甚至建立 CIFS 伺服器供其它電腦存取。

CIFS 的缺點其實不少, CIFS 是建基於 NetBIOS 的通訊協定,因此只能在區域網路內同網段的環境下使用, 即使後來推出了 NetBIOS over TCP/IP 的技術,也少見有人使用 CIFS 建置網際網路上的檔案分享。 不同於一般配置 CIFS 的容易,如果你要配置一個可以與外界交流的 CIFS 檔案系統,那可就夠你折騰了!

CIFS 的另外一個缺點是安全性低,這主要歸咎於兩個因素: 其一是因為美國出口法規的關係,使得 Windows 使用了安全性不足的加密機制; 其二為 CIFS 協議本身的缺陷加上 Windows 上面相關實做中存在不少數十年修不好的臭蟲, 從而導致 CIFS 機制變成病毒和駭客入侵的管道, 例如前一陣子惡名昭彰的 wannacry 勒索病毒便是利用 CIFS 的漏洞入侵用戶電腦。

在效能的表現上,CIFS 屬於中庸,沒有什麼特殊之處。 綜合以上因素,使得 CIFS 常被使用於以 Windows PC 為主的區域網路內, 例如公司內部的檔案分享伺服器。

NFS

NFS 是 Network File System 的縮寫,是另一種網路檔案分享交換機制, 最初由 Sun 所開發,現今廣泛流行於 UNIX 家族。

NFS 有兩大優點,第一是在 UNIX 家族中設置與掛載都非常方便容易,第二是速度快、效能佳。 如果做個類比,那麼 Windows 之於 CIFS 就如同 UNIX 之於 NFS, 只要在 export 檔案填寫要分享的資料匣和允許連線的電腦(可能需要安裝相關套件), 然後別臺電腦就可以直接 mount 連上了!

說到效率,NFS 可是幾個主流的網路檔案系統裡面最快速的,這得利於幾個因素。 第一是它在設計結構上就非常講究效能, 例如它不進行複雜的登入認証機制,僅使用客戶端的連線位址做為識別用戶的手段; 它捨棄了較慢的使用者名稱比對與轉換工作,直接使用兩端的 UID 與 GID 做為檔案權限依據; 它基本上沒有對傳輸資料進行加密(NFSv4 以後加入了可選的加密機制)而省去了加密的開銷等等。 第二是它在大部份系統上的實做也做了非常多的最佳化, 甚至被編為系統核心模組,將主要的工作放到核心層去執行。 綜合以上因素,使得 NFS 成為最快速高效的網路檔案系統。

然而 NFS 也存在不少缺點,最明顯的就是安全性低。 未使用加密連線使得傳輸資料被窺探的可能性提高, 另外 NFS 僅依賴網路位置來辨認用戶的方法,使得任何人都有機會假冒特定使用者進行連線, 只要該使用者能夠變更自己的連線 IP 以取代之即可。

另一項可能會令人惱火的問題是在於檔案的所有權上面, NFS 直接取用檔案的 UID 與 GID,並且在兩端不做任何轉換,真的把兩臺電腦當成一臺了! 這造成了一個問題,一個 UID 或 GID 在兩端不一定是同一個 user、甚至不一定存在該 user。 以用戶端來說,它有機會讓你看到奇怪的檔案擁有者; 以伺服端來說,它讓用戶可以冒充任何伺服器使用者的權限存取檔案 (對於伺服端的問題,可以透過一些分享設定來緩解)。

還有一個問題可能會造成網路配置與管理上的不便。 NFS 本身雖然架構在 TCP/IP 上,但卻依賴 RPC (Remote Procedure Call)服務, 於是 NFS 伺服器需要監聽多個網路埠口,並且其中多數還不是固定埠口而是變動埠口。 這個現象會讓對外網路的防火牆等相關設定維護工作較為棘手,也容易因為開放過多埠口而增加入侵風險, 這個問題與傳統的 FTP 服務一樣。

最後一個問題是在客戶端配置的難易性上。 NFS 在 UNIX 家族環境下極易配置使用,但桌面市場上佔有率極高的 Windows 並不屬於 UNIX 家族。 雖然 Windows 本身有支援 NFS 的功能,但相關服務預設為關閉, 且要啟動並使用該功能所需要的工作需要執行一些麻煩瑣碎的設定, 導致要讓 Windows 終端連上 NFS 主機變成一件麻煩事。

SSHFS

SSH 是被廣泛使用在伺服器用途的超好用工具, 它除了提供遠端登入並操作遠端電腦這個最初被賦與的任務外,還衍生出了許多功能, 例如檔案上下載、加密連線穿隧、以及由 SSH 實現的 FTP 功能(SFTP), 此外還有一缸子的軟體透過 SSH 來運作,比如說執行遠端檔案同步的 rsync 程式等。 簡單來說,SSH 在 UNIX 體系所涉入的工作可謂包羅萬象,若說什麼事情都需要 SSH 也不為過。 而 SSH File System (SSHFS)便是其中一個利用 SSH 功能的軟體, 它可以透過 SSH 存取遠端電腦的資料匣,再透過 fuse 系統在用戶端模擬為一個本地磁碟, 即成為一個實現檔案分享交換的網路檔案系統。

SSHFS 有非常多的優點,大多體現在安全、管理、與配置上面。 安全就不用說了,SSH 本身就是非常優秀的加密通訊系統, 透過 SSH 執行網路資料傳輸基本上就保障了通訊的資料保密性。

在網路連線的管理上,SSHFS 依賴於 SSH 服務,因此比照 SSH 辦理即可。 SSH 只使用單一一個 TCP 埠口, 沒有變動埠口的麻煩和風險、也沒有非 TCP 通訊模式在網際網路不易溝通連線的問題, 對防火牆以及網管人員來說應是非常方便的一個方案。

在配置上,因為 SSHFS 的連線與檔案交換其實是依循 SSH 下的 SFTP 協議, 因此伺服器管理的部份完全比照 SFTP 辦理即可, 對伺服器來說,SSHFS 用戶和 SFTP 用戶並無任何不同。 如果你已經會架設與管理 SFTP 的話,那麼你並不需要額外學習什麼東西。 在用戶端,UNIX 家族只要安裝 SSHFS 套件後就可以掛載伺服器上的資料匣了,難易度一般; Windows 用戶也可以在安裝 WinSshFS 和 Dokan 軟體後,簡單的設定就能連線掛載 SFTP 上的目錄, 甚至比連線網路上的芳鄰還要簡單。

說到它的缺點,大概是認証設定稍嫌複雜、以及還不夠廣泛流行。 因為連線時需要認証身份的關係,所以需要額外配置一些與認証有關的設定, 在 Windows 上其實很簡單,WinSshFS 會處理完一切, 只要在設定的時候填入連線帳號密碼或金鑰檔即可; 但在 UNIX 家族上就比較複雜, 要不就是客戶端需要產生並設定金鑰,然後還要交給伺服器管理員來匯入, 要不就是使用 sshpass 套件來使用密碼登入,並且還要另外配置密碼認証腳本。 這使得在 UNIX 家族上設定 SSHFS 不若其它網路檔案系統便利,這是安全的代價。

SSHFS 知名度較低,比較不容易在目前的網路分享交換環境上看到它, 然而這其實不是 SSHFS 本身的缺陷造成!SSHFS 不夠流行的主要原因是因為發展的比較晚, 我不清楚 SSHFS 的應用在什麼時候開始的, 但 Windows 上的 WinSshFS 大約是從 2012 年以後才開始發展, 因此在多數的公司行號等內部所需要的網路分享機制上,就直接選擇了 CIFS 系統至今, 有些是因為歷史因素、有些是因為 IT 人員不知道 SSHFS 的存在和能耐, 最終造成目前 SSHFS 不廣泛被使用的狀態。

最後還有一項劣勢在於效能的表現上。 其實 SSH 的各方面表現都算優秀,單以效能來說應算得上水準不錯, 畢竟在其他眾多使用 SSH 的資料傳輸場合上(比如說 rsync 或其他資料穿隧)都是快速順暢的; 只是因為前有 NFS,使得在與效能有關的評比分析上往往落於下風。 不管再怎麼努力,多了加密解密的工作是不可能比沒有加密的流程還要快的! 若再加上連線認証、使用者名稱轉換等機制、核心層與使用者層的優勢、以及其他細項的話, 那麼 SSHFS 在效能上拼不過 NFS 是非常自然的,而這也是安全和便利的代價!

綜合比較分析

綜和所有的分析後,我基本推薦在幾乎所有的場合下,網路檔案系統的首選應是 SSHFS。 SSHFS 的不論安全性、網路管理難易度、都是非常有利的,在效能表現上也算傑出, 對於終端電腦的配置算是簡便,尤其是在以 Windows 為主的用戶環境上。 特別是在用戶需要跨越網際網路與檔案系統連線時,它的各種優勢表現將最為明顯!

對於 CIFS 則是不建議使用,會需要使用到這個檔案系統的時機除了伺服器不想花多一點心思在配置分享上以外, 大概只有在應用環境絕大部分為 Windows 系統、並且嚴格要求不能在用戶端電腦安裝任何軟體的情況下吧! 另外強烈建議 CIFS 應該只規劃在阻隔良好的內部網路中使用, 並不是說 CIFS 沒辦法在經過一些調整後能夠由網際網路連線進來, 而是這麼做除了增加許多管理上的困擾外,還會讓內部的安全風險飆升。 以前一陣子的 wannacry 來說,資安專家建議關閉 TCP 埠口 445、甚至是停用整個 CIFS 機制, 此時如果你的公司是靠著 CIFS 來分享檔案的話,那做為 IT 人員應該會不知所措吧!

另外在某些狀況下選用 NFS 會是個不錯的選擇,例如當你需要非常快速的檔案傳輸,比方說經常讀寫大檔案的時候。 不過注意 NFS 只適合在可信任的區域網路,以及各上網終端固定且已知、沒有動態 IP 跳來跳去的環境下 才能放心使用;若網路環境複雜而堅持使用 NFS 的話,可能會未蒙其利先受其害!

還有一個狀況就是嵌入式裝置的開發用途中,嵌入式裝置的各種運算資源稀缺, 在 PC 上面沒什麼感覺的加密等工作到了嵌入式裝置上可能會顯得吃力、 各種加密程式庫在以 MB 計算的儲存裝置中顯得體態擁種。 而若你只是因為一時新奇而想在小裝置上使用 SSH 進行腦海中的一些酷炫工作的話, 那麼首先你必須要把 OpenSSH 重編譯並移植到裝置上、當然還包括了它所依賴的一眾工具, 我想這絕對夠你先折騰個三天三夜的! 這時候 NFS 小巧且通常內建在許多核心程式碼內的優勢就凸顯出來,幾乎是只要讓裝置能連上網路後的下一步 就可以透過 NFS 和你的開發 PC 連線交換資料。 在開發嵌入式裝置的場合,通常都是在辦公室內可受信任的小型區域網路內進行,安全性什麼的不是很重要; 而嵌入式裝置上通常也只有一個使用者帳號就是 root,比較不會有什麼不同 UID 搞得眼花撩亂的問題, 而簡單純粹的 NFS 在這情況下將能替你省去不少麻煩!

以上就是我對幾個主流網路檔案系統的評價和測試心得。

arrow
arrow

    夜行者 發表在 痞客邦 留言(0) 人氣()