tcpdump 是网络领域最强大、最常用的命令行抓包分析工具,被誉为“网络分析师的瑞士军刀”。它允许用户捕获和显示发送到或来自与计算机相连的网络流量。

下面我将结合多个具体场景,为您提供详细的 tcpdump 命令示例。


场景一:基本抓包与初步分析

任务:查看当前主机上所有的网络流量,进行初步观察。

命令示例:

sudo tcpdump

输出示例:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:22:33.445678 IP 192.168.1.10.54321 > 192.168.1.1.53: 57864+ A? google.com. (28)
11:22:33.446789 IP 192.168.1.1.53 > 192.168.1.10.54321: 57864 1/0/0 A 172.217.164.110 (44)
11:22:33.447123 IP 192.168.1.10.44324 > 172.217.164.110.80: Flags [S], seq 123456789, win 64240, ...

说明

  • -i any:在所有网络接口上抓包。
  • 输出显示了时间戳、协议、源地址、源端口、目标地址、目标端口以及一些标志信息(如 [S] 表示 SYN 包,是 TCP 三次握手的开始)。

场景二:监控特定网络接口的流量

任务:服务器有多个网卡(如 eth0 处理公网流量,eth1 处理内网流量)。现在需要专门监控内网网卡 eth1 的流量。

命令示例:

sudo tcpdump -i eth1

场景三:过滤特定主机的流量

任务:只关注与某一特定 IP(例如 8.8.8.8)之间的所有通信。

命令示例:

sudo tcpdump -i any host 8.8.8.8

说明

  • host 8.8.8.8:过滤器,只捕获源或目标 IP 是 8.8.8.8 的包。

场景四:排查 Web 服务器问题(过滤端口)

任务:一台 Web 服务器(Nginx/Apache)响应缓慢,需要检查到达 80 端口的流量是否正常。

命令示例:

# 捕获目标端口是 80 的流量(即发送到本机Web服务的请求)
sudo tcpdump -i any -n dst port 80

# 捕获源端口是 80 的流量(即本机Web服务发出的响应)
sudo tcpdump -i any -n src port 80

# 捕获所有与80端口相关的流量(请求和响应)
sudo tcpdump -i any -n port 80

说明

  • dst port 80:目标端口是 80。
  • src port 80:源端口是 80。
  • port 80:只要端口是 80,不管方向。
  • -n:不将地址和端口号转换成名字(例如,显示 8.8.8.8 而不是 google.com,显示 80 而不是 http),让输出更清晰,提升抓包性能。

场景五:抓取 DNS 查询与响应

任务:调试一个应用程序,怀疑它的 DNS 解析有问题。

命令示例:

sudo tcpdump -i any -n port 53

输出示例:

11:25:44.123456 IP 192.168.1.100.44123 > 8.8.8.8.53: 4628+ A? www.github.com. (32)
11:25:44.145789 IP 8.8.8.8.53 > 192.168.1.100.44123: 4628 A 140.82.121.4 A 140.82.121.3 (59)

说明

  • port 53:DNS 服务使用的端口。
  • 第一行是查询 (A?) www.github.com
  • 第二行是响应,返回了 IP 地址 140.82.121.4140.82.121.3

场景六:捕获并保存数据包以供后续分析

任务:问题难以重现,需要长时间抓包,并将原始数据保存下来,方便后用 Wireshark 等图形化工具进行深入分析。

命令示例:

# 捕获1000个包后自动停止,并保存到文件 packet_capture.pcap
sudo tcpdump -i any -c 1000 -w packet_capture.pcap

# 捕获指定端口(80)的流量并保存
sudo tcpdump -i any port 80 -w http_capture.pcap

# 捕获10MB数据后旋转(rotate)到新文件,最多保留5个文件(用于长时间抓包)
sudo tcpdump -i any -C 10 -W 5 -w long_term_capture.pcap

说明

  • -w <filename>:将原始数据包写入文件,而不是打印到屏幕。
  • -c <count>:捕获指定数量的包后退出。
  • -C <size>:在将原始数据写入文件之前,检查文件大小是否超过 size 兆字节。
  • -W <num>:与 -C 选项配合使用,限制最多生成的文件数量。

分析保存的文件
使用 tcpdump 读取:

tcpdump -r http_capture.pcap

或者,更推荐使用 Wireshark 图形界面打开 http_capture.pcap 进行分析,功能更强大。


场景七:高级过滤 - 组合条件

任务:只捕获来自主机 192.168.1.5 且目标端口不是 22 (SSH) 的流量。

命令示例:

sudo tcpdump -i any src host 192.168.1.5 and not dst port 22

说明

  • 可以使用 and (与)、or (或)、not (非) 来组合复杂的过滤条件。
  • 常见的过滤器:
  • net 192.168.1.0/24:过滤整个网段。
  • tcp:仅 TCP 流量。
  • udp:仅 UDP 流量。
  • icmp:仅 ICMP (ping) 流量。
  • tcp[13] & 2 != 0:过滤所有 SYN 包(高级位操作过滤)。

场景八:详细查看数据包内容

任务:不仅想看包头,还想查看包内的实际数据(例如,查看 HTTP 请求内容)。

命令示例:

# -X 以十六进制和ASCII码形式打印数据
# -A 以ASCII码形式打印数据(适合查看文本协议)
sudo tcpdump -i any -A port 80

输出示例(部分)

... GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/7.68.0
Accept: */*
...

说明:这对于调试 HTTP API、SMTP、FTP 等明文协议非常有用。注意:切勿在生产环境用此方法捕获可能包含密码等敏感信息的流量。


总结:常用选项速查表

选项

说明

-i <interface>

指定网络接口(如 eth0, any

-n

不解析主机名(显示 IP)

-nn

不解析主机名和端口号(显示 IP 和端口数字)

-c <num>

捕获指定数量的包后退出

-w <file>

将原始数据包写入文件

-r <file>

从文件读取数据包

-A

以 ASCII 格式打印每个数据包

-X

以十六进制和 ASCII 格式打印每个数据包

-v, -vv, -vvv

增加输出的详细程度

port <num>

过滤特定端口

host <ip>

过滤特定主机

src / dst

过滤源或目标(如 src host 1.1.1.1

and / or / not

组合过滤条件

最重要的建议:结合 -w 选项将流量保存为 .pcap 文件,然后在 Wireshark 中加载分析,这是最有效率的工作流程。tcpdump 用于捕获和简单过滤,Wireshark 用于深度分析。