如何使用tcpdump过滤IPv6数据包中的HTTP请求方法
如何使用tcpdump过滤IPv6数据包中的HTTP请求方法
我明白你的痛点——之前在IPv4环境里用tcpdump的tcp[]偏移过滤HTTP GET很顺手,但到了IPv6就失效了,而且你不想用grep中转,希望直接把过滤后的流量存成pcap文件对吧?
问题出在IPv6的报文结构上,tcpdump里的tcp[N]这类针对传输层头部的算术表达式对IPv6数据包不生效,因为IPv6可能包含扩展头部,导致TCP头部的位置无法像IPv4那样直接通过tcp[]准确定位。
不过我们可以换个思路,直接基于IPv6基本头部的固定长度来计算HTTP请求内容的起始位置,下面这个命令就能直接过滤IPv6里的HTTP GET请求并保存到pcap文件:
tcpdump -s 0 -A -w output.pcap 'ip6 and tcp port 80 and ip6[40 + ((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
我来拆解一下这个命令的关键部分:
-s 0:捕获完整的数据包,避免截断HTTP请求内容-A:以ASCII格式显示数据包内容(如果不需要实时查看,只存pcap的话可以去掉这个参数)-w output.pcap:将过滤后的流量直接写入指定的pcap文件,无需额外工具中转ip6 and tcp port 80:先限定只处理IPv6的HTTP默认端口流量,缩小过滤范围,提升效率ip6[40 + ((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420:核心过滤逻辑- IPv6的基本头部固定为40字节,所以TCP头部从第40字节开始
(tcp[12:1] & 0xf0) >> 2:和IPv4的逻辑一致,计算TCP头部的实际长度(TCP头部第13字节的高4位表示头部长度,单位是4字节,右移2位转成字节数)- 两者相加就是HTTP请求内容的起始位置,取前4字节与
0x47455420(对应ASCII的GET)匹配,精准过滤GET请求
如果需要过滤其他HTTP方法,只需要替换对应的十六进制匹配值即可:
- POST请求:匹配
0x504f535420(对应ASCII的POST),需要把匹配长度改成5字节,命令调整为:tcpdump -s 0 -A -w output_post.pcap 'ip6 and tcp port 80 and ip6[40 + ((tcp[12:1] & 0xf0) >> 2):5] = 0x504f535420' - PUT请求:匹配
0x50555420(对应ASCII的PUT),匹配长度4字节,参考GET的命令修改值即可
这个方法完全在tcpdump层面完成过滤,不需要借助grep等外部工具,直接输出符合条件的流量到pcap文件,正好满足你的需求。
备注:内容来源于stack exchange,提问作者Sagi313
相关产品推荐
相关产品推荐

