linux 抓包工具tcpdump使用小记(使用时注意权限和系统资源)
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