3. 抓包工具入门

说到网络排障,我最常用的工具就是Wireshark。说实话,没有它我都不敢说自己懂网络。今天咱们就聊聊这个抓包利器的入门操作。

为什么是Wireshark?

你想想看,网络通信就像两个人在打电话。你只能听到对方说了什么,但中间有没有杂音、有没有停顿、信号好不好,这些细节你是不知道的。Wireshark就是那个能让你「看到」通话细节的工具。

我个人习惯,遇到任何网络问题,第一件事就是开Wireshark抓包。不是因为它万能,而是因为它能给你最原始的证据。我在项目中遇到过好几次,开发说「网络没问题」,结果我一抓包,重传率高达30%。嗯,证据摆在那,谁也赖不掉。

核心思想:Wireshark不是魔法,它只是把网卡上经过的数据包原样复制一份给你看。你看到的,就是网络真实的样子。

基础操作:从安装到抓包

安装我就不多说了,官网下载,一路下一步。但有个坑我得提醒你——安装时记得勾选「WinPcap」或「Npcap」,不然抓不了包。我曾经帮一个同事远程排障,搞了半天发现他没装驱动,尴尬得很。

选择网卡

打开Wireshark,你会看到一个网卡列表。怎么选?

  • 有线网卡:通常叫「以太网」或「Ethernet」
  • 无线网卡:名字里带「Wi-Fi」或「Wireless」
  • 回环接口:叫「Loopback」或「Adapter for loopback」

如果你不确定,看IP地址。哪个网卡有你要抓的IP,就选哪个。

开始抓包

双击网卡,Wireshark就开始疯狂滚屏了。第一次看到这个场面,你可能会慌——怎么这么多包?别急,这就是原始数据,我们需要过滤。

小技巧:按Ctrl + E可以快速开始/停止抓包。我习惯先停止,再慢慢分析,而不是一边抓一边看。

过滤语法:你的第二双眼睛

Wireshark最强大的功能就是过滤。没有过滤,你就像在垃圾堆里找一枚硬币。有了过滤,你就是在聚光灯下找那枚硬币。

捕获过滤器 vs 显示过滤器

这两个概念容易搞混。我简单解释一下:

类型 作用时机 语法 典型场景
捕获过滤器 抓包之前 BPF语法 只抓特定端口的包,减少数据量
显示过滤器 抓包之后 Wireshark语法 从已抓到的包中筛选出需要的

我个人建议:平时用显示过滤器就够了。捕获过滤器适合在流量特别大的场景下用,比如抓核心交换机端口。

常用显示过滤器

这些是我每天都会用到的:

# 只看HTTP流量
http

# 只看某个IP
ip.addr == 192.168.1.1

# 只看某个端口
tcp.port == 443

# 只看DNS查询
dns

# 只看TCP重传
tcp.analysis.retransmission

# 组合条件
http and ip.addr == 10.0.0.5

为什么用ip.addr而不是ip.src或ip.dst?因为ip.addr同时匹配源和目标,省事。如果你确定方向,再用具体的。

注意:显示过滤器是大小写敏感的。写HTTP和写http结果不一样。我刚开始就吃过这个亏,查了半天为什么过滤不出来。

抓取本机流量

本机流量是最简单的。选对网卡,直接抓就行。但有个特殊情况——本机访问本机的流量(比如访问127.0.0.1),普通网卡抓不到。

为什么会这样?因为回环流量不经过物理网卡,它在内核里就转发了。你需要安装Npcap时勾选「Loopback Support」,或者用Wireshark的回环接口。

我记得有一次排查一个本地Web服务的问题,抓了半天没抓到包,后来才意识到是回环流量。嗯,这个坑我替你们踩过了。

抓取远程流量

远程抓包稍微复杂一点。你不能直接跑到远程服务器上装Wireshark吧?尤其是生产环境。这时候有几种方案:

方案一:SSH + tcpdump

这是我最常用的方法。在远程服务器上用tcpdump抓包,然后把文件传回来分析。

# 在远程服务器上抓包
ssh user@remote-server "tcpdump -i eth0 -w - port 80" > remote.pcap

这个命令会把远程服务器的80端口流量实时传到本地,保存为remote.pcap。然后你用Wireshark打开这个文件就行。

方案二:Wireshark的SSH远程抓包

Wireshark本身支持通过SSH远程抓包。操作步骤:

  1. 点击「捕获」→「选项」
  2. 在「管理接口」中选择「SSH远程捕获」
  3. 输入远程服务器的IP、用户名、密码
  4. 选择远程网卡,开始抓包

这个方式的好处是实时,坏处是如果网络不稳定,抓包会中断。我个人还是倾向于方案一,稳一点。

避坑指南:我曾经在生产环境用SSH远程抓包,结果抓了半小时,发现文件有2GB。分析的时候Wireshark直接卡死了。后来我学乖了,抓包前先用捕获过滤器限制一下,比如只抓特定IP或端口。

知识体系一览

下面这张图是我自己整理的Wireshark入门知识结构,你可以照着这个路径学习:

Wireshark 入门知识体系 Wireshark 核心 基础操作 • 安装与驱动配置 • 选择网卡 • 开始/停止抓包 • 保存与打开pcap文件 过滤语法 • 捕获过滤器(BPF) • 显示过滤器 • 协议过滤(http/dns) • 组合条件(and/or) 本机流量抓取 • 物理网卡抓包 • 回环接口抓包 远程流量抓取 • SSH + tcpdump • Wireshark远程捕获

实战:一个完整的抓包流程

光说不练假把式。咱们走一遍完整的流程:

  1. 确定目标:比如我想看访问百度首页时发生了什么
  2. 选择网卡:选能上网的那个
  3. 设置过滤:先设个捕获过滤器host 183.232.231.172(百度的一个IP)
  4. 开始抓包:按Ctrl + E
  5. 触发流量:在浏览器里打开百度
  6. 停止抓包:再按Ctrl + E
  7. 分析数据:看DNS解析、TCP三次握手、HTTP请求/响应

你会在Wireshark里看到什么?先是DNS查询,然后是TCP三次握手,接着是TLS握手(如果走HTTPS),最后才是HTTP数据。每一步都有对应的数据包,你可以点开看每个字段的详细信息。

关键点:Wireshark的「Follow Stream」功能特别好用。右键点击一个HTTP包,选择「Follow」→「TCP Stream」,就能看到完整的请求和响应内容。我在排查API接口问题时,经常用这个功能直接看返回数据对不对。

避坑指南

最后分享几个我踩过的坑:

  • 抓包文件太大:Wireshark默认会把所有包都抓到内存里。如果你抓的时间长,文件会很大。建议用-a duration:60限制抓包时长,或者用-C 10限制文件大小。
  • 权限问题:Linux下抓包需要root权限。用sudo或者把用户加到wireshark组里。
  • 无线网卡抓包不完整:有些无线网卡驱动不支持监控模式,抓不到所有包。这时候换个有线网卡试试。
  • 时间戳不准:Wireshark显示的时间是抓包机器的时间。如果你跨机器对比,记得先同步时间。

嗯,Wireshark入门其实不难,难的是看懂包里的内容。但只要你多抓、多看、多分析,慢慢就能从一堆乱码中看出门道来。记住,网络不会说谎,说谎的是人。而Wireshark,就是那个让真相浮出水面的工具。