抓包工具:Wireshark、tcpdump、tshark

协议分析第一步,你得有把好锤子——抓包工具。这些年我试过的抓包工具少说也有七八种,但真正能打硬仗的,翻来覆去就这三把:Wireshark、tcpdump、tshark。它们各自擅长什么?什么时候该用哪个?我今天一次说透。

一句话总结:

  • 想可视化点一点就抓包、看协议层结构 → Wireshark
  • 服务器上没图形界面、低资源消耗、做自动化脚本 → tcpdump
  • 既要命令行又想要 Wireshark 的解析能力 → tshark

Wireshark:图形化抓包利器

Wireshark 我用了十年,它几乎是协议分析的行业标准。你想想看,双击就能选网卡,点一下开始就能看到实时流量,每个包的以太网帧、IP头、TCP头、应用层数据一层层展开,比看二进制舒服太多了。

它最让我佩服的是过滤引擎。比如我只想看本机 192.168.1.100 发往 8.8.8.8 的 DNS 查询,直接输入:

ip.src == 192.168.1.100 && ip.dst == 8.8.8.8 && dns

结果瞬间过滤出来。我曾经在线上环境排查一个 DNS 超时问题,就是用 Wireshark 的 dns.time 列快速定位到某台 DNS 服务器响应延迟超过 5 秒,才发现上游链路带宽打满了。

但 Wireshark 也有短板:吃内存。抓大流量包时,我见过它吃掉几个 G 内存然后卡死。所以现在大规模抓包我一般先用 tcpdump 抓完再用 Wireshark 打开。

参数 Wireshark
界面 图形化,支持协议树展开
过滤语法 展示过滤器 + 捕获过滤器(BPF)
适用场景 交互式分析、协议调试、教学
消耗 内存大,不适合长时间高流量捕获

tcpdump:命令行抓包老将

tcpdump 是 Linux 系统自带的老牌工具,说它是工程部署第一选择毫不过分。我习惯直接在服务器上跑一条命令就开始抓,不用管有没有 X11 或显示器:

tcpdump -i eth0 -w capture.pcap port 53

这条命令在 eth0 网卡上抓所有 53 端口的流量,直接写 pcap 文件,CPU 和内存占用极低。我曾经在单台服务器上连续抓 72 小时,文件大小 30 多 G,tcpdump 稳如泰山。

tcpdump 的过滤语法是伯克利包过滤(BPF),表达能力很强但写法不像 Wireshark 那么直观。比如抓 SYN 包:

tcpdump 'tcp[tcpflags] & tcp-syn != 0'

嗯,你得懂一点 TCP 头部偏移才能用好。所以 tcpdump 更适合脚本化、远程、无人值守的场景。

参数 tcpdump
界面 命令行,无图形
过滤语法 BPF 原始表达式
适用场景 服务器抓包、自动化采集、低资源环境
消耗 低,适合长时间运行

tshark:Wireshark 的命令行兄弟

tshark 是 Wireshark 家族的命令行版本。我用它最多的场景是对已抓好的 pcap 文件做二次分析。比如我想快速统计一个文件里所有 HTTP 响应的状态码分布:

tshark -r capture.pcap -Y http.response.code -T fields -e http.response.code | sort | uniq -c

你看,-Y 后面直接写 Wireshark 的展示过滤器语法!这意味着你可以在命令行里用和 Wireshark 一样的过滤逻辑,不用再去记 BPF。

但 tshark 有个小毛病:解析 pcap 时会把整个文件读入内存再分析,文件太大(超过几个 G)时容易爆内存。碰到这种情况,我推荐用 tshark -r file.pcap -w out.pcap 先切分。

参数 tshark
界面 命令行,支持管道和脚本
过滤语法 展示过滤器(同 Wireshark)
适用场景 pcap 离线分析、统计、自动化报告
消耗 中等,大文件需注意内存

三个工具怎么选?一张图看懂

抓包工具选择逻辑 物理/虚拟网卡接口 Wireshark tcpdump tshark 图形化 · 实时分析 纯命令行 · 低消耗 命令行 · Wireshark过滤 选择依据 有屏幕、人机交互 → Wireshark 无人服务器、长时间抓取 → tcpdump 离线分析、自动化统计 → tshark 抓包工具层

抓包时的几个避坑点

小技巧:如果你不确定用什么工具抓,先跑 tcpdump 抓个 10 秒,产生一个几百 KB 的 pcap,拿到本地用 Wireshark 查看。这样既省服务器资源,又能用 Wireshark 的强分析能力。

避坑指南:

  • 我曾经用 Wireshark 直接抓线上服务器流量,开了自动解析后 CPU 飙到 100%,导致业务接口响应延迟。记住:生产环境用 tcpdump 抓原始包,别开解析。
  • tcpdump 默认只抓前 96 字节(snapshot length)。如果你要分析 HTTP 或 protobuf 负载,务必加参数 -s 0 抓全包,否则拿到的是半截数据。
  • tshark 对大 pcap 文件的 -Y 过滤速度很快,但不要用 -z 统计模式跑超大文件(几十 G),会耗尽内存。建议先切分成小文件再统计。