使用Python按指定IP过滤PCAP文件中TCP数据包的问题咨询
可行解决方案
核心问题说明
你之前尝试的代码存在2个核心问题,且sniff过滤方案在Windows下需要额外依赖,我们直接用纯Scapy原生逻辑实现过滤,无需安装WinDump/WinPcap额外组件:
- IP源/目的地址是IP层的属性,不是TCP层的属性,你之前从
pkt[TCP]读取IP字段的写法本身就有问题,正确属性为pkt[IP].src、pkt[IP].dst - 数GB级PCAP不要用
rdpcap一次性读取全量数据包到内存,会直接占满系统内存导致运行失败,改用PcapReader逐包迭代读取即可,内存占用稳定在MB级
完整可运行代码
from scapy.all import PcapReader, wrpcap from scapy.layers.inet import IP, TCP target_ip = "11.22.33.44" input_pcap = "C:\\temp\\test.pcap" output_pcap = "C:\\temp\\filtered.pcap" filtered_pkts = [] # 逐包迭代读取大PCAP,不占用过多内存 with PcapReader(input_pcap) as reader: for pkt in reader: # 先判断数据包是否同时存在IP层和TCP层,避免取值报错 if IP in pkt and TCP in pkt: # 判断源IP或目的IP匹配目标地址 if pkt[IP].src == target_ip or pkt[IP].dst == target_ip: filtered_pkts.append(pkt) # 写入过滤后的数据包 wrpcap(output_pcap, filtered_pkts)
超大型PCAP优化方案
如果过滤后的数据包总量也超过内存承载上限,可以改为逐包写入,完全不需要缓存全量过滤结果:
from scapy.all import PcapReader, PcapWriter from scapy.layers.inet import IP, TCP target_ip = "11.22.33.44" input_pcap = "C:\\temp\\test.pcap" output_pcap = "C:\\temp\\filtered.pcap" with PcapReader(input_pcap) as reader, PcapWriter(output_pcap, append=True, sync=True) as writer: for pkt in reader: if IP in pkt and TCP in pkt: if pkt[IP].src == target_ip or pkt[IP].dst == target_ip: writer.write(pkt)
内容的提问来源于stack exchange,提问作者Alex Cart
相关产品推荐
相关产品推荐

