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