如何使用 scapy 嗅探功能过滤 ICMPv6 数据包?

How to filter ICMPv6 packets with scapy sniff-function?

我只想捕获 ICMPv6 Echo Request 数据包。我使用使用 BPF 过滤器的 scapy sniff()-函数,与 tcpdump 相同。 我使用的过滤器与 tcpdump 一起使用并且只捕获 ICMPv6 回显请求但是当我在我的 python 脚本中使用它时它根本不起作用并且 scapy 捕获所有数据包。 为什么过滤器在我的脚本中不起作用?

#!/usr/bin/env python
from scapy.all import * 
a = sniff(filter="icmp6 && ip6[40] == 128", count=10)
a.summary()

输出:

Ether / IP / ICMP 192.168.1.74 > 192.168.1.84 echo-request 0 / Raw
Ether / IP / ICMP 192.168.1.84 > 192.168.1.74 echo-reply 0 / Raw
Ether / IPv6 / ICMPv6 Echo Request (id: 0x306 seq: 0x3bb)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x306 seq: 0x3bb)
Ether / IPv6 / ICMPv6 Echo Reply (id: 0x306 seq: 0x3bb)
Ether / IPv6 / ICMPv6 Echo Reply (id: 0x306 seq: 0x3bb)
Ether / IP / TCP 192.168.1.84:ssh > 192.168.1.74:61336 PA / Raw
Ether / IP / TCP 192.168.1.74:61336 > 192.168.1.84:ssh A
Ether / IP / ICMP 192.168.1.74 > 192.168.1.84 echo-request 0 / Raw
Ether / IP / ICMP 192.168.1.84 > 192.168.1.74 echo-reply 0 / Raw

您可能应该指定接口。 Scapy 有时在某些情况下无法应用 BPF 过滤器(包括在 PPP 接口上或同时嗅探多个接口时)。

另一种选择是使用 Python 过滤器而不是 BPF 过滤器。主要缺点是它会影响性能,因为 Scapy 将接收(并解析)接口上看到的所有数据包:

from scapy.all import * 
a = sniff(lfilter=lambda pkt: ICMPv6EchoRequest in pkt, count=10)
a.summary()

我在我的系统上 运行 遇到了一些问题,但事实证明这是我的一个界面上的错误 v6 设置。 scapy-python3 似乎确实更好地处理了这个问题,它只是忽略了我的配置错误并继续执行而不是出错。

在我确定您的代码示例在 python 2.7 和 3.x 上都可以正常工作之后,对我来说没有任何问题。当我手动指定接口和不指定接口时。

Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x190)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x191)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x192)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x193)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x194)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x195)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x196)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x197)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x198)
Ether / IPv6 / ICMPv6 Echo Request (id: 0x5d24 seq: 0x199)

如果您有可能在 python 3.x 中对此进行测试,它可能更适合您,但感觉您的设置中的某些内容已关闭。 我以前从未使用过 scapy 所以我不知道是否例如6to4 隧道会混淆它。

我是运行宁:

Debian testing with kernel 4.11.0-1-amd64
scapy 2.3.3 on Python 2.7.13
scapy-python3 0.21 on Python 3.5.4