You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个pcap文件找出防火墙丢弃的数据包?

防火墙规则验证:自动化对比PCAP文件找出丢弃数据包

用Scapy实现(完全贴合需求,保留PCAP格式处理)

你已经在使用Scapy生成测试包,用它直接实现对比是最优解。核心逻辑是:提取测试包与捕获包的唯一标识,找出预期存在但实际未捕获到的数据包,这类包就是被防火墙丢弃的;同时可反向验证规则是否生效(比如预期拒绝的包是否确实未出现)。

示例代码

from scapy.all import rdpcap, wrpcap

def get_packet_unique_key(pkt):
    # 生成数据包唯一标识,覆盖TCP/UDP/ICMP主流协议
    if not pkt.haslayer('IP'):
        return None
    src_ip = pkt['IP'].src
    dst_ip = pkt['IP'].dst
    proto = pkt['IP'].proto
    
    if proto == 6:  # TCP
        return (src_ip, dst_ip, proto, pkt['TCP'].sport, pkt['TCP'].dport)
    elif proto == 17:  # UDP
        return (src_ip, dst_ip, proto, pkt['UDP'].sport, pkt['UDP'].dport)
    elif proto == 1:  # ICMP
        return (src_ip, dst_ip, proto, pkt['ICMP'].type, pkt['ICMP'].code)
    # 其他协议可按需扩展
    return None

# 加载两个PCAP文件
expected_pkts = rdpcap("expected_test_rules.pcap")
captured_pkts = rdpcap("inbound_traffic_captured.pcap")

# 提取标识集合
expected_keys = set(get_packet_unique_key(p) for p in expected_pkts if get_packet_unique_key(p))
captured_keys = set(get_packet_unique_key(p) for p in captured_pkts if get_packet_unique_key(p))

# 找出被丢弃的数据包标识及具体包
dropped_keys = expected_keys - captured_keys
dropped_pkts = [p for p in expected_pkts if get_packet_unique_key(p) in dropped_keys]

# 输出结果并保存被丢弃的数据包为PCAP(保留格式)
print(f"共检测到{len(dropped_pkts)}个被防火墙丢弃的数据包")
wrpcap("dropped_packets.pcap", dropped_pkts)

Wireshark/tshark辅助实现

Wireshark无原生PCAP对比功能,但可通过tshark导出特征后对比:

  1. 导出预期PCAP的关键字段到CSV:
    tshark -r expected_test_rules.pcap -T fields -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e udp.srcport -e udp.dstport -e icmp.type -e icmp.code -E separator=, > expected.csv
    
  2. 导出捕获PCAP的字段到CSV:
    tshark -r inbound_traffic_captured.pcap -T fields -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e udp.srcport -e udp.dstport -e icmp.type -e icmp.code -E separator=, > captured.csv
    
  3. 用Python/shell脚本对比两个CSV,找出预期存在但捕获中缺失的条目,对应被丢弃的数据包。

其他替代方案

如果pcap-diff和Wirediff未满足需求,可尝试:

  • tcpreplay + 捕获重放:用tcpreplay将预期PCAP重放到防火墙入口,同时捕获防火墙出口流量,再用上述Scapy脚本对比重放包与捕获包,排除原捕获的干扰因素。
  • Suricata规则匹配:编写简单规则匹配所有预期允许的数据包,用Suricata分析捕获PCAP,统计未被匹配到的规则对应的数据包,即为被丢弃的包。

内容的提问来源于stack exchange,提问作者Payflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:13:24