核心命令:tcpdump
tcpdump 是一个在类 Unix 系统(如 Linux, macOS)上广泛使用的命令行网络分析工具,它可以抓取经过指定网络接口的数据包,并根据用户定义的复杂条件进行过滤。

基本语法
tcpdump [选项] [过滤器表达式]
常用选项
| 选项 | 描述 |
|---|---|
-i <接口> |
指定抓包的网络接口,如 eth0, wlan0,如果不指定,通常会抓取第一个非回环接口。 |
-n |
不将IP地址解析为域名(强烈推荐),可以加快抓包速度并避免DNS查询带来的额外流量。 |
-nn |
不将IP和端口解析为名称(80 不解析为 http),这是最常用的选项之一,因为它最快且结果最干净。 |
-A |
以ASCII格式打印数据包的负载,方便查看HTTP、FTP等明文协议的内容。 |
-X |
同时以十六进制和ASCII格式打印数据包的负载,非常详细。 |
-w <文件> |
将抓包结果直接写入文件,而不是打印在屏幕上,文件格式是pcap,可以用 Wireshark 等工具打开分析。 |
-r <文件> |
从一个pcap文件中读取数据包进行查看,而不是实时抓包。 |
-c <数量> |
抓取指定数量的数据包后自动退出。 |
-s <snaplen> |
设置抓包的snap长度(即每个数据包抓取的字节数)。-s0 或 --snaplen 65535 表示抓取完整数据包(推荐)。 |
-v, -vv, -vvv |
显示更详细的信息,-vvv 最详细。 |
-e |
在输出中显示数据链路层的头部信息(如以太网帧头)。 |
强大的过滤器表达式
过滤器的语法非常灵活,可以根据协议、IP地址、端口、网络范围等进行组合。
a. 按协议过滤
tcp: 只抓取TCP数据包。udp: 只抓取UDP数据包。icmp: 只抓取ICMP数据包(如ping命令)。arp: 只抓取ARP数据包。http,https,dns,ftp: 直接抓取特定应用层协议的流量(tcpdump会自动识别端口)。
示例:
# 只抓取TCP数据包 tcpdump -i eth0 -nn tcp # 只抓取HTTP流量 tcpdump -i eth0 -nn http
b. 按IP地址和端口过滤
host <IP地址>: 只抓取与指定主机通信的数据包。src <IP地址>: 只抓取源地址为指定IP的数据包。dst <IP地址>: 只抓取目标地址为指定IP的数据包。port <端口号>: 只抓取通过指定端口的数据包。src port <端口号>: 只抓取源端口为指定端口号的数据包。dst port <端口号>: 只抓取目标端口为指定端口号的数据包。
示例:
# 只抓取与 192.168.1.100 之间的所有流量 tcpdump -i eth0 -nn host 192.168.1.100 # 只抓取从本机发送到 192.168.1.100 的HTTP流量 tcpdump -i eth0 -nn src host 192.168.1.100 and dst port 80 # 只抓取访问本机8080端口的流量 tcpdump -i eth0 -nn dst port 8080
c. 按网络范围过滤
net <网络地址>: 只抓取与指定网络通信的数据包。net <网络地址>/<子网掩码>: 使用CIDR表示法。
示例:

# 只抓取与 192.168.1.0/24 网络的通信 tcpdump -i eth0 -nn net 192.168.1.0/24
d. 逻辑组合
and: 逻辑与。or: 逻辑或。not或 : 逻辑非。
示例:
# 抓取所有非ICMP的流量 tcpdump -i eth0 -nn not icmp # 抓取访问 192.168.1.100 的80端口或443端口的流量 tcpdump -i eth0 -nn host 192.168.1.100 and \( port 80 or port 443 \) # 注意:括号在shell中有特殊含义,通常需要用反斜杠 \ 转义
e. 抓取TCP三次握手/挥手
这是非常实用的场景,用于调试连接问题。
# 抓取TCP标志位为SYN(三次握手的第一次)的包 tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0' # 抓取TCP标志位为SYN+ACK(三次握手的第二次)的包 tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)' # 抓取TCP标志位为FIN(挥手开始)的包 tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-fin) != 0'
实战示例
场景1:快速查看当前网络活动
# 抓取前10个非回环接口的包,不解析IP和端口 sudo tcpdump -i eth0 -nn -c 10
场景2:保存抓包到文件,以便用Wireshark分析
# 抓取与 8.8.8.8 的所有流量,保存为 full.pcap sudo tcpdump -i eth0 -nn -s0 -w full.pcap host 8.8.8.8
场景3:实时查看一个Web服务器的HTTP请求
# 假设Web服务器运行在8080端口 sudo tcpdump -i eth0 -A -nn 'dst port 8080'
你会看到类似 GET /index.html HTTP/1.1 这样的请求内容。
场景4:排查DNS解析问题
# 只抓取DNS查询和响应 sudo tcpdump -i eth0 -nn port 53
其他相关工具
除了 tcpdump,还有一些其他工具也用于网络数据抓取和分析。
Wireshark (图形界面)
- 简介: 网络协议分析器的“黄金标准”,它有一个强大的图形界面,可以方便地过滤、解码和可视化数据包。
- 使用: 在终端输入
wireshark即可启动,它底层也使用tcpdump的技术,但交互性更强。 - 适用场景: 深度分析复杂的网络问题、教学、协议研究。
tshark (命令行)
- 简介: Wireshark的命令行版本,功能与Wireshark图形界面几乎一样,但通过命令行操作。
- 优点: 可以集成到脚本中,适合自动化和远程分析。
- 示例:
# 类似 tcpdump,但功能更强大 tshark -i eth0 -Y "http" -T fields -e ip.src -e http.request.uri
ngrep (网络grep)
- 简介:
grep命令在网络数据包上的应用,它可以对数据包的负载内容进行正则表达式匹配。 - 适用场景: 快速搜索特定字符串(如密码、API密钥)在网络传输中的情况。
- 示例:
# 在eth0上抓取包含 "password=" 字符串的流量 sudo ngrep -d eth0 'password='
snoop (Solaris系统)
- 简介: 在 Solaris 系统上,
snoop是tcpdump的替代品,功能和用法类似。
总结与建议
| 工具 | 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
tcpdump |
命令行 | 安装普遍、轻量级、性能高、功能强大 | 学习曲线较陡峭,输出可读性不如图形界面 | 快速检查、服务器诊断、自动化脚本 |
| Wireshark | 图形界面 | 功能最全、可视化好、易于使用 | 需要安装GUI、消耗资源多 | 深度分析、教学、复杂问题排查 |
tshark |
命令行 | 功能与Wireshark相同,适合脚本 | 较tcpdump更复杂 |
自动化、批量分析、服务器环境 |
ngrep |
命令行 | 专门用于内容匹配,使用简单 | 功能相对单一 | 快速搜索关键字 |
给新手的建议:
- 从
tcpdump -i eth0 -nn开始,先看看网络上都在发生什么。 - 使用
-w选项将数据保存下来,然后用 Wireshark 打开分析,这样既能抓包又能直观地看。 - 熟悉
host,port,tcp,udp这几个最基本的过滤器,它们能解决80%的问题。 - 使用
sudo运行,因为抓包需要管理员权限。
