4. tcpdump 基础:安装、常用参数与基本抓包命令
说实话,tcpdump 是我排查网络问题时最常用的工具,没有之一。很多刚入行的朋友喜欢用 Wireshark 的图形界面,这没问题。但到了生产环境,尤其是只有 SSH 连接的服务器上,tcpdump 就是你唯一的眼睛。这一章,咱们就把 tcpdump 的底子打扎实。
4.1 安装 tcpdump
大部分 Linux 发行版默认不带 tcpdump,需要手动装一下。不同系统的安装命令我列在下面:
| 操作系统 | 安装命令 |
|---|---|
| CentOS / RHEL | yum install -y tcpdump |
| Ubuntu / Debian | apt-get install -y tcpdump |
| Alpine Linux | apk add tcpdump |
tcpdump --version 确认安装成功。我个人习惯顺手看一眼版本号,不同版本在某些参数行为上略有差异。
4.2 核心参数详解
tcpdump 的参数看着多,但真正高频使用的就这几个。我按使用频率排个序,咱们一个一个说。
-i:指定抓包网卡
这是最基础的参数。不指定的话,tcpdump 默认抓第一块非 loopback 网卡。但生产环境里服务器通常有多块网卡,比如 eth0 是业务网卡,eth1 是管理网卡。你想想看,抓错了网卡,啥也查不出来。
# 查看所有可用网卡
tcpdump -D
# 指定抓 eth0 网卡
tcpdump -i eth0
-n:不解析域名和端口
这个参数我几乎每次都加。不加 -n 的话,tcpdump 会尝试把 IP 解析成域名,把端口号解析成服务名。解析过程会发 DNS 查询,不仅慢,还可能因为 DNS 超时导致抓包卡住。说白了,我们抓包是为了看原始数据,不是看域名。
# 推荐用法:不解析任何名称
tcpdump -i eth0 -n
# 只不解析主机名,但解析端口服务名(不常用)
tcpdump -i eth0 -nn
-c:指定抓包数量
这个参数用来控制抓多少个包后自动停止。调试时特别有用,不然 tcpdump 会一直抓下去,直到你按 Ctrl+C。
# 抓 10 个包后自动退出
tcpdump -i eth0 -n -c 10
-s:设置抓包长度( snaplen )
这个参数很多人容易忽略。默认情况下,tcpdump 只抓每个包的前 96 字节(老版本是 68 字节)。对于只查看 TCP 头部信息来说够用了,但如果你想分析应用层数据,比如 HTTP 请求体,就必须把 snaplen 设大。
# 抓完整包(65535 字节)
tcpdump -i eth0 -n -s 0
# 或者显式指定长度
tcpdump -i eth0 -n -s 1500
这里有个坑:-s 0 表示使用默认值 65535,也就是抓完整包。但如果你在流量很大的链路上抓完整包,CPU 和磁盘开销会明显上升。嗯,这个要权衡。
-w:保存抓包文件
这是我最常用的参数组合。把抓到的包保存成 pcap 文件,后续可以用 Wireshark 慢慢分析,或者发给同事一起看。
# 保存到文件
tcpdump -i eth0 -n -w /tmp/capture.pcap
# 保存时同时显示包摘要(-v 表示 verbose)
tcpdump -i eth0 -n -w /tmp/capture.pcap -v
capture_20250115_1430.pcap。这样后续回溯问题时,一眼就知道是哪个时间段的流量。
4.3 基本抓包命令实战
参数学完了,咱们来几个实际场景。这些命令我每天都在用,你直接复制就能跑。
场景一:抓所有流量看看
tcpdump -i eth0 -n -c 50
这个命令适合刚连上服务器,想快速了解当前网络流量的情况。抓 50 个包,看看源 IP、目标 IP、端口号分布。
场景二:抓特定主机的流量
tcpdump -i eth0 -n host 192.168.1.100
排查连接超时时,我经常先确认目标服务器 IP,然后只抓和它的通信。这样过滤掉无关流量,分析起来快很多。
场景三:抓特定端口的流量
tcpdump -i eth0 -n port 80
Web 服务超时排查时,这个命令是标配。只抓 80 端口的 HTTP 流量,其他包一概不理。
场景四:抓完整包并保存
tcpdump -i eth0 -n -s 0 -w /tmp/full_capture.pcap
这个组合我称之为「黄金配置」。抓完整包、不解析名称、保存到文件。适合事后详细分析。
4.4 本章知识体系
下面这张图把 tcpdump 的核心知识点串起来了。你可以把它当作速查表,以后用 tcpdump 时瞄一眼就行。
4.5 避坑指南
最后分享几个我踩过的坑,你遇到了能少走弯路。
- 权限问题:tcpdump 需要 root 权限。如果你用普通用户跑,会报错
permission denied。加 sudo 就行。 - 磁盘写满:我曾经在线上服务器用
-w抓包,忘了设-c,结果抓了一整夜,把 /var 分区写满了。现在我的习惯是:长时间抓包一定配合-C(文件大小限制)和-W(文件数量限制)参数。 - 抓包影响性能:在高吞吐链路上抓包,CPU 占用会明显上升。如果只是排查连接超时,建议只抓握手阶段的包,用
-c 10就够了。