Berechnen Bandbreite pro IP mit scapy, iftop-Stil

Ich bin mit scapy zu schnuppern ein mirror-port und generiert eine Liste der top 10 "der Sprecher", D. H. eine Liste der hosts mit den meisten Bandbreite in meinem Netzwerk. Ich bin mir bewusst von bereits vorhandenen Instrumenten wie iftop und ntop, aber ich brauche mehr Kontrolle über die Ausgabe.

Folgende Skript-Beispiele-Verkehr für 30 Sekunden und dann druckt eine Liste der top 10-talkers im format "Quell-host -> Ziel-host: Byte". Das ist großartig, aber wie kann ich berechnen Sie die Durchschnittliche bytes pro Sekunde?

Ich hatte das Gefühl, dass eine änderung sample_interval bis zu 1 Sekunde nicht für ein gutes sampling-Verkehr, so es scheint, ich muss den Durchschnitt aus. So habe ich versucht, diese am Ende des scripts:

bytes pro Sekunde = (Gesamtanzahl bytes /sample_interval)

aber die resultierenden Bytes/s scheint viel niedriger. Ich zum Beispiel erzeugt ein rsync zwischen zwei hosts, die auf eine gedrosselte rate von 1.5 MB/s, aber mit dem oben genannten Durchschnitt Berechnung, mein Skript gehalten die Berechnung der rate zwischen diesen hosts so um die 200 KB/s...viel niedriger als 1,5 MB/s als ich erwarten würde. Kann ich bestätigen mit iftop, dass 1,5 MB/s ist in der Tat die rate zwischen diesen beiden hosts.

Bin ich insgesamt bis Paketgrößen falsch mit scapy (siehe traffic_monitor_callbak-Funktion)? Oder ist das eine schlechte Lösung zusammen :)?

from scapy.all import *
from collections import defaultdict
import socket
from pprint import pprint
from operator import itemgetter

sample_interval = 30  # how long to capture traffic, in seconds

# initialize traffic dict
traffic = defaultdict(list)

# return human readable units given bytes
def human(num):
    for x in ['bytes','KB','MB','GB','TB']:
        if num < 1024.0:
            return "%3.1f %s" % (num, x)
        num /= 1024.0

# callback function to process each packet
# get total packets for each source->destination combo
def traffic_monitor_callbak(pkt):
    if IP in pkt:
        src = pkt.sprintf("%IP.src%")
        dst = pkt.sprintf("%IP.dst%")

        size = pkt.sprintf("%IP.len%")

        # initialize
        if (src, dst) not in traffic:
            traffic[(src, dst)] = 0

        else:
            traffic[(src, dst)] += int(size)

sniff(iface="eth1", prn=traffic_monitor_callbak, store=0, timeout=sample_interval)

# sort by total bytes, descending
traffic_sorted = sorted(traffic.iteritems(), key=itemgetter(1), reverse=True)    

# print top 10 talkers
for x in range(0, 10):
    src = traffic_sorted[x][0][0]
    dst = traffic_sorted[x][0][1]
    host_total = traffic_sorted[x][3]

    # get hostname from IP
    try:
        src_hostname = socket.gethostbyaddr(src)
    except:
        src_hostname = src

    try:    
        dst_hostname = socket.gethostbyaddr(dst)
    except:
        dst_hostname = dst


    print "%s: %s (%s) -> %s (%s)" % (human(host_total), src_hostname[0], src, dst_hostname[0], dst)

Ich bin mir nicht sicher, ob dies ist eine Programmier - (scapy/python) Frage oder mehr eine Allgemeine Netzwerk-Frage, also nenne ich es die ein Netzwerk-Programmierung in Frage.

InformationsquelleAutor Banjer | 2014-01-13
Schreibe einen Kommentar