tcpdump可解析明文应用层载荷但默认截断,需-s0捕获完整数据,用-a/-x查看http/dns等明文,而https等加密流量仅显示密文。

tcpdump 能解析应用层载荷,但默认不显示完整内容,也不自动解码加密或自定义协议——关键在于捕获时保留足够长度,并结合输出格式与过滤条件手动提取。
确保捕获完整应用层数据
默认 tcpdump 只截取前 262144 字节(不同版本可能为 65535),对大 HTTP 响应、JSON 或文件传输容易截断。必须显式指定 -s 0 才能获取完整载荷:
-
sudo tcpdump -i eth0 -s 0 port 80 -w http-full.pcap—— 保存完整 HTTP 流量供后续分析 -
sudo tcpdump -i lo -s 0 -A port 5000—— 实时以 ASCII 显示本地开发服务的明文请求
用 -A 或 -X 查看明文载荷
HTTP、DNS 查询、SMTP、Redis 等明文协议可直接读取。-A 输出纯 ASCII(适合快速扫视),-X 同时显示十六进制+ASCII(便于定位字段边界):
-
sudo tcpdump -nn -A 'tcp port 80 and host 192.168.1.100'—— 过滤某服务器的 HTTP 文本流,看到 GET/POST 行、Host、User-Agent、响应状态行等 -
sudo tcpdump -nn -X 'udp port 53'—— DNS 查询通常可见域名(如 www.example.com)和返回的 A 记录 IP
过滤后聚焦特定协议交互
避免海量杂包干扰,用 BPF 表达式精准定位目标流量:
- 只抓 HTTP 请求头:
sudo tcpdump -nn -A 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'(匹配 "GET " 四字节) - 抓含特定关键词的响应:
sudo tcpdump -nn -A 'tcp port 80' | grep -i -A 2 -B 2 "login\|error"(配合管道辅助筛选) - 分离客户端与服务端载荷:
sudo tcpdump -nn -A 'tcp port 80 and src host 10.0.2.15'(仅看客户端发了什么)
注意加密与二进制协议的限制
HTTPS(TLS)、gRPC、MQTT over TLS 等加密流量,tcpdump 只能看到密文载荷(Client Hello 等握手信息除外)。此时 -X 输出是乱码,无法还原原始业务数据:
- 可识别 TLS 版本、SNI 域名(在 Client Hello 的扩展字段中,需 -X + 手动查偏移)
- 对 protobuf、Avro 等二进制序列化协议,需额外工具(如 protoc --decode_raw)或源码映射,tcpdump 本身不解析结构
- 若需解密 HTTPS,须配合 SSLKEYLOGFILE + Wireshark;tcpdump 仅负责抓包,不解密











