搞网络、搞运维、搞安全的兄弟,几乎没人能绕开 tcpdump。它是 Linux 系统上最老牌、最底层的命令行抓包工具,基于 libpcap 库工作,能直接采集网卡上经过的每一个报文,并以你能看懂的方式打印出来。说白了,当你在服务器上怀疑接口超时、DNS 解析变慢、连接被重置,又没法在客户端装 wireshark 或者 fiddler 的时候,tcpdump 就是第一选择。它能让你在没有任何图形界面的生产环境里,用最短的时间定位“包到底有没有来”“包到底去了哪里”这类最基础、也最致命的问题。
这篇文章我想按照自己实战中用 tcpdump 的经验来写,从安装到常用参数,从过滤语法到长时抓包,再到真实排障场景,完整过一遍。适合刚接触 Linux 网络排查的初级运维,也适合那些已经会用几分但总在细节上卡壳的开发同学。只要照着敲一遍,再遇上网络问题,你至少能自己先看一眼报文,而不是全靠猜。
1. 上手前先搞清楚:tcpdump 为什么是绕不开的抓包工具
1.1 抓包的底层逻辑和 tcpdump 的工作原理
抓包本质上就是“旁听”网卡上的网络流量。网卡收到数据帧之后,正常情况下只会把发往本机的报文交给内核协议栈处理,而 tcpdump 这类基于 libpcap 的工具,会先把网卡设置成“混杂模式”(promiscuous mode),也就是把经过该网卡的所有报文都复制一份给抓包程序,再由 BPF(Berkeley Packet Filter)做过滤,最终只把符合条件的报文呈现给你。
这里要理解一个关键点:tcpdump 抓到的是“报文的副本”,它不会影响报文继续走正常的内核协议栈。也就是说,你抓包的时候流量是正常流转的,不存在“因为你在抓包所以应用就出错”的情况(除非你同时做了什么额外干预)。我见过有些同事一抓包就紧张,怕影响线上业务,其实对于网卡抓包来说,通常只需要担心的是抓包流量过大把磁盘写满,而不是抓包本身会打断业务连接。
BPF 是这个工具的灵魂。tcpdump 之所以效率高,是因为过滤动作发生在内核态,只有匹配到的报文才会被拷贝到用户态打印,而不是把所有流量全捞上来再慢慢挑。所以平时写抓包命令时,尽量把过滤条件写到 tcpdump 的参数里,而不是先抓全量再回去用 grep 筛,这既是效率问题,也是磁盘空间的生存问题。
1.2 和 wireshark、fiddler、charles 等工具的定位差异
总有人问:我电脑上装了 wireshark,为什么还要用 tcpdump?答案很简单:wireshark 是图形化工具,很适合人眼分析,但它不能直接抓服务器上的包,也不能在一台没有显示器的 Linux 主机上跑。fiddler、charles 这类更倾向于 HTTP/HTTPS 层面的代理抓包,它们能解开请求和响应,能篡改报文,但在“网卡层的原始包”面前,它们不是同一个维度的工具。
tcpdump 更像是一个“底层取证工具”。代理类工具看不到 TCP 重传,看不到握手过程,看不到 SYN 包有没有回应,而这些恰恰是网络排查里最关键的证据。tcpdump 抓下来的 pcap 文件,可以拿到本地用 wireshark 打开慢慢分析,这也是最经典的组合姿势:服务器端用 tcpdump 采集,本地用 wireshark 还原线索。
所以我的建议是:这几个工具不是竞争关系,而是互补。生产环境用 tcpdump 拿原始的包,本地用 wireshark 做协议解析和可视化分析,日常调试接口可以用 fiddler 或 charles 看 HTTP 层的信息。但如果你只会用 fiddler 点按钮,从来没在服务器上敲过 tcpdump,那遇到线上问题大概率会束手无策。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从安装到第一个抓包:环境准备与快速起步
2.1 在线安装与离线安装,两条路径都给你铺好
在线安装非常直接。Debian 系用 apt,CentOS/RHEL 系用 yum,Alpine 用 apk,几乎一行命令就能搞定。
bash复制# Debian / Ubuntu
apt-get update && apt-get install -y tcpdump
# CentOS / RedHat / Rocky
yum install -y tcpdump
# Alpine
apk add tcpdump
安装完先验证一下版本和可用的网卡接口:
bash复制tcpdump --version
ip link show
离线安装就稍微有点讲究了。内网服务器没有外网权限,最常见的方式是在一台能连外网的机器上把 rpm 包拉下来,传到内网安装。这里要注意,tcpdump 依赖 libpcap,所以至少需要两个 rpm 包。用 yumdownloader 可以自动把依赖一起下载下来:
bash复制# 在外网机器上执行
yum install -y yum-utils
yumdownloader --resolve --destdir=/tmp/tcpdump_rpm tcpdump
然后把 /tmp/tcpdump_rpm 目录下的所有 rpm 包拷贝到内网服务器,按依赖顺序安装:
bash复制rpm -ivh libpcap-*.rpm
rpm -ivh tcpdump-*.rpm
如果内网还是老旧的 RHEL 6 或者 CentOS 7,也可以在官方源里找对应版本的 rpm 包手动下载。安装完运行 tcpdump --version,能看到版本信息就说明装好了。有一点值得提醒:有些精简版系统可能缺少 libpcap 的底层库模块,装完 tcpdump 后执行任意抓包命令直接报 `libpcap.so: cannot open
