4. tcpdump 入门:安装、基本语法与常用参数

抓包工具那么多,为什么我第一个讲 tcpdump?

说白了,它是 Linux 系统里最底层的网络分析工具。没有图形界面,不依赖任何第三方库,几乎所有的 Linux 发行版都自带或能轻松装上。你在生产环境排查问题,服务器上可能没有 Wireshark,但一定有 tcpdump。所以,学抓包,从 tcpdump 开始,是最务实的选择。

4.1 安装 tcpdump

大多数情况下,系统已经装好了。你可以先敲个命令确认一下:

which tcpdump

如果返回了路径,比如 /usr/sbin/tcpdump,那就直接用。如果没找到,安装也很简单:

系统 安装命令
CentOS / RHEL yum install -y tcpdump
Ubuntu / Debian apt-get install -y tcpdump
Alpine Linux apk add tcpdump
小提示: 安装完成后,记得用 tcpdump --version 看一眼版本。我个人习惯用 4.9.x 以上的版本,对新协议的支持更好。

4.2 基本语法:一句话说清楚

tcpdump 的用法其实就一个公式:

tcpdump [参数] [表达式]

参数 控制抓包的行为(抓几个包、抓多大、显示什么)。
表达式 控制抓什么包(只抓某个 IP、某个端口、某种协议)。

表达式我们后面章节会细讲,今天先搞定参数。参数是 tcpdump 的骨架,骨架搭好了,后面加什么表达式都顺手。

4.3 五个核心参数,搞定 80% 的场景

tcpdump 的参数有几十个,但日常高频使用的,其实就五个。我把它们列出来,你挨个试一遍,基本就入门了。

参数 全称 作用 我的常用写法
-i interface 指定抓包的网卡 -i eth0
-n no resolve 不解析域名和端口名 -nn (两个 n 连用)
-c count 抓取指定数量的包后退出 -c 100
-s snaplen 抓取每个包的前 N 字节 -s 0 (抓完整包)
-w write 将抓包结果写入文件 -w dump.pcap

4.3.1 -i:选对网卡,成功一半

一台服务器上可能有好多网卡:eth0、eth1、lo(回环接口)、docker0(Docker 虚拟网桥)…… 你不指定,tcpdump 默认只抓 eth0。

怎么知道有哪些网卡?

tcpdump -D

这个命令会列出所有可用的网卡接口。我在项目中遇到过好几次,明明在服务器上抓包,却什么包都看不到,最后发现是抓错了网卡——流量走的是 eth1,我抓的是 eth0。嗯,这种低级错误,犯过一次就记住了。

重点: 抓回环流量(本机进程间通信)必须用 -i lo。默认的 eth0 是抓不到的。

4.3.2 -n:别让 DNS 拖慢你

tcpdump 默认会尝试把 IP 地址解析成域名,把端口号解析成服务名(比如 80 -> http)。听起来很贴心,但在生产环境里,这恰恰是灾难。

为什么?

  • DNS 解析可能失败,导致输出卡顿。
  • 解析结果会覆盖原始 IP,你反而看不清真实地址。
  • 高并发场景下,解析本身会消耗 CPU。

所以我的习惯是:永远加 -nn。两个 n,一个不解析域名,一个不解析端口。输出干净利落:

tcpdump -nn -i eth0

输出会变成这样:

IP 10.0.0.1.54321 > 10.0.0.2.80: Flags [S], seq 12345

一眼就能看到源 IP、源端口、目标 IP、目标端口,多清爽。

4.3.3 -c:抓够了就停

不加 -c,tcpdump 会一直抓下去,直到你按 Ctrl+C。这在调试时很不方便——你可能只想看前几个握手包。

-c 10 的意思是:抓到 10 个包后自动退出。非常适合快速验证:

tcpdump -nn -i eth0 -c 10

我曾经在排查一个连接超时问题时,就用 -c 3 抓了三次握手的三个包,几秒钟就定位到是服务端没回 SYN-ACK。要是没有 -c,我还得手动 Ctrl+C,多了一步操作。

4.3.4 -s:抓大包还是抓小包?

这个参数的全称是 snaplen(快照长度),意思是每个包只抓前 N 个字节。默认值是 262144 字节(256KB),对于绝大多数场景都够用。

但有两个极端情况:

  • 抓小包(比如只关心 TCP 头部): 可以设 -s 64,只抓前 64 字节,节省磁盘和内存。
  • 抓完整包: 设 -s 0,表示使用默认值(抓完整包)。
注意: 如果你用 -s 截断了包,后续用 Wireshark 分析时,应用层数据是看不到的。所以,除非你明确知道只需要头部,否则我建议用 -s 0 抓完整包。

4.3.5 -w:把包存下来,慢慢分析

实时看 tcpdump 的输出,眼睛容易花。更专业的做法是:先把包抓到文件里,然后用 Wireshark 慢慢分析。

tcpdump -nn -i eth0 -c 1000 -w capture.pcap

这个命令会抓 1000 个包,写入 capture.pcap 文件。pcap 是标准的抓包文件格式,Wireshark、tshark 都能打开。

配合 -r 参数可以读取文件:

tcpdump -r capture.pcap -nn

这样你可以在离线环境下反复分析,不会影响线上服务。

4.4 组合使用:一个完整的例子

把上面五个参数串起来,就是一个非常实用的抓包命令:

tcpdump -nn -i eth0 -c 500 -s 0 -w /tmp/http_debug.pcap

这条命令的意思是:

  • 不解析域名和端口(-nn)
  • 监听 eth0 网卡(-i eth0)
  • 抓 500 个包后自动停止(-c 500)
  • 抓取完整包内容(-s 0)
  • 保存到 /tmp/http_debug.pcap(-w)

这个命令我几乎每天都在用。你想想看,500 个包对于一次 HTTP 请求的排查完全够用,又不会生成太大的文件。优雅。

4.5 本章知识体系

下面这张图帮你把今天的内容串起来:

tcpdump 入门核心知识体系 tcpdump 命令 安装与验证 基本语法结构 五个核心参数 -i 指定网卡 -n 不解析 -c 计数停止 -s 快照长度 -w 写入文件 核心原则:先选网卡,再加 -nn,最后用 -w 保存

4.6 避坑指南

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

  • 权限问题: tcpdump 需要 root 权限。如果你用普通用户执行,会报错 Permission denied。记得加 sudo。
  • 磁盘写满: 不加 -c 在高并发环境下抓包,pcap 文件会飞速增长。我曾经有一次忘了加 -c,抓了 10 分钟,文件涨到了 2GB…… 嗯,从那以后我养成了习惯:先想好抓多少个包,再动手。
  • 抓包影响性能: tcpdump 本身开销很小,但在万兆网卡、百万并发场景下,抓包确实会消耗 CPU。建议只在排查问题时短时间抓包,不要长期开着。

好了,tcpdump 的安装和五个核心参数就讲到这里。这几个参数你练熟了,后面加表达式就是水到渠成的事。