目录
4.7 案例 7:实时提取 HTTP POST 表单中的密码字段
4.8 案例 8:HTTPS请求间歇性失败(证书链不完整)
tcpdump 是一款开源的命令行网络数据包捕获与分析工具,广泛应用于网络故障诊断、性能优化和安全审计。
1. 核心功能与特性
- 实时抓包
基于 libpcap 库直接监听网卡流量,支持实时捕获和解析网络数据包,输出可读性强的文本信息。 - 灵活过滤
支持表达式语法,可按协议(如tcp
/udp
)、IP 地址(src
/dst
)、端口(port
)、协议标志位等精准过滤数据包。 - 跨平台兼容
原生支持类 Unix 系统(Linux、BSD 等),Windows 可通过 WinDump(需 WinPcap 驱动)实现同等功能。 - 数据导出与分析
支持将抓包数据保存为.pcap
格式文件,便于 Wireshark 等工具深度分析。
2. 关键参数速查表
参数 | 作用 | 示例 |
---|---|---|
-i | 指定监听网卡 | -i eth0 (监听 eth0 网卡) |
-c | 限制抓包数量,达到后自动停止抓包 | -c 10 (捕获 10 个包后停止) |
-C | 限制单个输出文件大小(单位 MB)。文件达上限后会创建新文件。 | -C 100 -W 5 -w traffic.pcap |
-w | 保存至文件 | -w traffic.pcap |
-r | 读取文件分析 | -r traffic.pcap |
-s | 设置抓包长度(-s 0 捕获完整数据包) | -s 64 (只抓前 64 字节) |
-n | 禁用域名解析,不禁用端口解析 | 显示原始 IP 而非域名 |
-nn | 禁用域名与端口解析 | 显示原始 IP 和端口号 |
-v / -vv / -vvv | 控制输出详细层级(逐级增强) |
|
-l | 字母 (如配合 | tcpdump -l | grep 'keyword' |
-X | 以十六进制+ASCII 码格式显示报文内容(含应用层数据) | 分析 HTTP 请求内容时使用。 |
-e | 显示数据链路层信息(如 MAC 地址、VLAN Tag) | 二层网络问题排查(如 ARP 欺骗分析)。 |
-A | 以 ASCII 格式显示数据(不显示链路层头部) | 快速查看文本协议(如 HTTP、FTP)。 |
--number | 为每个输出行添加序号。 | |
-Q | 捕获特定方向流量:in (入站)、out (出站)或 inout (双向)。 | |
-q | -q 强制使用数字端口号,确保输出准确,而且便于 awk 、grep 等工具处理 |
3. 基础命令
# 抓取所有网卡流量(Ctrl+C 停止)
tcpdump -i any
# 抓取特定网卡(eth0)流量
tcpdump -i eth0
# 抓包保存到文件(-w 写入,-r 读取)
tcpdump -i eth0 -w capture.pcap
# 读取分析
tcpdump -r capture.pcap
3.1 协议/端口过滤
tcpdump tcp # 只抓 TCP
tcpdump udp port 53 # DNS 流量
tcpdump icmp # Ping 包
tcpdump port 80 # HTTP 流量
tcpdump portrange 8000-8080 # 端口范围
3.2 IP 地址过滤
tcpdump host 192.168.1.100 # 进出该 IP 的流量
tcpdump src 10.0.0.1 # 来源 IP
tcpdump dst 172.16.0.5 # 目标 IP
tcpdump net 192.168.1.0/24 # 整个子网
3.3 高级逻辑组合
tcpdump 'tcp port 80 and (src 192.168.1.5 or dst 192.168.1.5)'
tcpdump 'icmp and not src 10.0.0.1' # 排除特定源
3.4 控制输出详细度
tcpdump -n # 禁用主机名解析(只显示 IP)
tcpdump -nn # 禁用端口解析(显示数字端口)
tcpdump -v # 增加详细度
tcpdump -vvv # 最高详细度(显示 TTL、校验和等)
3.5 解析包内容
tcpdump -A # ASCII 格式显示(HTTP 内容)
tcpdump -X # HEX+ASCII 格式(二进制协议)
tcpdump -XX # 更完整的 HEX 输出
3.6 特殊包过滤
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' # SYN/FIN 包
tcpdump 'tcp[13] & 4 != 0' # RST 包
tcpdump 'ip[8] < 10' # TTL < 10 的包(常用于 traceroute 检测)
3.7 限制抓包数量
tcpdump -c 1000 # 抓1000个包后停止
3.8 过滤特定大小包
tcpdump greater 1000 # 抓大于1000字节的包
tcpdump less 128 # 抓小于128字节的包
3.9 过滤提升性能
tcpdump 'ip and not net 192.168.0.0/24' # 排除内网流量
3.10 多网卡绑定
tcpdump -i eth0 -i eth1 # 同时抓两个网卡
3.11 高级组合命令
# 组合技:详细解析+不解析+大小限制+保存文件
tcpdump -i eth0 -vvv -nn -s0 -c 1000 -w mysql_traffic.pcap 'tcp port 3306'
# 实时过滤 MySQL 查询
tcpdump -i any -s0 -l -A 'tcp port 3306 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x03000000' | grep -B1 -i "SELECT\|UPDATE"
# 实时过滤经过服务器443端口的所有流量
tcpdump -i any -nn -vv -X -s 0 port 443 -w local_port_443.pcap
4. 实战案例汇总
4.1 案例 1:捕获 TCP 三次握手
场景:分析本地 HTTP 服务的连接建立过程。
命令:
tcpdump -i lo -n tcp port 8080 and 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
输出解析:
12:30:01.234 IP 127.0.0.1.12345 > 127.0.0.1.8080: Flags [S] # SYN 请求
12:30:01.235 IP 127.0.0.1.8080 > 127.0.0.1.12345: Flags [S.] # SYN-ACK 响应
12:30:01.236 IP 127.0.0.1.12345 > 127.0.0.1.8080: Flags [.] # ACK 确认
4.2 案例 2:监控特定主机流量
命令:
tcpdump -i eth0 host 192.168.1.100 and not port 22 # 过滤非 SSH 流量
用途:检查指定主机的网络活动,排除干扰流量。
4.3 案例 3:抓取 HTTP GET 请求
命令:
tcpdump -s0 -A -n 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' # 匹配 "GET "
说明:
通过检测 TCP 载荷中的 GET
关键字捕获 HTTP 请求内容,-A
参数以 ASCII 显示载荷。
4.4 案例 4:诊断 HTTP 500 错误
tcpdump -i eth0 -s0 -A 'tcp port 80 and host 192.168.1.100'
分析要点:
-
检查服务端是否返回
HTTP/1.1 500
-
查看请求头是否异常
-
观察 TCP 序列号确认请求/响应完整性
4.5 案例 5:定位 DNS 解析失败
tcpdump -i any -nn -s0 'udp port 53'
关键检查:
-
客户端是否发出 DNS 查询
-
DNS 服务器是否响应
-
响应是否包含
NXDOMAIN
(域名不存在)
4.6 案例 6:分析 TCP 连接超时
tcpdump -i eth0 'host 10.0.0.5 and tcp port 3306'
诊断步骤:
-
确认 SYN 包是否发出
-
是否收到 SYN-ACK
-
检查是否有重传(
[S]
标志重复出现) -
观察窗口大小(
win
值)是否过小
4.7 案例 7:实时提取 HTTP POST 表单中的密码字段
场景:
调试 Web 登录流程,确认密码是否明文传输。
sudo tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
输出示例:
POST /wp-login.php HTTP/1.1
Host: dev.example.com
log=admin&pwd=secret123&wp-submit=Log+In
关键分析:
- `-A`:以 ASCII 格式显示包内容。
- `-l`:行缓冲,保证实时输出。
- `egrep` 过滤出关键字段。
4.8 案例 8:HTTPS请求间歇性失败(证书链不完整)
现象:
用户反馈访问https://lmzf.example.com
时出现ERR_SSL_PROTOCOL_ERROR
,但浏览器控制台无明确错误信息。
抓包分析:
# 仅捕获SSL握手阶段
tcpdump -i eth0 -nn -s0 'port 443 and (tcp[20](@ref)& 0x17 = 0x02)' -w ssl_handshake.pcap
关键发现:
- 客户端发送
Client Hello
后,服务端未返回Server Hello
,直接断开连接。 - 使用Wireshark解析发现:服务端证书链缺少中间CA证书。
根因定位
服务端配置的SSL证书未包含完整的证书链(仅部署了叶子证书)。
解决方案
重新生成证书文件,包含完整的证书链。
4.9 案例 9:网络带宽异常占用(广播风暴)
现象
服务器出口带宽突然飙升至95%,但业务流量无明显增长。
抓包分析
# 按流量排序捕获大包
tcpdump -i eth0 -nn -q | head -1000 | awk '{print $3}' | sort | uniq -c | sort -nr
关键发现
- 90%流量来自
192.168.1.100
的ARP广播请求
(每秒6000+次) - 目标MAC为全零
ff:ff:ff:ff:ff:ff
根因定位
网络设备故障导致ARP表项丢失,触发大量广播请求。
解决方案
- 修复交换机ARP表同步问题
- 添加静态ARP绑定:
arp -s 192.168.1.100 00:11:22:33:44:55
5. 输出关键字段解析
18:30:28.123456 IP 192.168.8.100.58218 > 10.0.0.8.80: Flags [S], seq 392665715, win 29200, options [mss 1460,sackOK,TS val 12345 ecr 0,nop,wscale 7], length 0
-
时间戳:
18:30:28.123456
(精确到微秒) -
方向:
>
表示流量方向 -
Flags:
[S]
=SYN,[.]
=ACK,[P]
=PUSH,[F]
=FIN -
seq/ack:序列号/确认号(跟踪数据流关键)
-
win:窗口大小(流量控制指标)
-
length:数据载荷长度
6. 注意事项
6.1 权限要求
需使用 sudo 或 root 权限执行(因需访问网卡)。
6.2 过滤技巧
- 组合条件:and/or(如 port 80 or port 443)。
- 排除干扰:not(如 not arp)。
6.3 输出优化
- 添加 -tttt 显示完整时间戳。
- 使用 -l 使输出可实时管道传输(如 tcpdump -l | grep 'pattern')。