Samba在Unix-like作業系統上實作了微軟Windows作業系統的「網路上的芳鄰」所使用的伺服器訊息區塊(SMB, Server Message Block),又稱網路文件共享系統(CIFS, Common Internet File System),可以讓同一個網路上的機器共享檔案、操作印表機或是其它週邊設備。也就是說,透過Samba,運行Unix-like作業系統的機器也可以成為Windows作業系統的「網路上的芳鄰」。



安裝Samba

要在Ubuntu Server上安裝Samba,可以直接在終端機中執行以下指令:

sudo apt install samba

ubuntu-server-18-04-samba

Samba使用的TCP連接埠為139(共享檔案用),UDP連接埠為137(名稱解析用)和138(少量資料傳遞用),可以使用以下指令來查看Samba是否有確實安裝成功。

sudo ss -tulnp | grep -e '[sn]mbd'

ss指令可以顯示出Socket相關的資訊。-l參數可以只顯示正在監聽中的連線。若使用ss指令時都沒給任何參數的話,會忽略掉監聽中的連線。-t參數可以只顯示TCP連線。-u參數可以只顯示UDP連線。-t參數和-u參數一起用時就表示可以只顯示TCP和UDP連線。-n參數可以讓連接埠數字直接被輸出,而不是用一個名稱代替。-p參數可以顯示佔用連線的行程。

ubuntu-server-18-04-samba

如上圖,如果有看到TCP有在監聽連接埠139,而UDP也有在監聽連接埠137和138的話,就表示Samba安裝成功了!此時這台Linux機器就會出現在同一網路下的同一個工作群組(預設群組名稱是WORKGROUP)的Windows機器的「網路上的芳鄰」中。

ubuntu-server-18-04-samba

Samba預設會開啟nmbdsmbd這兩個守護行程(daemon),前者用負責管理和解析名稱,後者用於共享檔案。但如果是使用Active Directory的話,還需要執行winbinddsamba這個服務,前者用來轉換NT系統的名稱,後者用於提供AD功能以及共享檔案。

安裝SMB客戶端

上一節使用sudo apt install samba只會安裝SMB的伺服器。如果連SMB的客戶端都安裝,那就要使用以下指令:

sudo apt install smbclient

ubuntu-server-18-04-samba

查看網路上的芳鄰

使用以下指令可以列出目前網路中所有的工作群組,以及其下的可用節點。這個指令必須要安裝SMB客戶端才可以使用。

smbtree

分享Linux作業系統上的檔案或是印表機

要設定Linux作業系統上的哪些檔案或是印表機可被分享的話,需要去編輯Samba的設定檔/etc/samba/smb.conf。它預設的模樣長成這樣:

ubuntu-server-18-04-samba

ubuntu-server-18-04-samba

ubuntu-server-18-04-samba

global區塊主要可以設定工作群組的名稱和密碼驗證。有以下幾個主要欄位:

  • netbios nameNetBIOS是nmbd所使用的協定。NetBIOS名稱即為要在其它SMB客戶端顯示出來的名稱。如果不設定這個欄位,就會以主機名稱(hostname)作NetBIOS名稱。
  • netbios aliasesNetBIOS名稱別名。
  • log file記錄檔的寫入路徑。%m可被取代為記錄來源的守護行程的名稱,如nmbd、smbd。
  • workgroup工作群組名稱。
  • server string伺服器描述。
  • realm設定Kerberos和AD(Active Directory)的網域名稱。
  • passdb backend存放帳號密碼的資料庫格式和來源路徑。可以使用的格式有單純的smbpasswd和支援儲存額外資訊的tdbsam,以及透過LDAP來存取帳號資訊的ldapsam。如果沒有提供檔案路徑的話,smbpasswd會預設使用/etc/samba/smbpasswdtdbsam會預設使用/var/lib/samba/private/passdb.tdbldapsam會預設使用ldap://localhost
  • username map可以指定一個使用者名稱對應檔的檔案路徑。用來將多個使用者名稱對應到同一個使用者名稱,一行為一筆對應資料。例如root = administraor admin,可以將administraoradmin都對應到root。也可以使用「@群組名稱」的方式,將該群組下的所有使用者名稱都對應到同一個Samba的使用者名稱,例如:users = @sales
  • unix password sync是否讓Linux作業系統的使用者密碼跟著Samba使用者的密碼同步做變動。
  • securitySamba的安全性。預設會根據其它欄位來決定要使用以下哪個設定值:
    • share僅檢查密碼,不檢查使用者名稱,只要密碼有被任一使用者使用就可以通過。也可以設定only user = yes,讓Samba只允許username指定的使用者名稱所使用的密碼。
    • user使用passdb backend設定的帳號密碼來做使用權限驗證。
    • ads讓Samba伺服器成為AD網域的一員。
    • domain用Windows NT Primary或是Backup Domain Controller來驗證帳號密碼。
    • wins supportWINS(Windows Internet Name Service)伺服器專門用來查詢NetBIOS所對應的IP位址,類似DNS的定位,只不過是用於SMB網路。這個欄位可以設定Samba伺服器本身是否也要提供WINS。
    • wins server指定一個WINS伺服器IP位址,用來查詢NetBIOS所對應的IP位址。
  • guest ok是否啟用訪客帳號。預設為no
  • guest account設定訪客的使用者名稱。預設為nobody
  • map to guest將某些情況認定為訪客存取。可以設定的值有NeverBad UserBad PasswordBad Uid(用在securityads或是domain時)。

其它的區塊即為要分享的資源,具有特殊意義的區塊名稱列表如下:

  • homes共享使用者的家目錄。可以控制每個使用者的家目錄是否允許其它使用者來存取。
  • printers共享所有印表機。印表機資源比較特別的地方是它的區塊內有個printable設定項目,可以控制印表機是否允許列印。當然,也可以針對單獨的印表機來撰寫獨立的區塊,該區塊必須還要使用printer name欄位來指定印表機名稱。

把錢字號$加到區塊名稱的結尾的話,可以使該區塊所指定資源變成是隱藏的資源。區塊名稱會顯示在SMB客戶端上。

這些區塊都有以下幾個主要欄位:

  • path對於homes來說,這個欄位用來設定家目錄路徑的格式,預設是/home/%S,其中的%S會取代成使用者名稱。對於印表機資源的區塊來說,這個欄位設定的是列印時需要用來暫存檔案的目錄。對於其它資源的區塊,這個欄位是設定要共享出去的目錄。
  • comment資源的註解。
  • browseable是否讓這個區塊的資源可以被索引。如果不能的話那麼就只能利用完整路徑來存取這個區塊的資源。
  • guest ok這個欄位可覆寫global區塊的guest ok欄位的設定。
  • valid users指定允許存取這個區塊的資源的使用者。以空格分隔多筆資料。
  • invalid users指定不允許存取這個區塊的資源的使用者。以空格分隔多筆資料。
  • hosts allow指定允許存取這個區塊的資源的主機名稱、NIS網路群組名稱(以@開頭)或是Inet。以空格分隔多筆資料。
  • hosts deny指定不允許存取這個區塊的資源的主機名稱、NIS網路群組名稱(以@開頭)或是Inet。以空格分隔多筆資料。
  • interfaces指定允許存取這個區塊的網路介面,需提供該網路介面的Inet。以空格分隔多筆資料。
  • writable指定這個區塊的資源是否可被新增與寫入。
  • read only指定這個區塊的資源是否是唯讀的。這個欄位的功用正好跟writable是相反的。

舉個實例,若我們想要將/home/magiclen/shared-files這個目錄與人共享,可以在/etc/samba/smb.conf加上以下區塊:

[shared]              
    comment = Magic Shared Files
    path = /home/magiclen/shared-files
    guest ok = no
    browseable = yes
    writable = yes

設定好後必須讓Samba重新載入設定檔,可以使用以下指令:

sudo systemctl reload smbd nmbd

如此一來目錄就可以被分享出去啦!

ubuntu-server-18-04-samba

testparm檢查Samba的設定檔是否有誤

testparm指令可以檢查Samba的設定檔是否有誤,不需要讓Samba重啟或是重新載入設定檔。

ubuntu-server-18-04-samba

查看Samba的連線狀態

以下指令可以查看Samba的連線狀態:

sudo smbstatus

管理使用者帳號

smbpasswd指令可以管理SMB的使用者帳號。-a參數可以增加使用者。-x參數可以移除使用者。這邊要注意的是,SMB的使用者之帳號名稱必須也要存在於Linux作業系統的使用者帳號中。

例如要新增一個名為magiclen的使用者帳號,指令如下:

sudo smbpasswd -a magiclen

ubuntu-server-18-04-samba

查詢指定NetBIOS名稱的IP

nmblookup指令可以用來查詢指定NetBIOS名稱的IP,使用方法如下:

nmblookup NetBIOS名稱

可以搭配smbtree指令來尋找可用的NetBIOS名稱。

例如:

nmblookup MAGICLEN-PC

如果有使用WINS伺服器的話,可以加上-U參數來指定WINS伺服器的位址。

掛載SMB

先使用以下指令安裝CIFS的工具:

sudo apt install cifs-utils

ubuntu-server-18-04-samba

接著就可以直接使用mount指令來手動掛載SMB了。檔案系統的部份必須使用cifs,指令格式如下:

sudo mount -t cifs -o username=使用者名稱 //IP位址/區塊[/路徑] 掛載點

mount指令的-o參數可以是檔案系統的選項設定,可以透過usernamepassword的設定值來指定存取CIFS所需的使用者帳號和密碼。不過通常我們不會把密碼直接打在指令上,如果不設定password的話,mount指令會在之後才要求使用者輸入。

例如:

sudo mount -t cifs -o username=MagicLen '//192.168.56.201/Users' /mnt/windows

ubuntu-server-18-04-samba

如果要自動掛載的話,可以在/etc/fstab設定檔中加上如以下格式的資料:

//IP位址/區塊[/路徑] 掛載點 cifs username=使用者名稱,password=密碼 0 0