抓包工具准备:Wireshark的安装与配置、tcpdump基础用法、抓包过滤器
工欲善其事,必先利其器。做网络排错,手里没几把趁手的工具,那真是寸步难行。这一章,我就带你把这套家伙事儿备齐了。
咱们主要聊三样:Wireshark、tcpdump,还有抓包过滤器。前两个是抓包工具,第三个是让工具听话的“缰绳”。
Wireshark:图形化抓包利器
Wireshark 是我用得最多的工具,没有之一。它的界面直观,功能强大,特别适合做深度分析。
安装与配置
安装其实没什么难度,但有几个坑我得提前跟你说。
- Windows 用户:去官网下载安装包,一路 Next 就行。安装过程中会提示安装 Npcap,一定要装。Npcap 是 Wireshark 抓包的底层驱动,不装它,Wireshark 就是个空壳子。
- macOS 用户:用 Homebrew 最省事,一条命令搞定:
brew install --cask wireshark。装完后记得把当前用户加到access_bpf组里,否则没权限抓包。 - Linux 用户:发行版不同命令略有差异。Debian/Ubuntu 用
sudo apt install wireshark,安装时选择“允许非 root 用户抓包”。
避坑指南:我曾经在 CentOS 7 上装 Wireshark,装完发现抓不了包。折腾了半天,最后发现是 SELinux 在作怪。如果你在 Linux 上遇到类似问题,先检查 SELinux 状态,临时关掉试试:
setenforce 0。
装好之后,打开 Wireshark,你会看到一堆网络接口。选对接口是关键。我一般先看一眼 IP 地址,确认是哪个网卡在跑业务流量。
核心配置项
我个人习惯,拿到 Wireshark 先做两件事:
- 关闭名称解析:菜单栏 → Capture → Options,把“Enable network name resolution”的勾全去掉。为什么?因为名称解析会发 DNS 请求,不仅拖慢抓包速度,还会产生额外流量,干扰分析。
- 调整时间显示格式:View → Time Display Format → Seconds Since Beginning of Capture。这样看时间戳更直观,方便计算延迟。
tcpdump:命令行抓包神器
Wireshark 虽好,但有些场景它派不上用场。比如服务器没装图形界面,或者你只能通过 SSH 连上去。这时候,tcpdump 就是你的救星。
tcpdump 是 Linux 下的标配,几乎所有发行版都自带。它的核心用法其实就几个参数,我帮你总结一下:
| 参数 | 作用 | 示例 |
|---|---|---|
-i |
指定网卡接口 | tcpdump -i eth0 |
-n |
不解析主机名(加速) | tcpdump -n |
-c |
抓取指定数量的包后退出 | tcpdump -c 100 |
-s |
抓取每个包的长度(默认65535) | tcpdump -s 0(抓完整包) |
-w |
保存到文件(pcap格式) | tcpdump -w output.pcap |
-r |
读取pcap文件 | tcpdump -r output.pcap |
举个例子,我想抓 eth0 网卡上发往 192.168.1.100 的 HTTP 流量,保存到文件里,可以这么写:
tcpdump -i eth0 -n -s 0 -w http_traffic.pcap host 192.168.1.100 and port 80
小技巧:在服务器上抓包,我建议先用
-c 10 抓几个包试试,确认过滤器写对了,再正式抓。否则抓了半天,发现过滤器写错了,白忙活一场。
抓包过滤器:让工具听你的话
抓包工具就像个录音机,你不告诉它录什么,它就把所有声音都录下来。网络流量那么大,不设过滤器,你根本找不到想要的东西。
Wireshark 和 tcpdump 的过滤器语法基本一致,都是基于 BPF(Berkeley Packet Filter) 的。我把它分成两类:
1. 捕获过滤器(Capture Filter)
在开始抓包之前就设置好,只抓符合条件的包。优点是节省资源,缺点是漏掉的包就再也找不回来了。
常用写法:
- 抓特定主机的流量:
host 192.168.1.1 - 抓特定端口的流量:
port 80 - 抓特定协议的流量:
tcp、udp、icmp - 组合条件:
host 192.168.1.1 and port 443 - 排除某个主机:
not host 192.168.1.100
2. 显示过滤器(Display Filter)
抓完包之后,在 Wireshark 里对已抓到的包进行二次筛选。优点是灵活,可以随时调整条件。
常用写法:
- 只看 HTTP 请求:
http.request - 只看 TCP 三次握手:
tcp.flags.syn == 1 - 只看重传包:
tcp.analysis.retransmission - 只看特定 IP 的流量:
ip.addr == 10.0.0.1 - 只看特定端口的流量:
tcp.port == 8080
重点:捕获过滤器用
and、or、not 连接条件;显示过滤器用 &&、||、!。别搞混了,否则过滤器不生效。
本章知识体系
下面这张图,帮你把本章的核心逻辑串起来: