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)。听起来贴心,实际上有两个坑:

  1. 不准 —— 端口 80 不一定真在跑 HTTP,显示成 http 会误导你。
  2. 会打草惊蛇 —— 名字解析靠反向 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