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
注意:我曾经在排查一个连接超时问题时,抓了半天没抓到包,最后发现默认抓的是 lo 回环网卡。从那以后,我每次抓包都显式指定 -i 参数,绝不偷懒。

-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
我的习惯:排查连接超时问题时,我一般先设 -c 100 抓一小段看看流量特征。确认过滤条件正确后,再去掉 -c 做长时间抓包。

-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
技巧:保存 pcap 文件时,我建议文件名里带上时间戳,比如 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 时瞄一眼就行。

tcpdump 核心知识体系 tcpdump 基础 安装 常用参数(5 个核心) 基本抓包命令 各系统安装命令 CentOS: yum install Ubuntu: apt-get install Alpine: apk add 参数详解 -i : 指定网卡(最常用) -n : 不解析域名/端口 -c : 抓 N 个包后停止 -s : 设置抓包长度(snaplen) -w : 保存为 pcap 文件 实战命令 抓所有流量:不加过滤 抓特定主机:host 抓特定端口:port 抓完整包:-s 0 -w 核心原则:先看流量特征 → 再精确过滤 → 最后保存分析 排查连接超时,-n 和 -w 是黄金搭档

4.5 避坑指南

最后分享几个我踩过的坑,你遇到了能少走弯路。

  • 权限问题:tcpdump 需要 root 权限。如果你用普通用户跑,会报错 permission denied。加 sudo 就行。
  • 磁盘写满:我曾经在线上服务器用 -w 抓包,忘了设 -c,结果抓了一整夜,把 /var 分区写满了。现在我的习惯是:长时间抓包一定配合 -C(文件大小限制)和 -W(文件数量限制)参数。
  • 抓包影响性能:在高吞吐链路上抓包,CPU 占用会明显上升。如果只是排查连接超时,建议只抓握手阶段的包,用 -c 10 就够了。
一句话总结:tcpdump 的核心就五个参数(-i、-n、-c、-s、-w),组合起来能覆盖 90% 的抓包场景。先把这五个参数练熟,后面学过滤表达式就轻松多了。