解决网络共享故障
2018-11-08
目前,局域网上通常采用SMB(Server Messages Block,信息服务块)协议共享文件和打印机。SMB协议是客户机/服务器型协议,提供共享资源的机器为服务器端,要访问的机器为客户机端。客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
SMB协议目前发展到SMB 3.0版 本(Windows Server 2012及以上),日常多使用SMB 2.x版本。SMB是一个跨平台协议,Windows和类Unix系统都支持。Linux、UNIX系统和Windows系统资源共享通常使用Samba,Samba是实现SMB协议的一个免费软件。
图1 SMB协议工作层次
SMB协议工作在应用层和会话层,可用在因特网的TCP/IP协议之上,也可用在其他网络协议如IPX和NetBEUI之上,平常多用于TCP/IP协议之上(如图1)。
SMB工作方式
SMB协议有两种工作方式,分别为NetBIOS Over TCP/IP(简 称 NetBT) 和Direct hosting。 在 早 期的Windows系统之中,主要使用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端口得到回应,那么客户端将发送RST到139端口,终止这个端口的连接,接着就从445端口进行SMB会话了。如果没有从445端口而是从139得到回应,那么就从139端口进行会话;如果没有得到任何回应,那么SMB会话失败。两种端口使用优先级为:445端口>139端口。
2.如果客户机端禁用了NBT,客户机就将只从服务器端445端口进行连接。
图2 Windows系统开启TCP 139端口
3.如果服务器端启用NetBT,那么就同时监听UDP 137、138 端口和 TCP139,445端口。如果禁用NBT,那么就只监听445端口了。
网络共享故障解决要点
由于SMB协议提供共享的两种渠道NetBT(TCP 139)和Direct hosting(TCP 445),可以允许同时存在也可以只允许其中一种方式。因此,出现共享故障时,我们要特别关注这两种端口的连接情况。
Windows系统,我们可以通过 netstat -an | find"139"、netstat -an | find"445"命令查看端口是否监听、连接。Linux系统通过netstat -an | grep 139、netstat -an | grep 445命令查看端口是否连接。
Windows系 统(以Windows 7旗舰版为例,下同)开启139端口的方法:“本地连接”中选取“Internet协议(TCP/IP)版本 4”属性,进入“高级TCP/IP设置”“WINS设置”里面有一项“禁用TCP/IP 的 NETBIOS”,把勾去掉,启用TCP/IP的NETBIOS(N)即可(如图 2)。
开启445端口的方法:cmd,输 入 netsh firewall set portopening TCP 445 ENABLE,开启系统服务中Server服务即可。
网络共享排错案例
案例一:
故 障 现 象:Windows 7客户机端(172.18.54.117)访问Windows XP服务器端(172.18.63.152),两 台 主机之间Ping通,但无法共享文件。Wireshark抓包如下:在建立连接时,可以看到Windows 7尝试连接Windows XP的445端口和139端口,但超时无响应,Windows 7继续发送重传数据包,结果TCP三次握手无法正常建立。
故障解决:TCP连接无法正常建立,初步判断两台主机之间有防火墙或ACL隔离。由于这两个网段之间无硬件防火墙,交换机上也无ACL,基本断定Windows XP主机开启Windows防火墙。于是查看,果然如此,关闭防火墙,共享正常。
继续深究,不关Window防火墙可否?实际也是可行。选中Windows XP的防火墙中“文件和打印共享”,点击“编辑”,发现有如图3图4默认设置。
可以看到,Windows防火墙,默认只允许同网段主机“仅我的网络(子网)”共享,选中“任何计算机”或自定义网段即可实现开启防火墙的情况下共享。这里,我们可以看到Windows共享所使用的默认端口号,加深多网络共享的理解。
案例二
故 障 现 象:Windows 7客 户 机(172.17.54.117)访问Windows 7服务器(172.17.54.118),两台主机之间Ping通,服务端明确告知自己开启了NetBT(TCP139端口),但无法共享文件。Wireshark抓包如下:在建立连接时,可以看到Windows 7尝试连接服务器的445端口,但超时无响应,客户机发送快速重传数据包,结果TCP三次握手无法正常建立。
图4 Windows防火墙开启状态下共享的特殊设置二
故障解决:既然共享有两种方式,可选用其中一种,按理服务器开启139端口(服务器上netstat -ano,发现139端口确实处于监听状态),可以共享,但是实际行不通。按上文说明,我们知道:“如果客户机禁用了NBT,客户机就将只从服务器445端口进行连接”,而服务器445端口是关闭的,所以不行。开启服务器端445端口即可。
能否实现从服务器139端口共享呢?实践证明,可行。打开客户端NBT(TCP139)端口,再次抓包就可以发现建立连接的时候先从服务器445端口连接,服务器发送RST复位包拒绝后,又从139端口建立连接。
案例三
故 障 现 象:Windows 7客 户 机(172.17.54.117)访问Windows XP服务器(172.17.23.242),两 台 主机之间Ping通,服务器端明确告知自己开启了NetBT(TCP139端口),但无法共享文件。Wireshark抓包如下:SMB协议,在建立连接时,本来是139端口或445端口,怎么变成80端口(HTTP)了?
故障解决:查询资料,微软专家解释这是Windows 7某些版本的一个系统问题,在以\IP方式访问Windows XP系统共享时,错误出现请求服务器80端口,安装特定补丁包可以修复。最简单的处理方式是:客户机端开启NBT(139端口),即可实现共享。
局域网共享,涉及到一系列权限设置(如Windows 7系统启用文件打印机共享等),但根本是SMB协议。通过学习和试验,我们加深了对SMB协议的两种工作模式的理解,以后遇到“共享难题”,结合抓包软件便可轻松解决。