tcpdump
是一款强大的网络数据包捕获和分析工具,常用于网络故障排查、协议分析、安全审计等场景。以下是其核心功能、使用方法及常见场景的详细介绍:
1. 基本功能
-
数据包捕获:监听网络接口,实时捕获传输的数据包。
-
过滤规则:基于协议、IP 地址、端口号等条件精确筛选数据包。
-
输出格式:支持多种输出格式(ASCII、十六进制),可保存到文件。
-
协议支持 :几乎支持所有网络协议(TCP、UDP、ICMP、HTTP 等)
2. 常用命令参数
bash
tcpdump [选项] [过滤表达式]
选项 功能 示例 -i <接口>
指定监听的网络接口(如 eth0
,wlan0
),-i any
表示所有接口。tcpdump -i eth0:监听以太网接口 eth0
的数据包;tcpdump -i any
:监听所有网络接口的数据包。-n
不解析 IP 地址和端口号的域名,直接显示数字(提升性能)。 tcpdump -n
:在输出中,IP 地址和端口号以数字形式显示,例如192.168.1.1:80
而非example.com:http
。-nn
同时不解析域名和端口名(如 80
而非http
)。tcpdump -nn
:输出中不仅 IP 地址以数字显示,端口也以数字形式呈现,如tcp dst port 80
显示为具体数字80
,而不是http
。-s <字节数>
设置捕获数据包的最大长度, -s 0
表示捕获完整数据包。tcpdump -s 68:每个数据包最多捕获 68 字节; tcpdump -s 0
:尝试捕获每个数据包的全部内容。-c <数量>
捕获指定数量的数据包后停止。 tcpdump -c 10
:捕获 10 个数据包后,tcpdump
工具停止运行。-w <文件名>
将数据包保存到文件( .pcap
格式)。tcpdump -w capture.pcap
:将捕获的数据包保存到名为capture.pcap
的文件中,后续可使用tcpdump -r
或其他工具(如 Wireshark)进行分析。-r <文件名>
从文件中读取数据包进行分析。 tcpdump -r saved_traffic.pcap
:读取名为saved_traffic.pcap
的文件,并对其中的数据包进行分析和显示。-X
以 ASCII 和十六进制形式显示数据包内容(适合分析协议细节)。 tcpdump -X
:在输出中,除了显示数据包的协议信息外,还会展示数据包的 ASCII 和十六进制内容,帮助分析协议数据,如 HTTP 头部信息等。-vvv
显示详细的协议信息(如 TCP 标志位、TTL 值)。 tcpdump -vvv
:输出中会包含更详细的协议信息,如 TCP 连接的标志位(SYN、ACK、FIN 等)、IP 数据包的生存时间(TTL)值等,便于深入分析网络连接状态。|-------------------|-----|----------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------|
| `--direction={in | out | inout}` | 只捕获入站、出站或所有方向的数据包。 |tcpdump --direction=in
:仅捕获进入指定网络接口的数据包;tcpdump --direction=out
:仅捕获从指定网络接口发出的数据包;tcpdump --direction=inout
:捕获进出指定网络接口的所有数据包。 |
3. 过滤表达式
过滤表达式用于精确筛选感兴趣的数据包,支持三种类型的限定词:
(1) 类型限定词
类型 | 示例 | 说明 |
---|---|---|
host |
host 192.168.1.1 |
过滤指定主机的数据包。 |
net |
net 192.168.1.0/24 |
过滤指定网络段的数据包。 |
port |
port 80 |
过滤指定端口的数据包。 |
portrange |
portrange 8000-8100 |
过滤指定端口范围的数据包。 |
(2) 方向限定词
方向 | 示例 | 说明 |
---|---|---|
src |
src 192.168.1.1 |
过滤源地址为指定值的数据包。 |
dst |
dst port 443 |
过滤目标端口为指定值的数据包。 |
(3) 协议限定词
协议 | 示例 | 说明 |
---|---|---|
tcp |
tcp and port 80 |
过滤 TCP 协议且端口为 80 的数据包。 |
udp |
udp src port 53 |
过滤 UDP 协议且源端口为 53 的数据包。 |
icmp |
icmp |
过滤 ICMP 协议的数据包(如 ping 请求)。 |
4. 常见使用场景
(1) 监控特定主机的 HTTP 流量
bash
tcpdump -i eth0 -nn -s 0 'host 192.168.1.100 and (port 80 or port 443)'
- 说明 :监听
eth0
接口,捕获与192.168.1.100
主机的 HTTP/HTTPS 通信。
(2) 捕获 DNS 查询请求
bash
tcpdump -i any -nn -s 0 'udp port 53'
- 说明:捕获所有接口上的 UDP 53 端口(DNS)流量。
(3) 保存数据包到文件
bash
tcpdump -i wlan0 -w wifi_traffic.pcap
- 说明 :将
wlan0
接口的所有流量保存到wifi_traffic.pcap
文件。
(4) 分析 TCP 连接建立过程(三次握手)
bash
tcpdump -i eth0 -nn -vvv -s 0 'tcp port 80 and host 192.168.1.1'
- 说明 :详细显示与
192.168.1.1
的 TCP 80 端口通信过程(SYN、SYN+ACK、ACK)。
(5) 统计特定 IP 的流量
bash
tcpdump -i eth0 -nn 'host 192.168.1.5' | wc -l
- 说明 :统计与
192.168.1.5
通信的数据包数量。
5. 高级技巧
(1) 组合过滤条件
使用逻辑运算符组合多个条件:
bash
# 捕获源IP为192.168.1.1且目标端口不是22的TCP数据包
tcpdump -i eth0 'src 192.168.1.1 and tcp and not dst port 22'
(2) 实时分析 HTTP 请求内容
bash
tcpdump -i eth0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
- 说明 :
-A
选项以 ASCII 显示数据包内容,过滤条件确保只显示包含数据的 HTTP 包。
(3) 按时间范围捕获
bash
# 捕获10分钟内的数据包
tcpdump -i eth0 -w capture.pcap -G 600 -W 1
- 说明 :
-G 600
每 10 分钟(600 秒)生成一个新文件,-W 1
只保留最新的 1 个文件。
(4) 与 Wireshark 协同
将 tcpdump 捕获的文件用 Wireshark 打开进行可视化分析:
bash
# 捕获并保存到文件
tcpdump -i eth0 -w analysis.pcap
# 用Wireshark打开(需预先安装)
wireshark analysis.pcap &
6. 注意事项
-
权限要求 :需要 root 权限才能捕获网络数据包。
-
性能影响 :长时间捕获可能占用大量磁盘空间或系统资源。
-
若需要抓取本地进程发送的UDP包数据,可指定lo 接口(本地回环接口)tcpdump -i lo udp
-
隐私问题:捕获的数据包可能包含敏感信息(如密码、会话 ID)。
-
大文件处理 :对于大型 pcap 文件,可使用
editcap
分割或过滤:bash
# 提取包含特定IP的数据包到新文件 editcap -F pcap -i 'ip.addr == 192.168.1.1' input.pcap output.pcap