tcpdump无法直接过滤http post请求,因不解析http语义;推荐用-a输出ascii流后grep "^post "筛选,或保存pcap用wireshark深度分析。

Linux中用tcpdump过滤HTTP POST请求,不能靠字符串直接匹配,因为tcpdump本身不解析HTTP语义,只能基于TCP载荷偏移做十六进制匹配——但这种方式易受TCP选项长度影响,可靠性低。更实用的做法是:先精准捕获HTTP流量,再结合ASCII输出与关键词定位,或保存后用Wireshark深度分析。
用TCP偏移匹配POST方法(基础但需谨慎)
HTTP请求行(如POST /api/login HTTP/1.1)通常位于TCP载荷起始位置,可用BPF表达式匹配其ASCII码0x504f5354(即"POST"四字节)。命令如下:
- sudo tcpdump -i eth0 -A -s0 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
- 其中tcp[12:1]读取TCP首部长度字段,((tcp[12:1] & 0xf0) >> 2)算出TCP数据起始偏移,再取后续4字节比对
- 该方式仅适用于标准TCP首部(无选项或固定选项长度),实际中可能漏包
推荐方案:抓全量HTTP + grep过滤(稳定易用)
绕过复杂偏移计算,用-A输出ASCII流,管道给grep筛选含"POST "的行,同时排除空ACK干扰:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- sudo tcpdump -i eth0 -s0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)>2)) != 0)' | grep --line-buffered -i '^post '
- --line-buffered确保实时输出不卡顿
- ^post 匹配行首POST(避免误中URL或响应体里的单词)
- 若要同时看完整请求(含Host、Content-Length等头),保留-A输出,不加grep,人工扫屏更可靠
抓HTTPS POST?基本不可行
HTTPS流量在TLS层加密,tcpdump看到的是密文记录,无法识别POST或任何HTTP字段:
- 端口443上的流量,即使加-A也只显示乱码或TLS握手信息
- 想分析HTTPS POST,必须在服务端启用明文日志(如Nginx的$request_body)、用eBPF工具(如bpftrace)或部署SSL解密代理
- 生产环境切勿尝试中间人解密,违反安全策略
后续分析建议:保存pcap + Wireshark追踪流
单纯命令行难看清POST body内容(尤其分片、gzip压缩时),稳妥做法是:
- 先保存原始包:sudo tcpdump -i eth0 -s0 -w post_debug.pcap 'tcp port 80'
- 用Wireshark打开 → 过滤http.request.method == "POST" → 右键某POST包选【Follow → TCP Stream】→ 自动重组并高亮显示完整请求与body
- 支持查看编码、JSON格式、文件上传等细节,远超tcpdump能力










