目前,局域網上通常采用SMB(Server Messages Block,信息服務塊)協(xié)議共享文件和打印機。SMB協(xié)議是客戶機/服務器型協(xié)議,提供共享資源的機器為服務器端,要訪問的機器為客戶機端??蛻魴C通過該協(xié)議可以訪問服務器上的共享文件系統(tǒng)、打印機及其他資源,它為局域網內的不同計算機之間提供文件及打印機等資源的共享服務。
SMB協(xié)議目前發(fā)展到SMB 3.0版 本(Windows Server 2012及以上),日常多使用SMB 2.x版本。SMB是一個跨平臺協(xié)議,Windows和類Unix系統(tǒng)都支持。Linux、UNIX系統(tǒng)和Windows系統(tǒng)資源共享通常使用Samba,Samba是實現SMB協(xié)議的一個免費軟件。
圖1 SMB協(xié)議工作層次
SMB協(xié)議工作在應用層和會話層,可用在因特網的TCP/IP協(xié)議之上,也可用在其他網絡協(xié)議如IPX和NetBEUI之上,平常多用于TCP/IP協(xié)議之上(如圖1)。
SMB協(xié)議有兩種工作方式,分別為NetBIOS Over TCP/IP(簡 稱 NetBT) 和Direct hosting。 在 早 期的Windows系統(tǒng)之中,主要使用NetBIOS進行通訊,到了Windows 2000后,又新增加了Direct hosting方式,但并沒有取消NetBT,兩種方式并存。
當采用NetBT方式通信時,會通過NetBIOS接口來進行連接,分占別用UDP137、138和TCP139端口,其中137端口用來進行名字解析,138端口傳遞數據包,139用于會話服務,進行文件傳輸,因此最重要的就是139端口了。NetBT共享典型運用方式為通過網上鄰居查找訪問共享資源。
當采用Direct hosting時更為簡單,直接跳過NetBIOS接口,不需要進行名稱解析,直接使用TCP445端口傳輸。該方式典型應用方式為,通過“\IP”訪問共享資源。
注意:NetBT方式是隨網卡綁定的,如果網卡設置多個IP,只能綁定在網卡的第一個IP地址上;而Direct hosting方式卻沒有這樣的限制。由于主機不能自動識別采用正確的共享連接方式,而是采取的類似“隨機搶答”的方式,既可能采用NetBT,也可能采用Direct hosting,當選擇前者時就會出現不通的故障,使用后者時則完全正常。
當計算機同時支持NetBT和Direct hosting兩種方式的時候,就面臨著選擇139或者445端口了,根據下面的情況確定會話使用的端口。
1.如果客戶機端啟用了NBT(139端口),那么連接的時候將同時訪問服務器端139和445端口,如果從445端口得到回應,那么客戶端將發(fā)送RST到139端口,終止這個端口的連接,接著就從445端口進行SMB會話了。如果沒有從445端口而是從139得到回應,那么就從139端口進行會話;如果沒有得到任何回應,那么SMB會話失敗。兩種端口使用優(yōu)先級為:445端口>139端口。
2.如果客戶機端禁用了NBT,客戶機就將只從服務器端445端口進行連接。
圖2 Windows系統(tǒng)開啟TCP 139端口
3.如果服務器端啟用NetBT,那么就同時監(jiān)聽UDP 137、138 端口和 TCP139,445端口。如果禁用NBT,那么就只監(jiān)聽445端口了。
由于SMB協(xié)議提供共享的兩種渠道NetBT(TCP 139)和Direct hosting(TCP 445),可以允許同時存在也可以只允許其中一種方式。因此,出現共享故障時,我們要特別關注這兩種端口的連接情況。
Windows系統(tǒng),我們可以通過 netstat -an | find"139"、netstat -an | find"445"命令查看端口是否監(jiān)聽、連接。Linux系統(tǒng)通過netstat -an | grep 139、netstat -an | grep 445命令查看端口是否連接。
Windows系 統(tǒng)(以Windows 7旗艦版為例,下同)開啟139端口的方法:“本地連接”中選取“Internet協(xié)議(TCP/IP)版本 4”屬性,進入“高級TCP/IP設置”“WINS設置”里面有一項“禁用TCP/IP 的 NETBIOS”,把勾去掉,啟用TCP/IP的NETBIOS(N)即可(如圖 2)。
開啟445端口的方法:cmd,輸 入 netsh firewall set portopening TCP 445 ENABLE,開啟系統(tǒng)服務中Server服務即可。
案例一:
故 障 現 象:Windows 7客戶機端(172.18.54.117)訪問Windows XP服務器端(172.18.63.152),兩 臺 主機之間Ping通,但無法共享文件。Wireshark抓包如下:在建立連接時,可以看到Windows 7嘗試連接Windows XP的445端口和139端口,但超時無響應,Windows 7繼續(xù)發(fā)送重傳數據包,結果TCP三次握手無法正常建立。
故障解決:TCP連接無法正常建立,初步判斷兩臺主機之間有防火墻或ACL隔離。由于這兩個網段之間無硬件防火墻,交換機上也無ACL,基本斷定Windows XP主機開啟Windows防火墻。于是查看,果然如此,關閉防火墻,共享正常。
繼續(xù)深究,不關Window防火墻可否?實際也是可行。選中Windows XP的防火墻中“文件和打印共享”,點擊“編輯”,發(fā)現有如圖3圖4默認設置。
可以看到,Windows防火墻,默認只允許同網段主機“僅我的網絡(子網)”共享,選中“任何計算機”或自定義網段即可實現開啟防火墻的情況下共享。這里,我們可以看到Windows共享所使用的默認端口號,加深多網絡共享的理解。
案例二
故 障 現 象:Windows 7客 戶 機(172.17.54.117)訪問Windows 7服務器(172.17.54.118),兩臺主機之間Ping通,服務端明確告知自己開啟了NetBT(TCP139端口),但無法共享文件。Wireshark抓包如下:在建立連接時,可以看到Windows 7嘗試連接服務器的445端口,但超時無響應,客戶機發(fā)送快速重傳數據包,結果TCP三次握手無法正常建立。
圖4 Windows防火墻開啟狀態(tài)下共享的特殊設置二
故障解決:既然共享有兩種方式,可選用其中一種,按理服務器開啟139端口(服務器上netstat -ano,發(fā)現139端口確實處于監(jiān)聽狀態(tài)),可以共享,但是實際行不通。按上文說明,我們知道:“如果客戶機禁用了NBT,客戶機就將只從服務器445端口進行連接”,而服務器445端口是關閉的,所以不行。開啟服務器端445端口即可。
能否實現從服務器139端口共享呢?實踐證明,可行。打開客戶端NBT(TCP139)端口,再次抓包就可以發(fā)現建立連接的時候先從服務器445端口連接,服務器發(fā)送RST復位包拒絕后,又從139端口建立連接。
案例三
故 障 現 象:Windows 7客 戶 機(172.17.54.117)訪問Windows XP服務器(172.17.23.242),兩 臺 主機之間Ping通,服務器端明確告知自己開啟了NetBT(TCP139端口),但無法共享文件。Wireshark抓包如下:SMB協(xié)議,在建立連接時,本來是139端口或445端口,怎么變成80端口(HTTP)了?
故障解決:查詢資料,微軟專家解釋這是Windows 7某些版本的一個系統(tǒng)問題,在以\IP方式訪問Windows XP系統(tǒng)共享時,錯誤出現請求服務器80端口,安裝特定補丁包可以修復。最簡單的處理方式是:客戶機端開啟NBT(139端口),即可實現共享。
局域網共享,涉及到一系列權限設置(如Windows 7系統(tǒng)啟用文件打印機共享等),但根本是SMB協(xié)議。通過學習和試驗,我們加深了對SMB協(xié)議的兩種工作模式的理解,以后遇到“共享難題”,結合抓包軟件便可輕松解決。