用tcpdump抓HTTP流量的核心是抓得准、看得清:抓指定端口(如80/443)需加-NN和-s0确保高效完整;实时查看用-A,保存分析用-w;结合host、TCP偏移十六进制匹配可精准过滤GET/POST等行为,并推荐Wireshark后续深度分析。

用 tcpdump 抓 HTTP 流量,核心目标就两个:抓得准、看得清。关键不在命令多复杂,而在过滤条件和输出方式是否匹配排查场景——比如是查连接失败、响应异常,还是直接读请求体。
抓指定端口的 HTTP 流量(最常用)
HTTP 默认走 80 端口,HTTPS 走 443。基础命令要带 -nn(跳过 DNS 和端口解析,快且干净)、-s0(捕获完整包,避免截断 JSON 或表单数据):
- 实时查看明文 HTTP 请求/响应:
sudo tcpdump -i eth0 -A -s0 port 80 - 只保存原始数据供后续分析(推荐用于生产环境):
sudo tcpdump -i eth0 -w http.pcap -s0 port 80
抓完用 Wireshark 打开,可按 HTTP 过滤、追踪 TCP 流、查看完整请求与响应。 - 若不确定网卡名,先运行 ip addr 查看活跃接口;服务器上慎用 -i any,容易混入回环或管理网流量。
精准过滤特定 HTTP 行为
光抓 80 端口可能噪音太多。加过滤表达式能直击问题:
- 只看某个 IP 的通信:
sudo tcpdump -i eth0 -A -s0 'host 192.168.1.100 and port 80' - 只抓 GET 或 POST(需十六进制匹配):
sudo tcpdump -i eth0 -A -s0 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
(0x47455420 是 "GET ",0x504f5354 是 "POST") - 排除空 ACK 包(让输出更干净):
sudo tcpdump -i eth0 -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)>2)) != 0)'
看清 HTTP 内容的关键细节
用 -A 能看到 ASCII 文本,但要注意:
- HTTP 头部一定可见,但响应体是否完整取决于包长和分片情况。大文件或压缩响应(如 gzip)会显示乱码,此时应保存 pcap 用 Wireshark 重组流或解压。
- HTTPS 流量用 port 443 只能看到加密载荷,无法读明文内容——这是 TLS 设计使然,不是 tcpdump 问题。
- 若发现请求发了但没响应,先看 TCP 三次握手是否完成(SYN → SYN-ACK → ACK),再查是否有 RST 包或超时重传,这比盯着 HTTP 字符串更有诊断价值。
替代工具补充(简单场景更快)
如果只要快速扫一眼 HTTP 方法和路径,这些工具更轻量:
-
ngrep(像 grep 一样搜网络流):
sudo ngrep -d eth0 -W byline 'GET|POST' port 80 -
httpry(专为 HTTP 设计,输出结构化):
sudo httpry -i eth0,自动提取 Host、Method、Path、Status 等字段。 -
tcpflow(按会话还原完整请求+响应):
sudo tcpflow -i eth0 -C port 80,终端里直接看到成对的请求与响应文本。

















