tcpdump 是命令行版的 网络协议分析器——一条命令,把流经网卡的 数据包实时”拍下来”,可以直接打印,也可以存成文件回头慢慢看。
Wireshark 是它的图形化表亲。区别很简单:服务器上、SSH 里、要写进脚本 → 用 tcpdump;坐在桌面深度分析 → 用 Wireshark。 实战里最常见的组合是:tcpdump 在服务器抓、存成文件,拖回本地用 Wireshark 看。
预装在大多数 Linux 发行版里,macOS 等 Unix 系统也能装。
速查表(先看这个)
# 列出可用网卡
sudo tcpdump -D
# 抓所有网卡的流量,存成 pcap 文件
sudo tcpdump -i any -w capture.pcap
# 读回一个 pcap 文件
sudo tcpdump -r capture.pcap
# 只抓 3 个包,详细模式,不做名字解析
sudo tcpdump -i any -c 3 -vn
# 读文件 + 只看 80 端口的 IPv4 流量
sudo tcpdump -r capture.pcap -n 'ip and port 80'| 选项 | 作用 | 记忆 |
|---|---|---|
-i <网卡> | 指定从哪块网卡抓(-i any = 全部) | interface |
-D | 列出所有可用网卡 | Devices |
-w <文件> | 把抓到的包写进 pcap 文件 | write |
-r <文件> | 读一个 pcap 文件 | read |
-v / -vv / -vvv | 详细程度,v 越多越啰嗦 | verbose |
-c <数字> | 只抓 N 个包就停 | count |
-n / -nn | 不解析名字(-n 不解析主机,-nn 连端口也不解析) | no resolve |
⚠️ 选项区分大小写:小写
-w(写文件)和大写-W(限制文件数)是两个完全不同的东西。
抓包的基本语法
sudo tcpdump [-i 网卡] [选项] [过滤表达式]拆开看:
sudo—— 抓包需要管理员权限。你得是 root 用户,或者能用 sudo 临时提权。这是因为读网卡上所有流量(包括不发给你的)是个高权限操作。-i 网卡—— 必须指定从哪块网卡抓。不知道有哪些网卡?先sudo tcpdump -D列一下。-i any抓全部网卡。- 选项 —— 可选,改变命令行为(见上面速查表)。
- 过滤表达式 —— 可选,进一步筛流量(下面讲)。
tcpdump 有五十多个选项,这里只挑实战最常用的。完整列表查
man tcpdump。 短选项可以连写:-i any -c 3和-iany -c3等价;-v和-n能合成-vn。但后面带参数的选项不能合并(比如-c 1、-r file后面跟着值,不能再粘别的选项)。
写文件 vs 读文件:-w 和 -r
抓包的价值在于能存下来事后分析。
# 抓 + 存:把流量写进 packetcapture.pcap
sudo tcpdump -i any -w packetcapture.pcap
# 读:回放这个文件
sudo tcpdump -r packetcapture.pcap存下来的就是 pcap 文件——网络取证的”录像带”。可以归档、可以分享给同事、可以拖进 Wireshark 细看。排查 安全事件时,一份现场 pcap 往往是还原”攻击者到底发了什么”的关键 证据。
控制输出量:-v 和 -c
-v(verbose,详细) —— 默认 tcpdump 不会把包的全部信息打出来。加 -v 让它打详情,三档:-v < -vv < -vvv,越多越细。想看 IP 头字段细节时很有用。
-c(count,计数) —— 控制抓几个包就停。-c 3 抓 3 个,-c 1 只抓 1 个。不加的话 tcpdump 会一直抓到你 Ctrl+C。
# 抓前 3 个包,详细打印
sudo tcpdump -i any -c 3 -v一个反直觉的最佳实践:-n 关掉名字解析
默认 tcpdump 会自动把 IP 翻译成域名、把端口翻译成服务名(比如把 port 80 显示成 http)。听起来贴心,实际上有两个坑:
- 不准 —— 端口 80 不一定真在跑 HTTP,显示成 http 会误导你。
- 会打草惊蛇 —— 名字解析靠反向 DNS 查询(拿 IP 反查域名)。如果你在调查一个攻击者的 IP,这个查询可能通过 DNS 记录通知到对方:有人在查我。
所以分析流量时,加 -n 是最佳实践:
sudo tcpdump -r packetcapture.pcap -v -n-n—— 不解析主机名-nn—— 主机名和端口都不解析
过滤表达式:只看你关心的流量
抓全量流量会淹没在噪声里。过滤表达式让你精准聚焦。
按协议筛:
sudo tcpdump -r capture.pcap ip6 # 只看 IPv6用布尔运算符组合(and / or / not):
# 只看 IPv4 且端口 80 的流量
sudo tcpdump -r packetcapture.pcap -n 'ip and port 80'
# 用括号分组,优先执行括号里的
sudo tcpdump -n 'ip and (port 80 or port 443)'用单引号或双引号包住表达式,确保 tcpdump 完整执行所有过滤条件;括号用来分组、定优先级(复杂命令时尤其有用)。
这种”按 IP、端口、协议精确筛”的能力,正是从海量 网络流量里捞出可疑 IoC 的基本功。
怎么读懂输出:每行一个包,从时间戳开始
tcpdump 给每个抓到的包打印一行,每行以时间戳开头。看这条命令和它的单包输出:
sudo tcpdump -i any -v -c 1输出里你要认出 5 个关键字段:
| 字段 | 含义 |
|---|---|
| Timestamp 时间戳 | 行首,精确到时分秒和小数秒 |
| Source IP 源 IP | 包从哪来 |
| Source port 源端口 | 从源头哪个端口发出 |
| Destination IP 目的 IP | 包发往哪 |
| Destination port 目的端口 | 发往目标的哪个端口 |
剩下的是 TCP 连接细节(flags、sequence number 等),以及 -v 额外带出来的包信息。
读这行的核心问题永远是:谁(源 IP:端口)在跟谁(目的 IP:端口)、什么时候、用什么协议说话。 抓住这条线,异常就好认了——比如一台内部服务器凌晨三点在往陌生境外 IP 发数据,那很可能是 数据外泄或 C2 通信。
一个重要前提:加密流量看不透内容
现在的流量大多是加密的(HTTPS 等)。tcpdump 能抓到这些包,但内容是密文——你只能看到元数据(谁连谁、多大、什么时间),看不到里面传的具体内容。要看明文,得用对应的私钥解密。
这不代表抓包没用:元数据本身就是强信号。哪怕看不到内容,“固定间隔的小流量回连同一个境外 IP”这种模式,就足以暴露 C2 行为。
给 vibe-coder:你什么时候真的会用到它
你不是天天抓包的安全分析师,但这几个场景会救你:
- “我的应用到底往外发了什么?” —— AI 生成的代码、第三方 SDK,可能在你不知情时把数据发给某个地址。
sudo tcpdump -i any -n 'not port 22'抓一段,看看有没有你不认识的外联目标。这是验证”AI 写的东西有没有偷偷上报”的最直接手段。 - “为什么连不上?” —— 请求到底有没有发出去、发到哪了、有没有回包,抓一眼就知道,不用瞎猜。
- 读懂工具/教程甩给你的输出 —— 当 AI 或文档丢给你一段 tcpdump 输出,你能认出那 5 个字段、看懂”谁在跟谁说话”,而不是当成天书。
记住安全边界:抓包需要管理员权限,抓到的 pcap 可能含敏感数据(明文密码、个人信息),当证据一样保管;在不属于你的网络上抓别人流量是违法的。
一句话总结
tcpdump = 命令行里给网络流量拍录像。会抓(-i -w)、会回放(-r)、会过滤(表达式)、会读那行从时间戳开始的输出,你就具备了在没有图形界面的服务器上排障和找异常的基本能力。深度分析再交给 Wireshark。