3、抓包环境搭建:Wireshark安装与配置、tcpdump基础用法、过滤规则入门、抓包点选择
抓包诊断,说白了就是「听网络在说什么」。但工具没搭好,你听到的全是噪音。这一章我带你把耳朵洗干净——从 Wireshark 装好、tcpdump 会用,到过滤规则和抓包点选择,一步到位。
本章核心目标:搭建一套能随时上手的抓包环境,遇到超时问题能立刻开抓,而不是临时百度怎么装软件。
3.1 Wireshark 安装与基础配置
Wireshark 是目前最主流的图形化抓包工具。我个人习惯在 Windows 上用它做日常分析,在 Linux 服务器上用 tcpdump 抓完再拖回本地用 Wireshark 看。
3.1.1 安装要点
- Windows:去官网下载安装包,一路 Next。注意勾选「Install WinPcap」或「Npcap」——这是底层驱动,不装抓不到包。
- macOS:
brew install --cask wireshark,装完需要授权权限。 - Linux:
sudo apt install wireshark(Ubuntu/Debian),安装过程中会问是否允许非 root 用户抓包,我建议选「Yes」。
避坑提醒:我曾经在 CentOS 上装 Wireshark 后忘了加用户组,结果普通用户打开界面一片空白,折腾了半小时才发现是权限问题。装完后记得执行 sudo usermod -a -G wireshark $USER,然后重新登录。
3.1.2 基础配置
装完别急着抓,先做三件事:
- 关闭名称解析:菜单栏
Capture → Options,把Enable network name resolution勾掉。不然抓包时 Wireshark 会发 DNS 查询,干扰你分析。 - 设置时间格式:
View → Time Display Format → Seconds Since Beginning of Capture。这样看时间戳更直观。 - 配置着色规则:
View → Coloring Rules,把 TCP 重传、RST、SYN 等关键包标上颜色。我习惯把重传标成红色,一眼就能扫到问题。
小技巧:配置好的着色规则可以导出为 .txt 文件,换机器时直接导入,省得重新配。
3.2 tcpdump 基础用法
生产环境没图形界面?tcpdump 就是你的救星。它轻量、稳定,几乎每个 Linux 发行版都自带。我遇到线上超时问题时,第一反应就是 SSH 上去跑 tcpdump。
3.2.1 常用命令模板
# 抓取 eth0 网卡所有流量
sudo tcpdump -i eth0
# 抓取指定端口(比如 80)
sudo tcpdump -i eth0 port 80
# 抓取指定主机
sudo tcpdump -i eth0 host 192.168.1.100
# 抓取并保存到文件(最常用)
sudo tcpdump -i eth0 -w /tmp/capture.pcap
# 抓取时显示详细信息
sudo tcpdump -i eth0 -v port 443
你想想看,线上出问题的时候,你不可能在服务器上开 Wireshark 图形界面。所以 tcpdump 的 -w 参数一定要记住——抓完生成 pcap 文件,拖回本地用 Wireshark 分析。
3.2.2 常用参数速查
| 参数 | 作用 | 我的使用场景 |
|---|---|---|
-i |
指定网卡 | 多网卡机器上必须指定,否则可能抓错口 |
-w |
写入文件 | 线上抓包必用,避免终端刷屏 |
-r |
读取文件 | 离线分析时用 |
-c |
抓取指定包数后停止 | 控制抓包量,防止磁盘写满 |
-s |
设置 snaplen(抓取长度) | 默认 262144 字节,一般够用 |
-n |
不解析域名 | 加快抓包速度,减少干扰 |
注意:tcpdump 默认抓取长度是 262144 字节,对于分析 TCP 头部完全够用。但如果你要分析应用层数据(比如 HTTP 请求体),建议保持默认值,不要用 -s 0 去抓全包,否则文件会很大。
3.3 过滤规则入门
抓包最怕什么?数据太多,找不到重点。过滤规则就是你的「筛子」。Wireshark 和 tcpdump 都支持 BPF(Berkeley Packet Filter)语法,学会一套,两边通用。
3.3.1 基础过滤语法
- 按 IP 过滤:
host 192.168.1.1、src host 10.0.0.1、dst host 172.16.0.1 - 按端口过滤:
port 80、src port 443、dst port 22 - 按协议过滤:
tcp、udp、icmp - 组合过滤:
tcp and port 80、host 192.168.1.1 and not port 22
3.3.2 Wireshark 显示过滤器
tcpdump 的过滤是在抓取时就筛掉,Wireshark 的显示过滤器是在抓完后筛选显示。两者语法略有不同,但逻辑一样。
# 只显示 TCP 三次握手包
tcp.flags.syn == 1
# 显示重传包
tcp.analysis.retransmission
# 显示 RST 包
tcp.flags.reset == 1
# 显示特定 IP 和端口
ip.addr == 192.168.1.1 and tcp.port == 443
我的习惯:在 Wireshark 里,我一般先抓全量包,然后用显示过滤器慢慢缩小范围。因为有时候你以为问题在 80 端口,结果发现是 DNS 解析超时——全量包不会漏掉线索。
3.3.3 常见过滤场景
| 场景 | tcpdump 过滤表达式 | Wireshark 显示过滤器 |
|---|---|---|
| 抓取与某 IP 的 HTTP 流量 | host 10.0.0.1 and port 80 |
ip.addr == 10.0.0.1 and tcp.port == 80 |
| 抓取所有 SYN 包 | tcp[tcpflags] & tcp-syn != 0 |
tcp.flags.syn == 1 and tcp.flags.ack == 0 |
| 排除 SSH 流量 | not port 22 |
!tcp.port == 22 |
| 抓取 ICMP 超时包 | icmp[icmptype] == 11 |
icmp.type == 11 |
3.4 抓包点选择
这是最容易被忽略的一步。抓包点选错了,抓到的数据全是废的。我见过太多人直接在客户端抓包,结果发现服务端根本没收到请求——其实问题出在网络中间设备上。
3.4.1 抓包点选择原则
- 客户端侧:适合分析「请求是否发出」、「本地 DNS 解析是否正常」、「本地防火墙是否拦截」。
- 服务端侧:适合分析「请求是否到达」、「服务进程是否响应」、「响应是否被中间设备拦截」。
- 中间节点:适合分析「路由是否可达」、「NAT 是否正常工作」、「负载均衡是否转发正确」。
3.4.2 超时问题典型抓包点
遇到连接超时,我一般按这个顺序部署抓包点:
- 客户端出口:确认 SYN 包是否发出。
- 服务端入口:确认 SYN 包是否到达。
- 服务端出口:确认 SYN+ACK 是否发出。
- 客户端入口:确认 SYN+ACK 是否收到。
为什么会这样?因为超时可能发生在任何一个环节。你在客户端抓包看到 SYN 发出但没收到 SYN+ACK,那问题要么在中间网络,要么在服务端没响应。
实战经验:我曾经处理过一个跨机房超时问题。客户端和服务端都在各自机房,中间经过防火墙和负载均衡。我在四个点同时抓包,发现客户端 SYN 到了防火墙,但防火墙没转发给负载均衡——原来是防火墙策略过期了。如果只抓一端,这个问题排查起来至少多花半天。
3.4.3 抓包点部署建议
| 场景 | 推荐抓包点 | 原因 |
|---|---|---|
| 客户端到服务端直连 | 客户端 + 服务端 | 两端对比,快速定位问题在哪一端 |
| 经过负载均衡 | 客户端 + 负载均衡前后 | 确认负载均衡是否正常转发 |
| 跨公网访问 | 客户端 + 公网出口 | 公网丢包或延迟是常见原因 |
| 容器环境 | 宿主机 + 容器内 | 确认网络策略或 CNI 插件是否正常 |
3.5 本章知识体系
下面这张图把本章的核心逻辑串起来了。从工具安装到抓包点选择,每一步都是为诊断超时问题服务的。
一句话总结:Wireshark 和 tcpdump 是左右手,过滤规则是筛子,抓包点选对了才能一击命中。别急着抓,先想清楚「在哪抓」和「抓什么」。