FTP文件傳輸服務確實可以讓主機之間的文件傳輸變得簡單方便,但是FTP協議的本質是傳輸文件,而非共享文件,因此要想通過客戶端直接在服務器上修改文件內容還是一件比較麻煩的事情。
1987年,微軟公司和英特爾公司共同制定了SMB(Server Messages Block,服務器消息塊)協議,旨在解決局域網內的文件或打印機等資源的共享問題,這也使得在多個主機之間共享文件變得越來越簡單。到了1991年,當時還在讀大學的Tridgwell為了解決Linux系統與Windows系統之間的文件共享問題,基於SMB協議開發出了SMBServer服務程序。這是一款開源的文件共享軟件,經過簡單配置就能夠實現Linux系統與Windows系統之間的文件共享工作。當時,Tridgwell想把這款軟件的名字SMBServer注冊成為商標,但卻被商標局以SMB是沒有意義的字符而拒絕了申請。后來Tridgwell不斷翻看詞典,突然看到一個拉丁舞蹈的名字—Samba,而且這個熱情洋溢的舞蹈名字中又恰好包含了“SMB”,於是Samba服務程序的名字由此誕生。Samba服務程序現在已經成為在Linux系統與Windows系統之間共享文件的最佳選擇。
一、安裝Samba服務:
首先使用 rpm -qa | grep samba 命令查看系統有沒有安裝Samba服務
如果沒有,使用 yum install samba 命令進行安裝
。。。中間部分輸出信息省略。。。
使用 rpm -qa | grep samba 命令查看安裝的Samba信息
service smb start # 啟動Samba服務
service smb stop # 停止Samba服務
service smb restart # 重新啟動Samba服務
service smb status # 查看Samba服務的狀態
chkconfig smb on # 加入開機啟動項
二、編輯Samba服務的配置文件:
由於在Samba服務程序的主配置文件中,注釋信息行實在太多,不便於分析里面的重要參數,因此先把主配置文件用mv命令改個名字,然后使用cat命令讀入主配置文件,再在grep命令后面添加-v參數(反向選擇),分別去掉所有以井號(#)和分號(;)開頭的注釋信息行,對於剩余的空白行可以使用^$參數來表示並進行反選過濾,最后把過濾后的可用參數信息通過重定向符覆蓋寫入到原始文件名稱中。執行過濾后剩下的Samba服務程序的參數並不復雜,為了更方便讀者查閱參數的功能,下面的表中羅列了這些參數以及相應的注釋說明。
mv /etc/samba/smb.conf /etc/samba/smb.conf-backup
cat /etc/samba/smb.conf-backup | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
vim /etc/samba/smb.conf
Samba服務程序中的參數以及作用
[global] | #全局參數。 | |
workgroup = MYGROUP | #工作組名稱 | |
server string = Samba Server Version %v | #服務器介紹信息,參數%v為顯示SMB版本號 | |
log file = /var/log/samba/log.%m | #定義日志文件的存放位置與名稱,參數%m為來訪的主機名 | |
max log size = 50 | #定義日志文件的最大容量為50KB | |
security = user | #安全驗證的方式,總共有4種 | |
#share:來訪主機無需驗證口令;比較方便,但安全性很差 | ||
#user:需驗證來訪主機提供的口令后才可以訪問;提升了安全性 | ||
#server:使用獨立的遠程主機驗證來訪主機提供的口令(集中管理賬戶) | ||
#domain:使用域控制器進行身份驗證 | ||
passdb backend = tdbsam | #定義用戶后台的類型,共有3種 | |
#smbpasswd:使用smbpasswd命令為系統用戶設置Samba服務程序的密碼 | ||
#tdbsam:創建數據庫文件並使用pdbedit命令建立Samba服務程序的用戶 | ||
#ldapsam:基於LDAP服務進行賬戶驗證 | ||
load printers = yes | #設置在Samba服務啟動時是否共享打印機設備 | |
cups options = raw | #打印機的選項 | |
[homes] | #共享參數 | |
comment = Home Directories | #描述信息 | |
browseable = no | #指定共享信息是否在“網上鄰居”中可見 | |
writable = yes | #定義是否可以執行寫入操作,與“read only”相反 | |
[printers] | #打印機共享參數 | |
comment = All Printers | ||
path = /var/spool/samba | #共享文件的實際路徑(重要)。 | |
browseable = no | ||
guest ok = no | #是否所有人可見,等同於"public"參數。 | |
writable = no | ||
printable = yes |
三、配置共享資源
第1步:創建用於訪問共享資源的賬戶信息。在CentOS 6和7系統中,Samba服務程序默認都使用的是用戶口令認證模式(user)。這種認證模式可以確保僅讓有密碼且受信任的用戶訪問共享資源,而且驗證過程也十分簡單。不過,只有建立賬戶信息數據庫之后,才能使用用戶口令認證模式。另外,Samba服務程序的數據庫要求賬戶必須在當前系統中已經存在,否則日后創建文件時將導致文件的權限屬性混亂不堪,由此引發錯誤。
pdbedit命令用於管理SMB服務程序的賬戶信息數據庫,格式為“pdbedit [選項] 賬戶”。在第一次把賬戶信息寫入到數據庫時需要使用-a參數,以后在執行修改密碼、刪除賬戶等操作時就不再需要該參數了。pdbedit命令中使用的參數以及作用如下表所示。
用於pdbedit命令的參數以及作用
參數 | 作用 |
-a 用戶名 | 建立Samba用戶 |
-x 用戶名 | 刪除Samba用戶 |
-L | 列出用戶列表 |
-Lv | 列出用戶詳細信息的列表 |
useradd samba # 創建賬戶
pdbedit -a -u samba # 把用來連接SMB服務的賬戶信息寫入到數據庫
第2步:創建用於共享資源的文件目錄。在創建時,不僅要考慮到文件讀寫權限的問題,而且由於/home目錄是系統中普通用戶的家目錄,因此還需要考慮應用於該目錄的SELinux安全上下文所帶來的限制。在前面對Samba服務程序配置文件中的注釋信息進行過濾時,這些過濾的信息中就有關於SELinux安全上下文策略的說明,我們只需按照過濾信息中有關SELinux安全上下文策略中的說明中給的值進行修改即可。修改完畢后執行restorecon命令,讓應用於目錄的新SELinux安全上下文立即生效。
mkdir /home/database/
chown -Rf samba:samba /home/database/
restorecon -Rv /home/database
第3步:設置SELinux服務與策略,使其允許通過Samba服務程序訪問普通用戶家目錄。執行getsebool命令,篩選出所有與Samba服務程序相關的SELinux域策略,根據策略的名稱(和經驗)選擇出正確的策略條目進行開啟即可:
getsebool -a | grep samba
setsebool -P samba_enable_home_dirs on
getsebool -a | grep samba
第4步:在Samba服務程序的主配置文件中,根據下表所提到的格式寫入共享信息。在原始的配置文件中,[homes]參數為來訪用戶的家目錄共享信息,[printers]參數為共享的打印機設備。這兩項如果在今后的工作中不需要,完全可以注釋掉。
用於設置Samba服務程序的參數以及作用
參數 | 作用 |
[database] | 共享名稱為database |
comment = Do not arbitrarily modify the database file | 警告用戶不要隨意修改數據庫 |
path = /home/database | 共享目錄為/home/database |
public = no | 關閉“所有人可見” |
writable = yes | 允許寫入操作 |
vim /etc/samba/smb.conf
第5步:Samba服務程序的配置工作基本完畢。接下來重啟smb服務(Samba服務程序在Linux系統中的名字為smb)並配置iptables防火牆,放通Samba服務使用的四個端口(tcp/139,445,udp/137,138),然后就可以檢驗配置效果了。
service smb restart #重新啟動Samba服務
service smb status #查看Samba服務的狀態
iptables -A INPUT -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -p udp --dport 137 -j ACCEPT
iptables -A INPUT -p udp --dport 138 -j ACCEPT
使用iptables命令配置的防火牆默認會在系統下一次重啟時失效,如果想讓配置的防火牆策略永久生效,執行保存命令:
service iptables save
CentOS7下添加端口的操作:
firewall-cmd --zone=public --add-port=139/tcp --permanent(--permanent永久生效,沒有此參數重啟后失效)
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=137/udp --permanent
firewall-cmd --zone=public --add-port=138/udp --permanent
firewall-cmd --reload # 重新加載防火牆
systemctl restart firewalld.service # 重啟防火牆
接下來就是在Windows系統下連接Samba服務了,只需在Windows的“運行”命令框中(用快捷鍵“Win+R”就可以打開)輸入兩個反斜杠,然后再加服務器的IP地址即可。
正確輸入新建的samba賬戶名以及使用pdbedit命令設置的密碼后,就可以登錄到共享界面中了,如下圖所示。此時,我們可以嘗試執行查看、寫入、更名、刪除文件等操作。
四、擴展
Samba為什么會使用四個端口,都是用來干什么的?
SMB是基於客戶機/服務器型的協議,因而一台Samba服務器既可以充當文件共享服務器,也可以充當一個Samba的客戶端,例如,一台在Linux下已經架設好的Samba服務器,Windows客戶端就可以通過SMB協議共享Samba服務器上的資源文件,同時,Samba服務器也可以訪問網絡中其它Windows系統或者Linux系統共享出來的文件。
Samba在Windows下使用的是NetBIOS協議,如果你要使用Linux下共享出來的文件,請確認你的Windows系統下是否安裝了NetBIOS協議。
組成Samba運行的有兩個服務,一個是SMB,另一個是NMB;SMB是Samba的核心啟動服務,監聽139 TCP端口,主要負責建立Linux Samba服務器與Samba客戶機之間的對話,驗證用戶身份並提供對文件和打印系統的訪問,只有SMB服務啟動,才能實現文件的共享;而NMB服務是負責解析用的,監聽137和138 UDP端口,類似與DNS實現的功能,NMB可以把Linux系統共享的工作組名稱與其IP對應起來,如果NMB服務沒有啟動,就只能通過IP來訪問共享文件。
例如,某台Samba服務器的IP地址為192.168.0.162,對應的工作組名稱為MYWORKGROUP,那么在Windows的IE瀏覽器輸入下面兩條指令都可以訪問共享文件。其實這就是Windows下查看Linux Samba服務器共享文件的方法。
\\192.168.0.162\共享目錄名稱
\\MYWORKGROUP\共享目錄名稱
Samba服務所使用的端口和協議:
1)Port 137(UDP)- NetBIOS名字服務;nmbd
2)Port 138(UDP)- NetBIOS數據報服務
3)Port 139(TCP)- 文件和打印共享;smbd(基於SMB(Server Message Block)協議,主要在局域網中使用,文件共享協議)
4)Port 389(TCP)- 用於LDAP(Active Directory Mode)
5)Port 445(TCP)- NetBIOS服務在Windows 2000及以后版本使用此端口,(Common Internet File System,CIFS,它是SMB協議擴展到Internet后,實現Internet文件共享)
6)Port 901(TCP)- 用於SWAT,用於網頁管理Samba
本文參考自:
(2)https://www.cnblogs.com/muscleape/p/6385583.html
(3)http://www.mrliangqi.com/804.html