【问题标题】:What is the expected packet loss with scapy?scapy 的预期丢包率是多少?
【发布时间】:2016-08-01 13:58:54
【问题描述】:

我想在SystemA 的接口上监听数据包。因为看起来我看不到绝大多数传入的数据包,所以我以最简单的形式使用了scapy

import scapy.all as scapy

def filtre(p):
    if p.haslayer(scapy.IP):
        print(p[scapy.IP].src)

# Disable scapy verbosity
scapy.conf.verb = 0
scapy.sniff(iface="eth0", prn=filtre, store=0)

这是在SystemA 上运行的,并将输出发送到文件中。

同时,我跑

  • tcpdump SystemASystemB
  • nmap SystemA -P0 SystemB

我们的想法是查看在nmap 会话期间有多少数据包离开SystemB 并到达SystemA。结果是

  • 根据两个tcpdump,1000个数据包离开SystemB并到达SystemA
  • 但是只有大约 150 到 200 个数据包SystemB 的源 IP 由scapySystemA 上注册

我做了几个测试,有tcpdump 会话和没有(他们没有改变结果 AFAICT),并通过scapy 获得不同数量的数据包 - 在 150-200 范围内。

这是在 LAN 上,SystemB 是 debian,SystemA 是 RPi3。我可以预期一些数据包没有被注册,但不是 80% 到 90%。同时tcpdump 在两个系统上系统地注册了预期的 1000 个数据包。

我有什么遗漏吗?

编辑:50 个数据包(nmap SystemA -p1-50 -P0)的相同测试很好,scapy 注册了所有 50 个数据包。

【问题讨论】:

    标签: python networking scapy


    【解决方案1】:

    您可能想尝试一些不使用输出的东西(因为这可能是一个瓶颈)。此外,您可以使用 BPF 过滤器,以防线路上有不需要的数据包。此外,由于您不需要剖析 IP 负载,因此可以防止 Scapy 解析整个数据包层。

    from collections import Counter
    import scapy.all as scapy
    
    sources = Counter()
    
    def count_pkts(p):
        global sources
        if scapy.IP in p:
            sources[p[scapy.IP].src] += 1
    
    # Disable scapy verbosity
    scapy.conf.verb = 0
    # Prevent Scapy from dissecting IP payloads
    scapy.IP.payload_guess = []
    # Optionally, use filter="ip and src x.y.z.t"
    scapy.sniff(iface="eth0", prn=count_pkts, store=0, filter="ip")
    print sources
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多