私はscapyを使用してミラーポートを盗聴し、ネットワーク上で最大の帯域幅を使用する上位10の「話し手」リストを生成しています。私はiftopとntopのような既に利用可能なツールについて知っていますが、出力をより詳細に制御する必要があります。scapy、iftop-styleでIPごとの帯域幅使用量を計算します
次のスクリプトは、トラフィックを30秒間サンプリングし、上位10人のトーカーのリストを "source host - > destination host:bytes"の形式で出力します。それは素晴らしいですが、平均を計算するにはバイト/秒?
私は、sample_intervalを1秒に変更すると、トラフィックのサンプリングが適切でないため、平均化する必要があるようです。だから私はスクリプトの最後にこれを試しました:
bytes per second = (total bytes/sample_interval)
しかし、結果のBytes/sはかなり低いようです。たとえば、2つのホスト間でrsyncを1.5 MB/sの速度で生成しましたが、上記の平均計算を使用して、スクリプトはこれらのホスト間の速度を約200 KB/s ... 1.5 MBよりずっと低く計算し続けました/ sのように私は期待しています。私はiftopを使って1.5MB/sが実際にこれらの2つのホスト間の速度であることを確認できます。
scapyでパケットの長さが正しく集計されません(traffic_monitor_callbak機能を参照)。またはこれは完全に貧しい解決策ですか:)?
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)
私は、これは一般的なネットワーキングの質問のプログラミング(scapy/pythonの)質問以上であるので、私はネットワークプログラミングの質問、それを呼んでいるかはわかりません。
はい送信者と受信者のトラフィックについてあなたが正しいと思います。 'iftop'の出力を見ると、2つのホスト間にトラフィックが混在していることがわかります。結果を最後に組み合わせる、つまりタプルを結合するのはどうですか?たとえば、(host1、host2)+(host2、host1)の 'traffic'命令の結果があるとします。 – Banjer
私の答えをちょうど更新しました。これはあなたの質問に完全に答えますか? – Pierre
うわー、素敵なコード。私よりもはるかに効率的で賢い:)。私は、各ホストペアの最終的な合計が、トラフィック方向が組み合わされていても、iftopと並んで比較した場合でも、なぜそれほど低いのか不思議です。 'iftop'は自分の抑制されたrsyncテストに基づいて正しいようです。おそらく、sample_intervalを60秒に設定する必要がありますか?私は 'iftop'がシーンの裏で何をしているのだろうと思っています...それは、私がかなり同じことをしようとしているが、' scapy'をもっているので、最良の例かもしれません。 – Banjer