2016-08-01 2 views
1

Ich möchte Pakete auf einer Schnittstelle von SystemA hören. Da es, wie ich die große Mehrheit der eingehenden Pakete nicht sehen, sieht, habe ich scapy in seiner einfachsten Form:Was ist der erwartete Paketverlust mit 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) 

Dieses auf SystemA mit der Ausgabe in eine Datei gesendet lief wird.

Zur gleichen Zeit, ich laufe

  • tcpdump auf SystemA und SystemB
  • nmap SystemA -P0 auf SystemB

Die Idee ist, zu sehen, wie viele Pakete während der nmap Sitzung SystemB verlassen und erreichen SystemA. Die Ergebnisse

sind
  • nach den beiden tcpdump, 1000 Pakete links SystemB und erreichte SystemA
  • aber es gab nur etwa 150 bis 200 Pakete mit der Quell-IP von SystemB registriert durch scapy auf SystemA

Ich habe mehrere Tests mit den tcpdump Sitzungen und ohne (sie haben das Ergebnis AFAICT nicht geändert), und erhalten eine variierende Anzahl von Paketen über scapy - im Bereich 150-200.

Dies ist in einem LAN, SystemB ist ein debian, SystemA ein RPi3. Ich könnte erwarten, dass ein Paket nicht registriert wird, aber nicht 80 bis 90%. Zur gleichen Zeit registriert tcpdump systematisch die erwarteten 1000 Pakete auf beiden Systemen.

Gibt es etwas, das mir fehlt?

EDIT: der gleiche Test mit 50 Paketen (nmap SystemA -p1-50 -P0) ist in Ordnung, scapy registriert alle 50 Pakete.

Antwort

0

Sie möchten vielleicht etwas versuchen, das die Ausgabe nicht verwendet (da dies ein Engpass sein kann). Sie können auch einen BPF-Filter verwenden, wenn Sie unerwünschte Pakete auf dem Kabel haben. Da Sie die IP-Nutzdaten nicht sezieren müssen, können Sie außerdem verhindern, dass Scapy die gesamten Paket-Layer analysiert.

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