Tcpdump命令指南:Linux网络抓包分析工具
1. 简介
tcpdump是一个运行在命令行下的网络抓包工具。它可以截获和分析网络数据包,是网络故障排查、安全分析、性能优化的重要工具。
主要功能
- 实时抓取网络数据包
- 分析网络协议
- 过滤特定类型的网络流量
- 保存抓包数据供后续分析
- 解码各种网络协议
2. 基本用法
基本抓包命令
# 监听所有网络接口
tcpdump -i any
# 监听特定接口
tcpdump -i eth0
# 显示详细信息
tcpdump -v
# 显示更详细的信息
tcpdump -vv
# 显示最详细的信息
tcpdump -vvv
# 显示十六进制和ASCII格式
tcpdump -X
保存和读取抓包文件
# 保存抓包数据到文件
tcpdump -w capture.pcap
# 从文件读取抓包数据
tcpdump -r capture.pcap
# 限制抓包数量
tcpdump -c 100
# 不解析主机名
tcpdump -n
3. 过滤规则
主机过滤
# 指定源主机
tcpdump src host 192.168.1.1
# 指定目标主机
tcpdump dst host 192.168.1.2
# 指定主机(源或目标)
tcpdump host 192.168.1.1
# 排除特定主机
tcpdump not host 192.168.1.1
端口过滤
# 指定源端口
tcpdump src port 80
# 指定目标端口
tcpdump dst port 443
# 指定端口范围
tcpdump portrange 21-23
# 指定多个端口
tcpdump port 80 or port 443
协议过滤
# 只抓取TCP包
tcpdump tcp
# 只抓取UDP包
tcpdump udp
# 只抓取ICMP包
tcpdump icmp
# 组合过滤
tcpdump 'tcp and port 80'
4. 协议分析
TCP协议分析
# 抓取TCP SYN包
tcpdump 'tcp[tcpflags] & (tcp-syn) != 0'
# 抓取TCP FIN包
tcpdump 'tcp[tcpflags] & (tcp-fin) != 0'
# 抓取TCP RST包
tcpdump 'tcp[tcpflags] & (tcp-rst) != 0'
# 抓取TCP标志组合
tcpdump 'tcp[tcpflags] == tcp-syn|tcp-ack'
HTTP协议分析
# 抓取HTTP GET请求
tcpdump -s 0 -A 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
# 抓取HTTP POST请求
tcpdump -s 0 -A 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354'
# 显示HTTP头部
tcpdump -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
5. 高级特性
数据包大小过滤
# 抓取大于100字节的包
tcpdump 'len > 100'
# 抓取小于60字节的包
tcpdump 'len < 60'
# 抓取特定范围的包
tcpdump 'len >= 50 and len <= 100'
复杂表达式
# 使用and/or/not组合条件
tcpdump 'host 192.168.1.1 and (port 80 or port 443)'
# 使用括号分组
tcpdump '(tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420) or (tcp port 443)'
6. 最佳实践
性能优化
- 使用-n选项避免DNS解析,提高性能
- 使用-c选项限制抓包数量,避免文件过大
- 使用精确的过滤表达式减少系统负载
- 适当设置抓包大小(-s选项),避免抓取无用数据
安全建议
- 避免在生产环境长时间运行tcpdump
- 注意保护抓包文件,可能包含敏感信息
- 使用-Z选项降低权限,提高安全性
- 定期清理抓包文件,避免占用磁盘空间
7. 常见问题排查
网络连接问题
# 检查TCP连接建立
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
# 检查网络延迟
tcpdump -ttt
# 检查丢包情况
tcpdump 'tcp[tcpflags] & (tcp-rst) != 0'
应用层问题
# HTTP响应码分析
tcpdump -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | grep 'HTTP/'
# DNS查询分析
tcpdump -n 'udp port 53'
# SSL/TLS握手分析
tcpdump 'tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)'