ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Wireshark抓包实战:用OSI模型分层排查网络故障

2026/9/16 23:54:20 拓冰建站 浏览量
Wireshark抓包实战:用OSI模型分层排查网络故障 做网络排错这行天天都在跟又连不上共享打不开网页突然卡了这类问题打交道。很多刚接触网络的同事一上来就背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.100Server 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.100Server 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 RequestType字段为0表示Echo ReplyCode通常为0。再往下是Identifier标识符和Sequence Number序列号这两个字段是操作系统用来匹配请求和应答的相当于每对ping报文的身份证号。通过这个拆解可以非常直观地理解一件事ping命令走的完全是网络层逻辑它没有端口的概念不经过TCP或者UDP。所以ping能通只能说明网络层是通的完全不能证明某个具体的服务或者端口可用。这一点在后面的SMB2排错中会体现得淋漓尽致。3.3 ICMP排错场景目标不可达、TTL超时与分片问题实际抓包中最常见的ICMP排错信息是Destination Unreachable目标不可达Type值为3。Code字段进一步说明不可达的原因Code0是网络不可达Code1是主机不可达Code3是端口不可达。比如你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数据包并且设置了DFDont Fragment位中间路由器转发不了就会返回一个Type3、Code4的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_FAILURE0xC000006D表示用户名或密码错误STATUS_ACCESS_DENIED0xC0000022表示权限不足STATUS_BAD_NETWORK_NAME0xC00000CC表示共享名不存在STATUS_ACCOUNT_DISABLED0xC0000072表示账号被禁用了。这里请注意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把每一层的数据摊开看大部分网络问题都会变得比想象中简单。