Wireshark抓包实战:用OSI模型分层排查网络故障
2026/9/16 23:54:09 网站建设 项目流程

做网络排错这行,天天都在跟"又连不上""共享打不开""网页突然卡了"这类问题打交道。很多刚接触网络的同事一上来就背OSI七层模型,每层名字记得滚瓜烂熟,真遇到故障却不知道从哪儿下手。我的实际体会是,OSI七层模型不是考试用的背诵材料,它就是一张排错地图,而Wireshark是让这张地图"动起来"的显微镜。这篇文章基于Windows 10做客户端、Windows Server 2022做服务端的典型环境,用Wireshark抓包分析ICMP和SMB2这两个极具代表性的协议,把OSI每一层落到真实报文上,再完整演练一遍分层排错和基础安全分析。适合运维、系统管理员、网络工程师,以及所有想真正看懂网络数据包的读者。

1. 先把OSI七层模型"翻译"成排错地图

1.1 七层模型到底在讲什么

OSI七层模型从下往上依次是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。这七层的核心设计思想是"各司其职、向下依赖、向上服务"。每一层只解决自己这一层的标准化问题,比如物理层管电压、接口、网线好坏,数据链路层管MAC地址和帧格式,网络层管IP寻址和路由选择,传输层管端口和可靠传输。这种分层的最大好处是,某一层实现或设备换了,其他层几乎不用动。

举个生活化的例子,七层模型就像寄快递。应用层是你想寄的东西本身;表示层决定怎么打包、贴什么标签;会话层帮你跟快递公司建立一次寄件关系;传输层选择走陆运还是空运,并且保证不丢件;网络层负责规划从哪个城市中转;数据链路层解决同一条街上的交接;物理层就是那条实实在在的路。每一层只关心自己负责的那段流程。

1.2 分层排错的核心逻辑

照理说,互联网真正跑的是TCP/IP协议栈,那OSI模型还有什么实战价值?我的理解是,OSI模型是一套坐标轴,给你一个定位故障的参考系。遇到故障时,先判断问题大概在哪个层次,然后从该层开始逐层向上或向下排查。比如"网页打不开"这种模糊描述,你可以先把范围一层层压缩:网线灯亮不亮,这是物理层;ARP能不能解析出网关MAC,这是链路层;能不能ping通目标服务器IP,这是网络层;TCP 443端口能不能建立连接,这是传输层;最后才是HTTP响应和服务器日志,这是应用层。

这套思路的价值在于,每一步都在排除一批可能性。你永远不会在"应用层证书错误"上浪费半天时间,结果发现其实网线根本没插好。反过来,如果前面几层全通,你也就能非常自信地说问题一定出在高层的认证、权限或者服务配置上。

1.3 ICMP与SMB2在模型里的位置

这篇文章选ICMP和SMB2两个协议,是因为它们正好卡在OSI模型的两个极端。ICMP是网络层协议,用来传递诊断信息和差错报告,它不依赖端口,直接封装在IP报文里面。SMB2则是典型的应用层协议,用于Windows环境下的文件共享和打印机共享,它跑在TCP 445端口之上,同时还用到了会话管理和表示协商的机制。一个偏底层,一个偏高层,把这两个协议抓包吃透,整个OSI模型的上三层和下四层就都能串联起来。

2. 实验环境搭建:Windows 10、Server 2022 与 Wireshark 的准备工作

2.1 为什么选这套环境组合

Windows 10和Windows Server 2022的组合在中小型企业里非常常见:一台客户端、一台服务器,客户端要访问服务器上的共享文件夹、打印机或者做管理操作。SMB2本身就是微软平台的文件共享主力协议,在这个环境里抓包分析,学到的东西能直接迁移到日常工作中。

实验不需要太复杂的硬件,两台虚拟机就够了。VMware Workstation或者Hyper-V都可以,网络模式建议选桥接或者内部虚拟网络,保证两台机器处于同一个广播域,这样ARP解析的过程也能被完整看到。Windows 10的IP建议手动设置成192.168.1.100,Server 2022设置成192.168.1.200,固定地址能省掉不少分析时的确认成本。

2.2 Wireshark安装与抓包前的基础配置

Wireshark的安装比较傻瓜式,去官网下载Windows安装包,安装过程中会提示安装Npcap,这一步建议装,Windows 10及以上系统用Npcap做抓包驱动比老的WinPcap稳定得多。装完以后打开Wireshark,主界面上会列出所有网卡接口,选中有流量的那块"以太网"或"WLAN"接口,点左上角的蓝色鲨鱼鳍图标开始抓包。

抓包之前有两个配置我建议先改掉。一是时间显示格式,默认显示的是抓包开始的绝对时间,分析问题时改成"相对前一报文的时间"更直观,在菜单栏"视图"→"时间显示格式"里选"Seconds Since Previous Displayed Packet"。二是过滤器的理解,Wireshark有两套过滤语法,"捕获过滤器"是抓包之前设置的BPF语法,只保留符合条件的包,省磁盘空间;"显示过滤器"是抓包之后筛选显示的,更灵活,也是平时用得最多的。新手建议直接记住显示过滤器,遇到分析场景用 icmp 或 smb2 就能快速定位。

2.3 抓包时的操作纪律

还有一个常被忽略的点:抓包不是在产生故障前一直开着录屏,而是要精准抓取故障窗口期的那几十秒。比如复现一个"共享访问失败"的问题,你先在Wireshark里点击开始抓包,然后在客户端发起一次访问,等报错出现后马上停止抓包。整个操作不超过一分钟,但这一分钟里的报文已经把故障的前因后果记录得明明白白。别贪多,包抓得越久,分析时浪费的时间越多。

3. ICMP抓包实战:用一条Ping命令看懂网络层

3.1 正常Ping时Wireshark里能看到什么

先做最基础的实验。Windows 10的IP是192.168.1.100,Server 2022的IP是192.168.1.200,两台机器在同一个网段。在Windows 10的CMD窗口执行 ping 192.168.1.200 -t,然后在Wireshark显示过滤器中输入 icmp。

正常情况下你会在列表里看到一对一对的报文。每对的第一条是Echo (ping) request,即回显请求;紧接着第二条是Echo (ping) reply,即回显应答。这里有一个很多人没注意过的细节:ping请求报文离开Windows系统后,IP头里的TTL字段默认值是128,而Linux系统默认是64。如果你抓包时发现某个设备的TTL已经是56了,那说明它中间经过了大约72台路由器?不对,应该是已经减了72跳。这种TTL信息可以帮助你判断对端系统类型,也能反向推算出两台设备之间大概隔了多少个三层设备。

3.2 ICMP报文逐字段拆解:三层封装看得清清楚楚

选中一条Echo Request报文,在中间的协议树里展开,你能看到OSI分层的影子直接以报文结构的形式呈现出来。

最外层是以太网帧头,也就是数据链路层的信息。源MAC地址是本机网卡的MAC,目标MAC地址是服务器网卡的MAC。如果目标IP不在同一网段,目标MAC就会变成网关的MAC。这就是为什么"同一网段通信看MAC,跨网段通信看网关",它直接反映了链路层和网络层的分工。

第二层是IP头,网络层的核心。里面能看到协议字段的值是1,表示上层协议是ICMP;还有源IP、目标IP、TTL、标识符、片偏移等字段。TTL字段和IP分片相关的字段在这里都能改。

第三层才是ICMP本身。Type字段为8表示Echo Request,Type字段为0表示Echo Reply,Code通常为0。再往下是Identifier(标识符)和Sequence Number(序列号),这两个字段是操作系统用来匹配请求和应答的,相当于每对ping报文的"身份证号"。

通过这个拆解可以非常直观地理解一件事:ping命令走的完全是网络层逻辑,它没有端口的概念,不经过TCP或者UDP。所以ping能通只能说明网络层是通的,完全不能证明某个具体的服务或者端口可用。这一点在后面的SMB2排错中会体现得淋漓尽致。

3.3 ICMP排错场景:目标不可达、TTL超时与分片问题

实际抓包中,最常见的ICMP排错信息是Destination Unreachable(目标不可达),Type值为3。Code字段进一步说明不可达的原因:Code=0是网络不可达,Code=1是主机不可达,Code=3是端口不可达。比如你ping一个局域网里不存在的IP,网关会替你返回一个"主机不可达"的ICMP报文。这种报文的来源往往是中间路由器,而不是最终目标,通过它的来源IP就能判断故障大致位置。

另一种常见场景是Time Exceeded(超时),Type值为11。当一个IP报文的TTL经过路由器时被减到0,路由器就会丢弃这个报文,并且向源地址回一个ICMP Time Exceeded报文。Windows下的tracert命令就是利用这个原理,不断发送TTL从1开始递增的探测包,从而绘出到达目标所经过的路由路径。如果抓包时发现某几跳回包,某几跳不回,也不一定是链路故障,可能只是中间路由器主动丢弃了这类ICMP报文。

还有一个经典问题涉及MTU和分片。假设两台Windows主机之间跨了一段MTU只有1400的链路,但发送端发送了一个1500字节的UDP数据包,并且设置了DF(Don't Fragment)位,中间路由器转发不了,就会返回一个Type=3、Code=4的ICMP报文,这个报文里还携带了该链路允许的MTU值。在Wireshark里看到这种报文,基本可以直接判断出路径上存在MTU不一致的情况,接下来的调整方向就很明确了。

3.4 Ping不通时的分析思路

ping不通的时候,要先观察是完全没有响应,还是有ICMP错误报文返回。如果一直"请求超时",没有任何ICMP报文回应,那情况可能是:目标主机防火墙丢弃了ping报文、链路中断,或者中间路由静默丢包。如果收到了目标不可达报文,说明路径上至少有一个路由设备在处理这个报文,问题可能出在目标主机的地址配置或防火墙策略上。

这里要补一个实操技巧:Wireshark里可以用 icmp.type == 3 快速过滤出所有目标不可达报文,用 icmp.type == 11 过滤出所有TTL超时报文,比肉眼在数据包列表里滑来滑去高效得多。

4. SMB2抓包实战:Windows共享会话的完整生命周期

4.1 SMB2与OSI模型的对应关系

SMB2是Windows文件共享、打印机共享使用的核心协议,跑在TCP 445端口上。在OSI模型里它属于应用层,但实际交互过程又包含了"会话建立"和"协议协商"这两个高层机制。比如客户端和服务器在正式开始交换文件之前,要先协商SMB协议的版本,客户端会告诉服务器"我支持SMB 2.0.2、3.0.2、3.1.1",服务器从中选一个最合适的版本返回给客户端。这个"表达能力对齐"的动作,本质上对应OSI表示层的职责;而认证通过后建立的SMB会话上下文,则对应会话层的职责。

在Wireshark中,这个协议的显示名是SMB2。展开报文可以看到SMB2 Header,里面有ProtocolId、Command、Status、MessageId等字段。Command字段标明当前这条报文是哪种操作,比如NEGOTIATE、SESSION_SETUP、TREE_CONNECT、CREATE、READ、WRITE、CLOSE等。

4.2 一次完整共享访问,数据包经历了哪些阶段

在Server 2022上创建一个共享文件夹,比如名字叫share,然后在Windows 10的资源管理器地址栏输入 \192.168.1.200\share 并访问,同时Wireshark提前开始抓包。整个过程按时间顺序拆开看是这样的:

第一阶段是TCP三次握手,发生在传输层。Windows 10向Server 2022的445端口发送SYN包,服务器回SYN-ACK,客户端再回ACK,一条可靠的TCP连接建立起来。如果这个阶段失败,根本轮不到SMB2出场。

第二阶段是SMB2协商(NEGOTIATE)。客户端发一个Negotiate Request,列出自己支持的SMB版本列表;服务器选择一个最高版本返回Negotiate Response。在Wireshark里,你可以直接在报文中看到最终选定的Dialect值,比如0x0311表示SMB 3.1.1。

第三阶段是会话建立(SESSION_SETUP)。这一步通常有两轮交互。客户端发第一轮Session Setup Request,携带认证方式或安全令牌;服务器如果要求进一步认证,会返回STATUS_MORE_PROCESSING_REQUIRED,然后客户端再发第二轮携带最终凭据的Session Setup Request,服务器确认身份后返回成功,并分配一个全局唯一的SessionId。这个SessionId在后续所有SMB2操作中都会出现,用来标识当前会话。

第四阶段是连接共享(TREE_CONNECT)。客户端发送Tree Connect Request,包含 \server\share 这样的共享路径;服务器返回该共享的完整UNC路径,确认客户端可以访问这个共享。如果共享名写错了,或者权限不够,这个阶段就会返回对应的错误Status。

第五阶段是文件操作(CREATE、READ、WRITE、CLOSE)。打开某个文件时发Create,读取内容发Read,修改内容发Write,用完以后发Close。一次共享访问,实际上就是这几个命令的不断循环。

把这几个阶段的命令整理成下表会更清楚:

阶段SMB2 Command作用
协商版本NEGOTIATE确定SMB协议版本
身份认证SESSION_SETUP建立用户会话上下文
连接共享TREE_CONNECT访问指定共享目录
打开文件CREATE创建或打开文件句柄
读写数据READ / WRITE实际传输文件内容
关闭句柄CLOSE释放文件资源
结束会话TREE_DISCONNECT / LOGOFF断开共享与会话

4.3 从Status字段快速定位共享故障

在实际共享故障排查中,我最常做的一件事就是过滤SMB2的Status字段。Wireshark显示过滤器可以写 smb2.nt_status != 0,把所有返回错误状态的SMB2报文挑出来。然后看是哪条命令报错,错误码是什么。比如STATUS_LOGON_FAILURE(0xC000006D)表示用户名或密码错误,STATUS_ACCESS_DENIED(0xC0000022)表示权限不足,STATUS_BAD_NETWORK_NAME(0xC00000CC)表示共享名不存在,STATUS_ACCOUNT_DISABLED(0xC0000072)表示账号被禁用了。

这里请注意,SMB2的报错是分层的。NEGOTIATE阶段报错通常是协议版本或服务器服务异常,SESSION_SETUP阶段报错通常是认证问题,TREE_CONNECT阶段报错通常是共享名或权限问题,CREATE阶段报错通常是文件权限或磁盘空间问题。看到错误码以后,再结合它出现的命令阶段,你对问题的判断会变得非常准确。

另外,还要注意SMB1的问题。SMB1是相当古老的协议版本,历史上出过多次严重漏洞,Windows 10和Server 2022默认都是禁用的。如果抓包时看到协商上下文里出现了NT LM 0.12这类SMB1信息,说明系统很可能被动开启了SMB1,建议在服务器上通过功能关闭。排查思路是,先在网络层面解决问题,再考虑协议版本兼容性和安全策略。

5. 分层排错综合演练:Windows 10 访问不了 Server 2022 共享

5.1 场景描述与最初的判断思路

现在把所有知识串起来。假设你在办公网里,Windows 10客户端访问 \192.168.1.200\share,系统提示"找不到网络路径"。你的第一反应不该是去改共享设置,而是先按OSI层次从下往上排查。

第一步看物理层和数据链路层。检查Windows 10网卡是否正常连接,命令 ipconfig /all 可以看到IP配置和默认网关。如果用的是有线网络,看交换机端口指示灯是否正常;如果网卡接口显示"已断开",问题就停留在物理层。链路层则需要确认ARP解析是否成功。在CMD里执行 ping 192.168.1.200 -n 1 之后,再执行 arp -a 查看目标IP对应的MAC地址是否有记录。如果ARP解析不到,说明两台机器之间可能被VLAN隔离了,或者交换机做了端口隔离,报文根本没有到达目标主机。

第二步看网络层。ping 192.168.1.200,如果能收到Reply,说明IP层的路由和连通性没问题。如果ping超时,先ping默认网关,确认本机到网关的链路是否通。网关能通而目标服务器不通,问题大概率在服务器侧或服务器与网关之间。此时在Server 2022上执行 ipconfig /all,检查IP地址、子网掩码、网关是否配置正确。

第三步看传输层。ping通了,不代表TCP 445端口一定能连。在Windows 10的PowerShell里执行 Test-NetConnection -ComputerName 192.168.1.200 -Port 445。这个命令会尝试TCP三次握手,返回TcpTestSucceeded。如果显示False,用Wireshark过滤 tcp.port == 445,观察是否只有SYN包,没有SYN-ACK包,如果是这种情况,基本就能锁定是Windows防火墙或服务器上的某些安全策略在拦截445端口。

5.2 应用层定位:从SMB2报错看权限和服务状态

如果TCP 445握手成功,但还是访问不了共享,那就轮到SMB2协议层登场了。回到共享访问的抓包结果,重点关注SESSION_SETUP和TREE_CONNECT阶段的Status字段。看到STATUS_LOGON_FAILURE,就检查用户名密码;看到STATUS_ACCESS_DENIED,就检查共享权限和NTFS权限;看到STATUS_BAD_NETWORK_NAME,先确认共享名是不是真的叫share,不要想当然,去Server 2022上执行 Get-SmbShare 看一下实际共享名。

还有一种情况是TCP握手也成功,SMB2协商也成功,但TREE_CONNECT一直超时。这种问题通常是因为服务器端svchost进程处理SMB请求异常,或者文件服务器角色没有正确安装。在服务器上执行 Get-SmbServerConfiguration | Select EnableSMB2Protocol,确认SMB2协议是启用状态。

5.3 一条完整的自查命令序列

把常用排查命令整理成一条可以直接粘到CMD或PowerShell里执行的操作链,工作起来效率会高不少:

排查层级命令/工具预期结果
物理/链路层ipconfig /all、arp -a本机IP、网关配置正确,目标IP有ARP条目
网络层ping 目标IP收到ICMP Echo Reply
传输层Test-NetConnection -ComputerName 目标IP -Port 445TcpTestSucceeded 为 True
应用层Get-SmbShare、Get-SmbConnection共享存在且有活动会话
服务器侧Get-SmbServerConfiguration、防火墙规则SMB2启用,File and Printer Sharing规则放行

这套流程走下来,90%的共享访问问题都能定位到具体层次。剩下的10%往往牵扯到域环境、组策略或第三方安全软件,这时候Wireshark抓包的结果依然是你跟别人争论时最有说服力的证据。

6. 网络安全视角:从抓包识别ICMP/SMB2异常行为

6.1 ICMP流量里的异常特征

很多运维同学只把ping当连通性工具用,但ICMP本身也是攻击者的常用探测手段。比如ping扫描,攻击者会向整个网段的连续IP发送大量Echo Request,快速绘制内网存活主机清单。在Wireshark里通过"统计"→"Endpoint"查看ICMP端点的流量统计,如果某个IP在短时间内发出成百上千条ICMP请求,那就值得关注。更直观的方法是IO Graph,绘制icmp.type == 8的流量曲线,正常的ping是规律的每秒一两包,扫描则往往是短时间内的密集脉冲。

另一个需要警惕的特征是ICMP数据部分的大小和内容。正常的ping请求,Windows系统默认发送32字节的数据,内容多为标点字符。如果你抓到的Echo Request和Reply的Data部分明显偏大,内容看起来像是编码后的随机字节或可读的命令行字符串,就要怀疑是不是有人在用ICMP做隐蔽数据传输。检查方式很简单,选中报文,在底部的Packet Bytes面板里直接看十六进制内容和ASCII翻译,有异常就直接暴露了。

安全管理上的一条建议是:对外网口和面向不可信区域的接口,尽量限制入站的ICMP Echo Request,只对内部管理网段开放ping能力。对局域网内部的ICMP扫描,要有告警和封堵机制。

6.2 SMB2报文中的暴力破解与异常会话

SMB2也是暴力破解的重灾区。攻击者会直接用工具对445端口发起大量SESSION_SETUP请求,用字典组合尝试账号密码。在Wireshark里,这种行为的特征非常明显:一段时间内,来自同一个源IP的SMB2 Session Setup Request数量远超正常水平,Response里的Status字段频繁出现STATUS_LOGON_FAILURE。用显示过滤器 smb2.cmd == 1 筛选出所有SESSION_SETUP报文,再配合 smb2.nt_status == 0xc000006d 筛出失败的登录尝试,一个简单的暴力破解流量模式就浮现出来了。

此外,多台内网主机对外部某个IP高频发起SMB2连接,也可能是主机感染了蠕虫类恶意软件在横向扩散。此时关注TCP 445端口的连接目的IP列表和Geography分布,如果出现大量非业务相关的目标IP,就要及时隔离主机并查杀。

6.3 用Wireshark统计功能建立流量基线

判断异常的前提是知道正常是什么样。我个人的习惯是,定期在业务低峰期用Wireshark的"统计"→"会话"和"统计"→"协议分级"分别记录各主机的主要流量构成和协议占比,保存为基线数据。比如,某个部门的机器每天产生的SMB2流量占总量20%,突然有一天暴涨到70%,哪怕没有具体告警,你也应该知道出问题了。Wireshark的Profile功能可以保存不同的显示配置和着色规则,一个Profile用于排错,一个Profile用于安全监控,切换起来非常方便。

6.4 安全的底线:SMB1该关就关

从攻击面看,SMB协议最危险的版本是SMB1,它已经存在超过三十年,设计上缺乏现代安全机制,也是多起严重恶意程序传播链的重要一环。Windows 10和Server 2022默认禁用了SMB1,但你接手的老旧服务器上可能仍然开着。通过抓包如果发现协商报文中带有NT LM 0.12相关标识,建议在服务器上执行关闭SMB1的操作,并确保防火墙只放行必需的445端口来源IP。

请记住,网络安全的起点不是买多贵的防火墙,而是先搞清楚自己业务网络里哪些协议在跑、哪些端口该暴露、哪些行为属于异常。Wireshark就是帮你把这些问题看清楚的那面镜子。

最后再分享一个我自己的经验:遇到网络故障,无论问题看起来多玄学,第一步永远是抓包拿证据。抓包三分钟,往往就会发现很多你原本以为是"配置没问题"的地方,其实已经在某个层级悄悄出了问题。分层排错看起来步骤多,但它把模糊的故障一步一步缩小到一个精确的范围,最后定位到的就是那个最核心的原因。只要把OSI七层模型当成地图来用,再配合Wireshark把每一层的数据摊开看,大部分网络问题都会变得比想象中简单。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询