Scapy嗅探器无法捕获带SYN/FIN标志的IPv6 TCP数据包问题
问题原因及解决方案
核心原因
你使用的过滤规则tcp[tcpflags] & (tcp-syn|tcp-fin) != 0基于libpcap过滤语法,默认仅适配IPv4数据包结构:
- 对于IPv4,libpcap会自动计算TCP头部相对于IPv4头部的偏移,所以
tcp[tcpflags]能准确定位到TCP标志位字段。 - 但IPv6数据包的TCP头部偏移位置与IPv4完全不同,libpcap不会自动为
tcp[tcpflags]适配IPv6结构,导致这条规则无法匹配到IPv6的TCP包,自然抓不到对应流量。
而单纯用tcp过滤时,libpcap会自动识别IPv4(通过proto字段)和IPv6(通过next header字段)中的TCP协议,因此能正常捕获两种协议的流量。
解决方法
修改过滤规则,同时明确匹配IPv4和IPv6下的TCP SYN/FIN包,用逻辑或连接两种场景:
def testing(pkt): if IPv6 in pkt: print(pkt[IPv6].show()) # 同时适配IPv4和IPv6的过滤规则 sniff(filter="(ip and tcp[tcpflags] & (tcp-syn|tcp-fin) != 0) or (ip6 and tcp[tcpflags] & (tcp-syn|tcp-fin) != 0)", iface="eth0", prn=testing)
这条规则会同时捕获两种协议中带有SYN或FIN标志的TCP包,满足你的需求。
内容的提问来源于stack exchange,提问作者Mnemosyne
相关产品推荐
相关产品推荐

