代码之家  ›  专栏  ›  技术社区  ›  Markus Klock

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

  •  1
  • Markus Klock  · 技术社区  · 8 年前

    我只想捕获ICMPv6 Echo请求数据包。我使用scapy sniff()-函数,该函数使用BPF过滤器,与tcpdump相同。 为什么过滤器在我的脚本中不起作用?

    #!/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
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   yosh    8 年前

    在我的系统上运行这个时,我遇到了一些问题,但结果是我的一个界面上的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)
    

    我以前从未使用过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
    
        2
  •  1
  •   Pierre    8 年前

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

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