Wireshark 入门:比抓包更难的是知道抓哪里

Wireshark 装完第一次打开,通常是这样:点一下网卡,屏幕开始疯狂滚动,红的黑的绿的,几百行一秒。盯了五分钟,什么也没看出来,然后关掉。

我见过太多人卡在这一步。不是不会用,是没人告诉他:Wireshark 真正难的地方不在抓包,在抓对地方,和把噪音过滤掉。

这篇不讲每种协议长什么样,讲怎么让它变得有用。

先想清楚:包从哪里来

这是最容易被跳过的一步,也是后面一切的前提。

如果你在办公室的交换机上抓,抓到的多半只有广播包和自己进出的流量。现代交换机每个口是独立的,不会把别人的单播流量抄送给你。想抓全局,得配镜像口(SPAN),这属于网络管理员的操作,不是开个软件就行。

无线呢,笔记本网卡默认只收发给自己的帧。要抓空口上所有的包,网卡得进监听模式,而且得是驱动支持的那种卡。这也是为什么很多人抓 WiFi 只看到自己的包——不是 Wireshark 的问题。

还有一个更常见的死角:本机自己的流量。

Windows 上,装 Npcap 的时候有个选项叫「Support loopback traffic」,不勾上,你抓 127.0.0.1 永远是空的。很多人调试本地服务,抓了半天以为程序没发请求,其实是抓不到回环。

Linux 上直接用 lo 网卡就行,不存在这个问题。这也是我建议在 Linux 上做协议分析的原因之一,少一层坑。

抓包放在哪台机器上,比用什么软件重要

想分析「服务器为什么慢」,在本机抓是没用的,你只能看到自己发出去的请求和回来的响应,看不到中间和服务器内部。

正确做法是在服务器上抓:

tcpdump -i eth0 -s 0 -w /tmp/cap.pcap port 80
# 抓一会儿,Ctrl+C 停
# 下载到本地,用 Wireshark 打开

-s 0 是不截断(老版本默认只抓前 96 字节,抓到的包打不开),-w 直接写文件而不是打印。这两个参数不加,抓出来的东西基本没法用。

线上环境别直接 tcpdump 打屏,也别不设上限地抓。后面会讲怎么控制。

两种过滤器,别搞混

这个坑几乎每个人都会踩一次。

捕获过滤器(Capture Filter)在抓之前生效,语法是 BPF,写错了直接抓不到东西。比如 tcp port 80。

显示过滤器(Display Filter)在抓之后生效,语法是 Wireshark 自己的,写错了下面会变红。比如 tcp.port == 80。

区别在于:捕获过滤器是「不抓」,显示过滤器是「抓了但不显示」。所以如果你不确定要抓什么,就别设捕获过滤器,先全抓下来,再用显示过滤器慢慢筛。抓漏了的包是找不回来的。

我一般只在两种情况下用捕获过滤器:流量特别大(不然磁盘爆),或者明确知道只看 53 端口。

五个过滤器,够用八成场景

http.request.method == "POST"

只看 POST 请求。调接口的时候,GET 全是噪音。

tcp.flags.syn == 1 and tcp.flags.ack == 0

只看 TCP 建连的第一个包。判断「到底连没连上」特别快——有 SYN 没 SYN-ACK,就是被墙了或者端口没开。

ip.addr == 192.168.1.50

某个 IP 相关的所有流量,双向都包含。

dns.qry.name contains "example"

查某个域名解析了什么。排查「为什么连到了奇怪的 IP」,这条最直接。

tcp.analysis.retransmission

重传。网络卡、丢包、MTU 不对,都会在这里出现。这是我最常用的一个,比看任何统计图都快。

顺带说一句,过滤器可以组合,用 and / or / !,括号也行。写复杂一点没关系,Wireshark 会实时校验,写错了立刻变红,不会让你抓瞎。

「Follow TCP Stream」比你想的有用

右键任意一个包 → Follow → TCP Stream,会把整条连接的应用层数据拼起来给你看,两个方向用颜色区分。

抓 HTTP 的时候这个功能是神器:请求头、响应头、body 一屏看完,不用一个个包点开拼。

但它有个副作用:默认会把非 ASCII 字符按 Latin-1 显示,中文全是乱码。右下角有个下拉框,切到 UTF-8 就正常了。这个细节没人提,但第一次遇到会以为数据坏了。

还有一点,Follow 只跟一条 TCP 连接。HTTP/2 的多路复用会让多个请求挤在一条连接里,看起来乱;HTTP/3 走 QUIC(UDP),这个功能直接不适用。

三个「为什么我看不到」

一、HTTPS 全是乱码。正常,加密了就是加密了。除非你能拿到会话密钥,否则看不到内容。tls.handshake.type == 1 能让你至少看清 SNI,知道连的是哪个域名。

二、全是「校验和错误」的红包。大概率是网卡 offload。网卡把校验和计算推给硬件,Wireshark 在软件层抓到的包校验和就是错的。去 Preferences → Protocols → IPv4/TCP,把「Validate the TCP checksum if possible」关掉,世界立刻就干净了。

三、抓了一会儿就开始丢包。Wireshark 的界面渲染吃 CPU,流量一大就跟不上。看底部状态栏有没有「Dropped」,有的话就是抓包进程扛不住了。

解决办法是别用 Wireshark 抓,用 dumpcap 抓:

dumpcap -i eth0 -b filesize:102400 -b files:10 -w /tmp/cap

这是环形缓冲:单文件最大 100MB,最多留 10 个,写满自动覆盖最旧的。抓一整天也不会把磁盘塞满,而且 dumpcap 本身不做界面渲染,丢包率低得多。

解密 HTTPS:只有一半场景能用

浏览器的话,最简单的方法是设一个环境变量再启动浏览器:

# Windows PowerShell
$env:SSLKEYLOGFILE = "C:\temp\keys.log"
# 然后从这个终端启动 Chrome

浏览器会把 TLS 会话密钥写进这个文件。Wireshark 里 Preferences → Protocols → TLS,把「(Pre)-Master-Secret log filename」指向它,HTTPS 就明文了。

但这个方法只对浏览器和自己的程序有效。手机 App 不走这条路,它的密钥不会写给你。想看 App 的 HTTPS,得用证书 + 绕过证书固定那一套,属于另一个话题:《Frida 抓包实战》。

几个小习惯

时间显示改成「从第一个包开始的秒数」,比绝对时间好用得多。排查超时的时候,你能直接看出间隔是 3 秒还是 30 秒。在 View → Time Display Format 里改。

颜色规则别急着自定义。默认配色里,黑色是重传和错误,红色是异常,浅蓝是 UDP。看懂这套默认规则,比配一套好看的更重要。

最后,别把 Wireshark 当安全设备用。它能看流量,但没有告警、没有规则库、不能持续运行。看到可疑流量拿它分析可以,指望它发现攻击不行。

最后

如果只记一件事:先想清楚包在哪条链路上,再去抓。

位置错了,过滤器和技巧再熟也没用。位置对了,哪怕只用 tcpdump 加 grep,也能把问题定位出来。

工具是次要的。我见过用 Wireshark 三年只会点「开始」的人,也见过只用 tshark 就能定位 MTU 问题的老运维。差别不在界面熟不熟。


抓包只对自有网络与自有服务进行。抓取他人流量、分析他人通信内容,即使技术上能做到,也可能违反法律。

© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
相关推荐
评论 抢沙发

请登录后发表评论

    暂无评论内容