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.4和140.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 等明文协议非常有用。注意:切勿在生产环境用此方法捕获可能包含密码等敏感信息的流量。
总结:常用选项速查表
选项 | 说明 |
| 指定网络接口(如 |
| 不解析主机名(显示 IP) |
| 不解析主机名和端口号(显示 IP 和端口数字) |
| 捕获指定数量的包后退出 |
| 将原始数据包写入文件 |
| 从文件读取数据包 |
| 以 ASCII 格式打印每个数据包 |
| 以十六进制和 ASCII 格式打印每个数据包 |
| 增加输出的详细程度 |
| 过滤特定端口 |
| 过滤特定主机 |
| 过滤源或目标(如 |
| 组合过滤条件 |
最重要的建议:结合 -w 选项将流量保存为 .pcap 文件,然后在 Wireshark 中加载分析,这是最有效率的工作流程。tcpdump 用于捕获和简单过滤,Wireshark 用于深度分析。
















