theme: default themeName: "默认主题" title: "用了五年Wireshark,我整理出这份抓包排查指南,收藏量破万"
前言
网络故障排查领域,Wireshark几乎是唯一的免费方案。你可以用它分析HTTP请求为什么超时、TCP重传是怎么回事、DNS解析失败的原因在哪一层——只要链路上的数据还在流动,Wireshark就能告诉你真相。
但很多人装完Wireshark就开始无脑抓包,抓了几百兆数据塞满硬盘,回头一看无从下手。这篇文章告诉你怎么抓对包、分析对字段、用对过滤表达式,以及Wireshark这些年都更新了哪些实用功能。
抓包前的准备:选对接口,开对模式
选择正确的网卡
Wireshark启动后会列出所有网卡,很多人一看密密麻麻就蒙了。记住几个判断方法:
# Windows下快速定位网卡的方法
打开CMD,运行:
ipconfig /all
看哪个网卡有IPv4地址且是活动的
以太网适配器对应的就是本地物理网卡
VMware/VirtualBox等虚拟网卡通常以VMware开头
抓包场景对应网卡:
| 场景 | 抓哪张网卡 |
| 分析本机与服务器的通信 | 物理网卡 |
| 分析虚拟机与宿主机通信 | 虚拟网卡(如VMware Network Adapter) |
| 分析容器内部通信 | docker0 或容器对应的veth网卡 |
| 抓无线路由器流量 | 需要将网卡设为Monitor模式(需无线网卡支持) |
Windows下的抓包权限问题
正常情况下Wireshark需要管理员权限才能抓包(因为涉及原始套接字访问)。如果你不想每次都右键"以管理员身份运行",需要安装Npcap(Windows平台替代WinPcap的新方案):
# 下载Npcap:https://npcap.com/
安装时勾选:
✅ Install Npcap in WinPcap API-compatible Mode ← 这个必须勾,否则Wireshark无法抓包
✅ Restrict Npcap driver's access to Administrators only
过滤器:这是Wireshark的精髓
过滤器分两类:捕获过滤器(Capture Filter)和显示过滤器(Display Filter)。很多人搞不清楚区别——
捕获过滤器在抓包阶段就生效,决定哪些包被写入文件(节省资源);显示过滤器是在抓到的包里筛选展示(不丢数据,但对大文件筛选会慢)。捕获过滤器语法
# 语法:<方向> <协议> <端口或IP>
常用表达式:
port 80 # 只抓80端口(HTTP) port not 22 # 排除SSH流量 host 192.168.1.100 # 只抓指定IP的流量 net 192.168.1.0/24 # 抓整个网段 tcp port 443 # 只抓HTTPS udp # 只抓UDP包
复合条件
not port 22 and not port 3389 # 排除远程桌面和SSH host 192.168.1.10 and tcp port 80 # 某台机器的HTTP流量
警告:捕获过滤器用的是BPF(Berkeley Packet Filter)语法,很多新手搞混。实际上记一个原则——在Capture菜单 → Capture Filters里保存的才是捕获过滤器,工具栏输入框里默认是显示过滤器。
显示过滤器语法(重点掌握)
显示过滤器才是日常分析的主力,因为它不会丢弃任何原始数据。
# 基础过滤
ip.addr == 192.168.1.100 # 某个IP的所有流量 ip.src == 192.168.1.50 # 特定来源 ip.dst == 10.0.0.1 # 特定目的地 tcp.port == 443 # HTTPS端口 http.request.method == "POST" # POST请求
组合逻辑
ip.addr == 192.168.1.100 && http # 某IP的HTTP流量 tcp && !(ip.addr == 192.168.1.0/24) # TCP流量但排除内网
字符串匹配
http.host contains "api.example.com" http.request.uri matches ".login." dns.qry.name contains "baidu"
时间过滤
frame.time >= "2024-01-01 08:00:00"
常用快捷过滤器(收藏备用)
# HTTP相关
http.request # 所有HTTP请求 http.response # 所有HTTP响应 http contains "password" # 含关键词的HTTP包 http.request.uri == "/api/login" # 精确URL匹配
TCP相关
tcp.analysis.retransmission # TCP重传包 tcp.analysis.lost_segment # 丢包 tcp.analysis.ack_rtt > 0.5 # ACK延迟超过500ms tcp.flags.syn == 1 # SYN包(建连起始) tcp.flags.fin == 1 # FIN包(正常断开)
DNS相关
dns # 所有DNS包 dns.qry.type == A # A记录查询 dns.resp.type == A # A记录响应
错误相关
icmp && icmp.type == 3 # 目标不可达 tls.alert_message # TLS告警
实战场景一:分析HTTP请求为什么超时
现象:浏览器访问某个接口,30秒超时,用curl测试也是同样结果。 抓包策略:# 1. 先确定目标IP
nslookup api.example.com
假设得到 1.2.3.4
2. 启动Wireshark,捕获过滤器用:
host 1.2.3.4 and tcp port 80
3. 在浏览器触发请求后停止捕获
分析思路:
1. 看TCP三次握手是否完成(有无SYN → SYN-ACK → ACK) 2. 看HTTP请求是否发出(有无GET/POST → Request) 3. 看服务端是否回包(有无100 Continue → 200 OK 或 500 Error) 4. 如果卡在TCP握手 → 防火墙/网络层问题 5. 如果请求发出了但无响应 → 服务端处理超时或连接被重置
重点看的字段(右键 → 应用为列):Time(相对时间,第一包为0)
Source / Destination Protocol Length Info TCP segment data(展开看TCP层信息)
实战场景二:排查DNS解析失败
# 捕获过滤器
port 53
显示过滤器
dns
常见问题判断:
1. 有请求无响应 → DNS服务器不通(检查防火墙/路由)
dns.qry.name == "example.com" && !dns.response
2. 有响应但解析结果错误
dns.a == 0.0.0.0 # DNS被污染,返回空地址
3. 查看DNS响应时间
dns.time > 1 # DNS解析超过1秒,体验会很差
实战场景三:TCP重传频繁?看是哪一层的问题
TCP重传意味着有数据包在网络上丢失了,但原因可能是:
# 过滤所有重传包
tcp.analysis.retransmission
进一步分析:
如果重传集中在某一个IP对
tcp.analysis.retransmission && ip.addr == 192.168.1.100
如果重传很多但没有丢包告警,可能是延迟重传(网络抖动)
延迟重传 vs 丢包重传:
延迟重传:tcp.analysis.retransmission 且 tcp.analysis.rtt > 正常值
真丢包:tcp.analysis.lost_segment > 0
进阶功能:Follow TCP Stream
这个功能是被严重低估的实战利器。
使用方法:在任意TCP包上右键 → Follow → TCP Stream它能把TCP三次握手后的一系列通信流拼接成可读文本,显示完整的请求-响应对话。比如你抓到了一个完整的HTTP会话,它会直接显示:
GET /api/v1/user HTTP/1.1
Host: api.example.com User-Agent: curl/7.68.0 Accept: /
HTTP/1.1 200 OK Content-Type: application/json
{"code":0,"data":{"id":1234,"name":"张三"}}
这比逐包分析快十倍不止。
性能优化:抓大文件不再卡死
# 方法一:设置环形缓冲区(抓包到一定大小自动覆盖旧数据)
Capture → Options → Input → ring buffer with 10 files of 100 MB each
方法二:使用Capture Filters限制范围(抓包前就想清楚)
host 192.168.1.50 and tcp port 8080
方法三:用tshark命令行(抓包后不打开Wireshark也能分析)
tshark -r capture.pcap -Y "http.request" -T fields -e http.host -e http.request.uri
方法四:远程抓包(不在服务器本地开Wireshark)
服务器端:运行dumpcap监听
dumpcap -i eth0 -f "tcp port 80" -w /tmp/capture.pcap
本地端:用SCP把pcap拉回来分析
版本更新亮点(2019~2024)
Wireshark这些年迭代了不少实用功能:
- TLS 1.3解密:现在Wireshark可以导入TLS会话密钥(Chrome和Firefox支持`SSLKEYLOGFILE`环境变量),直接解密HTTPS流量
- Lua脚本扩展:可以写脚本自动分析特定模式的数据包
- 802.11 Monitor模式支持:新版支持更多无线网卡的Monitor模式抓包
- TCP专家信息增强:自动标注重传、乱序、重复ACK等问题
- 命令行工具集:除了tshark,还新增了`editcap`(编辑pcap)、`mergecap`(合并多个pcap)、`capinfos`(查看pcap统计信息)
# 查看pcap文件的统计摘要
capinfos capture.pcap
合并多个pcap
mergecap -w output.pcap input1.pcap input2.pcap
抽取特定时间范围的包
editcap -r input.pcap output.pcap 1000-2000 # 抽取第1000到2000个包
结语
Wireshark用得好的人,不是记得很多快捷键,而是知道什么时候该抓、抓什么、怎么看。TCP重传看`tcp.analysis`字段,HTTP问题看`Follow TCP Stream`,DNS问题只看`port 53`——每个场景都有最直接的切入点。
建议把本文的过滤器部分收藏,以后遇到网络问题,直接翻过来用,比临时翻文档快得多。
希望本文的教程对你有所帮助。如有疑问或需要专业技术支持,可通过以下方式联系我们:
📞 服务热线:13708730161 💬 微信:eyc1689 📧 邮箱:service@eycit.com
易云城IT服务,您身边的IT专家。