You need to enable JavaScript to run this app. Python3 Scapy嗅探IP分片包仅捕获首个分片的问题定位与解决
优惠活动
大模型
产品
解决方案
定价
更多

Python3 Scapy嗅探IP分片包仅捕获首个分片的问题定位与解决

核心问题根源

你当前抓不到后续IP分片的核心原因,是BPF过滤规则的匹配逻辑天然会漏抓非首个IP分片,和Scapy本身的嗅探能力、session参数配置完全无关。

IP分片的结构决定了,只有第一个分片会携带完整的UDP头部(包含源/目的端口字段),所有后续分片的IP头部之后直接承载原始UDP载荷的分段,不存在UDP头部结构,自然也就没有可匹配的dst port 1337字段值。
你当前使用的过滤规则ip dst host 192.168.183.130 and dst port 1337,在内核BPF层做匹配时,遇到非首个IP分片,会尝试提取传输层目的端口值做规则校验,由于包内不存在可解析的UDP头部,无法匹配到1337的端口值,这类包会直接被内核过滤逻辑丢弃,根本不会传递到Scapy的用户态嗅探流程中。

这也是为什么你之前尝试调整session=IPSession没有效果:IPSession是Scapy在用户态实现分片重组的逻辑,生效前提是所有分片已经通过内核过滤、进入Scapy的回调流程,在包还没到Scapy手里的情况下,任何用户态的session配置都无法抓到被内核拦截的包。

关于Wireshark捕获效果的说明

Wireshark和Scapy使用的是完全相同的内核BPF抓包框架,不存在抓包能力的差异。你之前观察到Wireshark能完整展示3个分片,本质是因为Wireshark的捕获过滤和显示过滤是两套独立逻辑:

  • 你在Wireshark捕获阶段大概率没有启用带端口匹配的过滤规则,是直接抓所有目的为192.168.183.130的IP包,所以所有分片都被捕获到了用户态;
  • 后续Wireshark在显示阶段,通过IP头的ID、源目IP信息关联同一条流的所有分片,做结构化展示而已。
    如果Wireshark在捕获阶段设置和你Scapy完全一样的dst port 1337捕获规则,一样会漏抓所有非首个IP分片,这是BPF框架的通用设计行为,不是工具的bug。
可直接落地的修正方案

你不需要使用分片重组功能,只需要调整BPF过滤规则,兼容无传输层头的分片包匹配即可,修正后的完整代码如下:

from scapy.all import sniff, IP, UDP

def print_package(packet):
    # 可以在这个回调里做二次精准筛选,过滤掉其他流的无关分片
    packet.show()

# 兼容分片捕获的BPF规则
bpf_filter = "ip dst host 192.168.183.130 and ((udp and dst port 1337) or (ip[6:2] & 0x1fff != 0))"

sniff(filter=bpf_filter, iface="ens33", prn=print_package)

上述规则的匹配逻辑拆解:

  • 保留原有目的IP过滤的范围,减少不必要的包捕获开销
  • 第一类匹配项(udp and dst port 1337):覆盖所有非分片的普通UDP包、携带完整UDP头的第一个IP分片
  • 第二类匹配项(ip[6:2] & 0x1fff != 0):直接解析IP头从偏移6位置开始的2字节字段,通过按位与运算屏蔽3位标志位,提取纯片偏移值,匹配所有片偏移不为0的非首个分片。这类包没有UDP头,不会被之前的端口匹配逻辑命中,但会被这个条件完整捕获。
补充优化建议
  • 上述过滤规则会把所有目的为192.168.183.130、片偏移不为0的分片都纳入捕获范围,如果你需要更精准只保留属于1337端口流的分片,可以在print_package回调函数中做二次校验:根据IP头的ID、源IP、目的IP、协议号字段,匹配之前抓到的第一个分片的流标识信息,过滤掉其他流的无关分片即可。
  • 不需要为了抓分片开启Scapy的任何分片重组session参数,这类配置只会增加额外的内存开销,不会影响基础的包捕获能力,完全和你修改分片、转发流量的核心需求不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 03:54:01