核心思路是抓包+过滤+可读化输出:用sudo tcpdump -i any -nn -A -s 0 'tcp port 80 and (((ip[2:2]-((ip[0]&0xf)<<2))-((tcp[12]&0xf0)>>2))!=0)' | grep -E '^(GET|POST|HEAD|PUT|DELETE) |^Host:|^User-Agent:|^Content-Type:|^Accept:|^HTTP/'实时显示明文HTTP请求头与关键响应行。

直接用 tcpdump 实时分析 HTTP 请求头,核心思路是:抓包 + 过滤 + 可读化输出。不需要保存文件、不依赖 Wireshark,一条命令就能在终端里看到清晰的请求行和 Header。
✅ 抓取并实时显示 HTTP 请求头(明文,80 端口)
sudo tcpdump -i any -nn -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | grep -E '^(GET|POST|HEAD|PUT|DELETE) |^Host:|^User-Agent:|^Content-Type:|^Accept:|^HTTP/'
说明:
-
-i any:监听所有网卡(生产环境建议换成具体网卡如eth0或lo) -
-nn:不解析 IP 和端口名,避免延迟,显示更准 -
-A:以 ASCII 方式打印载荷,可读性强 -
-s 0:捕获完整包,防止 HTTP 头被截断 - BPF 表达式
'tcp port 80 and ...':精准过滤出含应用层数据的 TCP 包(排除纯 ACK/SYN),比简单port 80更可靠 -
grep -E:只提取关键行,快速定位请求方法、Host、常见 Header 和响应状态行
? 小技巧:如果只想看请求(不含响应),可加
and tcp[tcpflags] & tcp-push != 0进一步缩小范围;若服务跑在 8080/3000 等端口,把port 80换成对应数字即可。
✅ 快速定位某次 GET 请求的完整头信息(带时间戳)
sudo tcpdump -tttt -nn -A -s 0 -i eth0 'tcp port 80' | grep -A 10 -B 2 'GET /'
-
-tttt:输出完整时间戳(年-月-日 时:分:秒.微秒),便于关联日志 -
grep -A 10 -B 2:匹配到GET /后,往前 2 行、往后 10 行一起显示,基本覆盖整个请求头
✅ 抓 HTTPS?注意:无法直接看明文 Header
HTTPS 流量加密,tcpdump 只能看到 TLS 握手和密文载荷,无法解密请求头(除非你有私钥并在 Wireshark 中配置)。
但你可以:
- 用
tcp port 443看连接是否建立成功、有无重传或超时 - 结合
curl -v或应用层日志辅助判断 - 若需分析 HTTPS 内容,应改用中间人代理(如 mitmproxy)或服务端开启 access log
✅ 补充:如何确认抓到了“有效 HTTP 头”
一个合法的 HTTP 请求头通常满足:
- 第一行是
METHOD PATH HTTP/1.x(如GET /api/user HTTP/1.1) - 后续行是
Key: Value格式,以空行结束 - 常见字段包括
Host:、User-Agent:、Authorization:、Content-Length:等
如果你看到一堆乱码或只有 ..U... 类十六进制字符,大概率是:
-
-s值太小(没加-s 0)导致载荷被截断 - 抓的是 HTTPS 或非 HTTP 协议流量
- 数据包本身不包含完整 Header(比如被 TCP 分片,而
tcpdump默认不重组)
不复杂但容易忽略


















