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)'